SQL注入简介

SQL注入是web程序对用户输入数据的合法性没有进行判断,在管理员不知情的情况下进行非法操作。攻击者可以通过提交数据库查询代码,通过程序返回的结果,获取数据库中的信息。SQL注入攻击会导致数据库风险,其中包括刷库、脱裤、撞库。它是目前最危险的Web应用程序漏洞之一。

SQL注入漏洞产生的原因是网站应用程序在编写时未对用户提交至服务器的数据进行合法性校验,即没有进行有效地特殊字符过滤,导致网站服务器存在安全风险

漏洞危害:机密数据被窃取;核心业务数据被篡改;网页被篡改;数据库所在服务器被攻击从而变为傀儡主机,导致局域网(内网)被入侵。

修复建议

在网页代码中对用户输入的数据进行严格过滤;(代码层)

部署Web应用防火墙;(设备层)

对数据库操作进行监控。(数据库层)

代码层最佳防御sql漏洞方案

采用sql语句预编译和绑定变量,是防御sql注入的最佳方法。

原因

采用了,就会将sql语句: ” id, no from user where id=?” 预先编译好,也就是SQL引擎会预先进行语法分析,产生语法树,生成执行计划,也就是说,后面你输入的参数,无论你输入的是什么,都不会影响该sql语句的 语法结构了,因为语法分析已经完成了,而语法分析主要是分析 sql命令 ,比如 ,from ,where ,and, or ,order by 等等。所以即使你后面输入了这些 sql命令 ,也不会被当成 sql命令 来执行了,因为这些 sql命令 的执行, 必须先的通过语法分析,生成执行计划,既然语法分析已经完成,已经预编译过了,那么后面输入的参数,是绝对不可能作为 sql命令 来执行的,只会被当做字符串字面值参数,所以sql语句预编译可以防御sql注入。

实战:

命令使用方法_sqlmap使用命令_命令使用范围

sqlmap使用命令_命令使用方法_命令使用范围

后台界面,最简单的方式就是在登陆后台页面

sqlmap使用命令_命令使用方法_命令使用范围

直接进行注入,系统用户,用户名可直接测试admin,一般系统管理员最常见的用户名就是admin,在添加用户名的地方输入1’,用bp抓包查看返回的参数

惊喜的发现成功报错并没有过滤掉,返回的信息是输入的SQL语法错误。这里存在注入,下面直接把抓取到的post包进行复制,存放在123.txt里。接下来直接用进行跑,爆出如下数据库。

命令使用范围_命令使用方法_sqlmap使用命令

接下来选择数据库进行爆表,常见的工具为,当然还有别的工具可以使用,但是个人建议

学习的时候还是以手动注入为主要手段,工具进行辅助。

命令使用范围_sqlmap使用命令_命令使用方法

可以直接跑出相关数据库以及相关数据,那么sql注入到底是如何完成这些操作的呢,让我们来详细解释一下sql注入的核心原理。

比如我们使用的登录接口:在登录界面包括用户名和密码输入框,以及提交按钮,输入用户名和密码,提交。

登录时调用接口/user/login/ 加上参数、,首先连接数据库,然后后台对请求参数中携带的用户名、密码进行参数校验,即sql的查询过程。假设正确的用户名和密码为ls和,输入正确的用户名和密码、提交,相当于调用了以下的SQL语句。

* FROM user WHERE = ‘ls’ AND = ”

sql中会将#及–以后的字符串当做注释处理,如果我们使用“’ or 1=1 #” 作为用户名参数,那么服务端构建的sql语句就如下:

* from users where =” or 1=1#’ and =”

而#会忽略后面的语句,因此上面的sql也等价于:

* from users where =” or 1=1复制代码

而1=1属于常等型条件,因此这个sql便成为了如下,查询出所有的登陆用户。

* from users

其实上面的sql注入只是在参数层面做了些手脚,如果是引入了一些功能性的sql那就更危险了,比如上面的登陆接口,如果用户名使用这个“’ or 1=1; * from users; #”,那么在”;”之后相当于是另外一条新的sql,这个sql是删除全表,是非常危险的操作,因此 如果一个系统存在sql注入,那即可通过sql查询这个系统里面的任何数据,当然也可以修改任何数据,这对于一个系统是非常不安全的。

当然这只是最简单的sql注入实例,大部分的时候,简单的sql注入很有可能被转换掉或者被过滤。下一期介绍sql注入绕过和伪装

加入IP合伙人(站长加盟) | 全面包装你的品牌,搭建一个全自动交付的网赚资源独立站 | 晴天实测8个月运营已稳定月入3W+
限时特惠:本站每日持续更新海量内部创业教程,一年会员只需98元,全站资源免费无限制下载点击查看会员权益

站长微信: qtw123cn

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注