对于注入而言错误提示是极其重要所谓错误提示是指和正确页面不同的结果反馈高手是很重视这个一点的这对于注入点的精准判断至关重要本问讨论下关于几类错误和他产生的原理希望对读者有所帮助
错误提示主要有逻辑错误和语法错误以及脚本运行错误三类
一逻辑错误
简单的例子是= =这两个=与=页面不同的原理是什么?以$sql = “select * from news where id=$_GET[id]”为例
select * from news where id= and =产生的结果集为NULL然后程序取值得时候就会去出空值无法显示当然有的程序发现SQL执行结果集为空就立即跳转效果就不显鸟值得注意的是有的如Oracle Postgresql的数据库在结果集为空情况下会再页面上表现字符型null字样这算是个特点如果使用or条件比如
lian素材 wwwliancom
select * from news where id= or =
和and =得结果正好相反他的结果集十分庞大如果SQL语句如此再加上程序是循环读取结果集(一些编程上的陋习)那么会取出所有结果结果可能运行很慢在数据量巨大的oracle上容易出现这个例子会出现什么呢一般程序取出结果集中的第一条结果那么很可能已经不是id=的那条新闻了这就是由些小菜奇怪有时候or =页面会发生变化的原因
归根到底都是结果集不同造成的灵活掌握是关键这并非单纯的经验问题
二语法错误
语法错误时比较熟悉的比如对于SQL ServerPgSQLSybase的注入错误提示都很重要因为利用它的特性来获取信息很快速语法错误造成的结果可能是SQL错误而中断脚本执行但是脚本或服务器设置屏蔽错误的情况下程序得到继续执行但是结果集不存在连NULL都算不上反馈给攻击者的很可能就是结果集为空的情况其实这是脚本的处理结果当然Oracle PgSQL表现null
三运行错误不用说了典型的就是利用mysql注入benchmark让脚本运行超时得到物理路径以及利用超时来获得不同的表征进行盲注入
四逻辑错误和语法错误的结合
当表征极不明显的时候利用类似iff这样的函数进行正确与否的区分有时候会成救命稻草因为语法错误和逻辑错误的表征大多数情况都会有不同
iff(=‘no’)这个会产生结果 注意是数字而iff(=‘no’)这个会产生‘no’ 是字符那么
id= and =iff(=‘no’)正确是必然成立的而id= and =iff(=‘no’)会因为类型不同发生语法错误不过可惜的是似乎支持iff函数的数据库不多呵呵
现在讲结果集在注入中的利用原理
一从‘or’‘=’开始
这是学习SQL注入的初级课程登陆漏洞我简略从SQL结果集上分析
$sql = “select top * from admin where username=‘$username’ and password=md(‘$password’)”;
显而易见‘or’‘=’的加入使SQL语句返回了一条记录这才使验证通过
二再看现在的验证中的SQL
$sql = “select top * from admin where username=‘$username’”;
结果集不为空才根据抽取的记录集中的密码值与用户提交的密码MD值进行比对来进行验证这样你突然发现‘or’‘=’的计策失败鸟但是后台明明有注入这就是验证方法造成的跟进这个验证过程‘or’‘=’的确产生了一个结果集(admin表中的第一行记录)但是遗憾的事后来的密码比对没法通过验证无法成功
思路很简单网上有案例我重在原理利用union来产生想要的结果集比如‘and(=)union select top username’得md值‘id from admin where username=’admin
这样产生了admin的记录信息但是记录集中的密码那个位置的值被替换成了的md值这样使用admin 通过验证并且继承他的权利
更有甚者全部用‘xxx’的方法来盲狙这就很“过分”鸟不过在sql sybase这些严格要求类型匹配的数据库来说这样不能撼动“管理员登陆”的因为执行时发生了语法错误结果集为NULL另外以前 ewebeditor注入漏洞来上传马也是这个union操作结果集来达到目的的经典案例