1.什么是SQL注入
SQL注入攻击是目前web应用网络攻击的最常见手段之一,其攻击方法为,用户在可能需要访问数据库的网页api上,输入恶意sql代码,植入数据库。sql注入攻击范围广、容易实现、破坏性大。
<?p select * from users where username = ‘${username}’ and password = ‘${password}’ ?>
以上php代码是常见的用户登录所使用的数据库查询代码,假设username和password是用户输入框,不难发现可以构造以下payload:
username= x' or 1 = 1#
select * from users where username = ‘root’ and password = ‘12345’ //正常代码
select * from users where username = ‘x' or 1 = 1#’ and password = ‘${password}’ //恶意代码
可以看出,构造的payload能够闭合单引号,且注释了后面的SQL代码。
2.SQL注入的危害
目前,大多数Web编程语言提供了操作SQL的接口,以方便与数据库进行交互。但是在开发Web应用的过程中,由于忽视了代码的健壮性和安全性,攻击者可以构造巧妙的SQL语句从而获取到敏感数据,因此导致了SQL这种攻击方式的流行。
SQL注入可以盗取数据库信息,获取用户敏感信息,更改用户数据。通过一些提权操作,安装后门,对用户进行远程操控。
3.常见SQL注入手段
1.联合查询
前提要求:数据会进行回显,页面有显位符,在一个在一个网站的正常页面,服务端执行SQL语句查询数据库中的数据,客户端将数据展示在页面中,这个展示数据的位置就叫显示位。
select * from user order by ?
上述代码用来判断回显位,假设存在3个回显位。
select * from user union select 1,2,3
则1,2,3会显示在对应位置。
2.报错注入
SQL报错注入就是利用数据库的某些机制,人为地制造错误条件,使得查询结果能够出现在错误信息中。这种手段在联合查询受限且能返回错误信息的情况下比较好用,目前对于各种不同类型数据库,不同版本数据库报错注入时可能并不能通用,常用可以通用的报错注入的方式有两种,xpath注入和主键重复导致的报错。
利用xpath语法错误来进行报错注入主要利用extractvalue
和updatexml
两个函数。
extractvalue
函数
-
函数用法:
extractvalue(xml_document,Xpath_string)
-
第一个参数:xml_document是string格式,为xml文档对象的名称
-
第二个参数:Xpath_string是xpath格式的字符串
-
作用:从目标xml中返回包含所查询值的字符串
pyload:id='and(select extractvalue("anything",concat('~',(select语句))))
updatexml
函数
-
函数用法:
updatexml(xml_document,xpath_string,new_value)
-
第一个参数:xml_document是string格式,为xml文档对象的名称
-
第二个参数:Xpath_string是xpath格式的字符串
-
第三个参数:new_value是string格式,替换查找到的负荷条件的数据
-
作用:改变文档中符合条件的节点的值
payload:id='and(select updatexml("anything",concat('~',(select语句())),"anything"))
3.布尔盲注
当网页没有回显信息时,也不存在报错信息时,可以利用length和substr函数进行盲注。
' and (length(databse())=a) --+
可以根据返回包的网页大小判断数据库名的字符长度是否为a。
' and (substr(select databse(),a,1))=b --+
可以根据返回包的网页大小依次判断数据库名a位置的字符是否等于b。
4.时间盲注
当网页没有回显信息时,也不存在报错信息时,且返回网页字节数也相同,可以采用sleep函数。
' and if(length(select database() > 1 ,1 ,sleep(5)) --+
如果回显时间小于1,则数据库名长度大于1,长度猜测完,再依次猜测对应字符。
5.宽字节注入
当编码格式为GBK时,中文字符占两字节,正常输入单引号会被转移,此时可以拼接一个特殊中文字符的GBK编码,使该中文字符的前半段和前一个编码拼接,后半段为单引号的编码被截断,转义为单引号,造成注入。
6.堆叠注入
堆叠注入需要数据库后台允许多条SQL语句同时执行,多语句之间以;隔开。利用这个特点可以在后面的语句中构造自己要执行的语句。
4.SQL注入常见防御
-
使用转义函数等安全函数
-
预编译语句,绑定变量,攻击者无法改变SQL的结构
-
检查数据类型
-
提升代码安全逻辑