SQL注入基本原理
1.什么是SQL注入攻击
SQL注入攻击通过构建特殊的输入作为参数传入web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,它目前是黑客对数据库进行攻击的最常用手段之一。
2.Web程序三层架构
界面层:访问/呈现HTML内容
业务逻辑层:加载,编译并执行index.php(采用PHP JSP ASP .NET等)
数据访问层:执行SQL语句(MySQL Oracle MSSQL等)
3.SQL注入产生原因及威胁
访问动态网页时,web服务器会向数据访问层发起SQL查询请求,如果权限验证通过会执行SQL语句,这种网站内部直接发送的sql请求一般不会有危险,但实际情况下,很多时候需要结合用户的输入数据动态构造sql语句,如果用户输入的数据被构造成恶意SQL代码,web应用又未对动态构造的 sql语句使用的参数进行审查,则会带来意想不到的危险。
-
猜解后台数据库,这是利用最多的方式,盗取网站的敏感信息
-
绕过验证,例如绕过验证直接登录网站后台
-
注入可以借助数据库的存储过程进行提权等操作
4.判断SQL注入点
4.1判断是否存在SQL注入漏洞
通常情况下,可能存在SQL注入漏洞的url是这种形势:http://xxx.xxx.xxx.xxx/abcd.php?id=xx 对SQL注入的判断,主要有两个方面:
-
判断带参数的URL是否存在SQL注入?
-
如果存在SQL注入,那么属于哪种SQL注入?
可能存在SQL注入的asp/php/jsp动态网页中,一个动态网页中可能只有一个参数,可能有多个参数,有时是整型参数,有时是字符串型参数,不能一概而论。总之只要是带有参数的,那么就标识动态网页访问了数据库,那么有可能存在SQL注入,如果程序员没有足够的安全意识,没有进行必要的字符过滤,存在SQL注入的可能性就更大。
经典的单引号判断法:在参数后面加上单引号:
http://xxx/abc.php?id=1'
如果页面返回错误,则存在SQL注入,原因是无论字符型还是整型都会因为单引号个数不匹配而报错。如果未报错,并不代表不存在SQL注入,也可能是对单引号做了过滤,这是可以在使用判断语句进行注入。
2.判断SQL注入漏洞的类型
通常分为两个类型:数字型和字符型
所有的类型都是根据数据库本身表的类型所产生的,在我们创建表的时候会发现其后总有个数据类型的限制,而不同的数据库又有不同的数据类型,但是无论怎么分常用的查询数据类型总是以数字与字符来区分的,所以就会产生注入点为何种类型。
4.2.1 数字型判断
当输入的参数x为整型时,通常abc.php中sql语句类型如下:select * from<表名>where id =x这种类型可以使用经典的and1=1和1=2来判断
Url 地址中输入 http://xxx/abc.php?id= x and 1=1 页面依旧运行正常,继续进行下一步。
Url 地址中继续输入 http://xxx/abc.php?id= x and 1=2 页面运行错误,则说明此 Sql 注入为数字型注入。
原因如下: 当输入 and 1=1时,后台执行 Sql 语句:
select * from <表名> where id = x and 1=1
没有语法错误且逻辑判断正确,所以返回正常。
当输入1=2时,后台执行SQL语句:
select * from <表名> where id = x and 1=2
没有语法错误但是逻辑判断为假,所以返回错误。 我们再使用假设法:如果这是字符型注入的话,我们输入以上语句之后应该出现如下情况:
select * from <表名> where id = 'x and 1=1'
select * from <表名> where id = 'x and 1=2'
查询语句将and语句全部转换成字符串,并没有进行and的逻辑判断,所以不会出现以上结果,所以假设不会成立。
4.2.2 字符型判断
当输入的参 x 为字符型时,通常 abc.php 中 SQL 语句类型大致如下: select * from <表名> where id = ‘x’ 这种类型我们同样可以使用 and ‘1’=’1 和 and ‘1’=’2来判断:
Url 地址中输入 http://xxx/abc.php?id= x’ and ‘1’=’1 页面运行正常,继续进行下一步。
Url 地址中继续输入 http://xxx/abc.php?id= x’ and ‘1’=’2 页面运行错误,则说明此 Sql 注入为字符型注入。
原因如下: 当输入 and ‘1’=’1时,后台执行 Sql 语句:
select * from <表名> where id = 'x' and '1'='1'
语法正确,逻辑判断正确,所以返回正确。
当输入 and ‘1’=’2时,后台执行 Sql 语句:
select * from <表名> where id = 'x' and '1'='2'
语法正确,但逻辑判断错误,所以返回正确。同学们同样可以使用假设法来验证。

浙公网安备 33010602011771号