2. 表示多个值的时候,情况就不同了。当 IN 命令中有多个值的时候可以很好的防御 SQL 注入
攻击,而第二个语句则还是出现漏洞。假如$vulnerable_id = “578 and order by 7”
虽然包含 IN 字符的语句没有对 SQL 注入做真正的防御,但是在实际中还是提供了很好
的保护。从 SQL 注入观点看,这就是权限在获取数据库数据中所起的重要作用。
下面获取数据库的版本:
很多时候我们通过这些语句就可以在返回的页面里得到相应的数据,但是有时候返回的
是服务器端处理后的错误信息。
如果出现这样的错误往往就会阻止继续注入。出现这种情况主要有几方面因素:
服务器可能有 web 防火墙或者入侵检测系统;
查询可能绕过了 web 防火墙,但是服务器端的 php 程序处理出错。
通常 Web 防火墙会检测并阻止网址中的”+”符号,这时候可以通过”/**/”绕过。
缓冲区的选择和溢出
首先需要确定 web 程序对一组随机的数据的反应,加入输入下面的语句:
3. 错误显示了我们提交的注入语句同时给了很好的相应。仔细分析下 SQL 注入语句,整个
语句可以被分为两个部分:
Y 作为 SQL 注入语句,被显示到了出错页面中。但是我们不需要 web 程序仅仅把提交语
句返回,而是希望在 web 程序中执行该语句并返回数据。
这个地方我们做了一个条件查询,这个查询永远是正确的:
为了达到目的,我们引入另外的字符 Z 作为测试,并改变注入语句,改为:X=Z.Y
这样的话变量 Z 相当于对 SQL 注入语句的填充,同时我们也不知道变量的长度,通过改
变 Z 的长度来测试(以 8 的倍数作为测试,32,64,128,256,512,1024),得到如下的
结果:
4. 在上面的语句中 X 没有使用 16 进制的符号(即前面没有加 0x) 因为我们想通过模糊测
,
试的方法确定列名(注:可以从返回结果看到 BBB*没有在表 field list 里面,通过这种方法
来暴力测试) 。变量 X 依据变量 Z 的结果作为条件进行判定(注:根据语句可以发现 SQL 语
句中需要 A 的结果与 Z 的结果进行判定) 。这样的话可以结合 order by 命令实现对全部列名
的暴力破解。 事实上,变量 X 在这里作为列名, 其值并不是很重要, 这里选择的是 column 1。
通过测试 Z 变量的长度,构造了最终的语句:
构造的 SQL 语句成功执行,得到了相关数据。
通过这些语句的执行,获取了数据库中的用户名和密码。究其原因是由于程序没有对条
件语句中的长度进行检测,最终导致了执行恶意的 SQL 语句。
测试版本:
MySql community edition version 5.0.92
关于其他绕过防火墙的语句如下,主要用于条件检测方面的溢出问题。
此外,XML 中基于 extractvalue()函数并如果没有使用 union 调用的应用,也可以跟这类
溢出技术结合起来, 这个函数只工作在 MySQL version > 5.1 的环境中, 它是以 XPATH 方式执
行语句的。
3、 总结
文章通过前面的阐述,实现了对 SQL 注入防御的一种绕过,这种先进的技术可以把注入
技术发挥更好。结合多种技术可以把攻击方式做的很好, 通过这些知识也可以设计更加强健
的系统。