Extending SQL Injection Attacks Using Buffer Overflows –Tactical Exploitation 基于缓冲区溢出的扩展SQL注入攻击----技术利用 (意译:by youstar) 1、 SQL注入攻击的危害 可以获取数据库中的相关数据; 通过SQL注入将恶意代码插入数据库中,并永久保留和传播。 一个实例:http://secniche.blogspot.com/2011/04/sqlxssi-persistent-malware-base.html 本文目的:通过研究新的技术去绕过现有的安全保护机制。在不安全的函数中采用缓冲区溢出继续SQL注入攻击。 2、 相关基础知识 检测存在漏洞的网址 一般采用的方法是通过在网址后面加入特殊字符(’;--)字符会被编码为%27,观察网页是否出错,然后判定是否有漏洞。 查找列的数目 通过order命令实现: 判定PHP 应用程序的权限 PHP中变量和方法的权限表明了该变量可以干什么事。通常有三种权限(public、protected 或 private),PHP中方法默认是public权限,可以在程序中任意地方被访问。Protected可以被子类访问,private只能被自身类访问。从注入的角度出发可以分为以下两种方式。 当$vulnerable_id表示一个字符值的时候,这两种方式是相同的。但是当$vulnerable_id表示多个值的时候,情况就不同了。当IN命令中有多个值的时候可以很好的防御SQL注入攻击,而第二个语句则还是出现漏洞。假如$vulnerable_id = “578 and order by 7” 虽然包含IN字符的语句没有对SQL注入做真正的防御,但是在实际中还是提供了很好的保护。从SQL注入观点看,这就是权限在获取数据库数据中所起的重要作用。 下面获取数据库的版本: 很多时候我们通过这些语句就可以在返回的页面里得到相应的数据,但是有时候返回的是服务器端处理后的错误信息。 如果出现这样的错误往往就会阻止继续注入。出现这种情况主要有几方面因素: 服务器可能有web防火墙或者入侵检测系统; 查询可能绕过了web防火墙,但是服务器端的php程序处理出错。 通常Web防火墙会检测并阻止网址中的”+”符号,这时候可以通过”/**/”绕过。 缓冲区的选择和溢出 首先需要确定web程序对一组随机的数据的反应,加入输入下面的语句: 错误显示了我们提交的注入语句同时给了很好的相应。仔细分析下SQL注入语句,整个语句可以被分为两个部分: Y作为SQL注入语句,被显示到了出错页面中。但是我们不需要web程序仅仅把提交语句返回,而是希望在web程序中执行该语句并返回数据。 这个地方我们做了一个条件查询,这个查询永远是正确的: 为了达到目的,我们引入另外的字符Z作为测试,并改变注入语句,改为:X=Z.Y 这样的话变量Z相当于对SQL注入语句的填充,同时我们也不知道变量的长度,通过改变Z的长度来测试(以8的倍数作为测试,32,64,128,256,512,1024),得到如下的结果: 在上面的语句中X没有使用16进制的符号(即前面没有加0x),因为我们想通过模糊测试的方法确定列名(注:可以从返回结果看到BBB*没有在表field list里面,通过这种方法来暴力测试)。变量X依据变量Z的结果作为条件进行判定(注:根据语句可以发现SQL语句中需要A的结果与Z的结果进行判定)。这样的话可以结合order by 命令实现对全部列名的暴力破解。事实上,变量X在这里作为列名,其值并不是很重要,这里选择的是column 1。通过测试Z变量的长度,构造了最终的语句: 构造的SQL语句成功执行,得到了相关数据。 通过这些语句的执行,获取了数据库中的用户名和密码。究其原因是由于程序没有对条件语句中的长度进行检测,最终导致了执行