原文转载于:http://blog.sina.com.cn/s/blog_8ff08f3001019wif.html
还有一篇蛮科普原理性的文章:http://book.51cto.com/art/201006/207598.htm
PS:我的理解是,第一次注入数据库的时候使用了特殊符号没有起到SQL注入攻击的效果,但是在程序第二次调用的时候又会导致注入,这类注入叫做二阶注入!
米哥的理解是:插入的数据中中带有数据库内置识别符号,下一次更新数据时候导致数据库识别出错并执行。
好像米哥的理解更加的有技术性一些。俺对技术还是了解的不够透彻。
second-order sql injection
也算是一种特别有益的绕过过滤的一种方法
当用户输入的恶意数据首次传送给数据库时
将会进行安全的处理
但当应用程序调用时将会以一种危险的方式运行
举例:
搜索时如若我们搜索:bingdao‘
在没有进行安全处理的应用程序中将会报错
反之
数据库将会进行如下的操作:
SELECT author,title from books where name=‘bingdao‘‘‘;
成功的进行查询
这是由于应用程序安全的将‘转义为‘‘
达到安全的目的
但如若我们是在注册用户时这样运行那么将是这样:
INSERT into users(username,password,id,privs) values(‘bingdao‘ ‘‘ ,‘fuckyou‘, 1, 1);
成功的注册 并且用户名为bingdao‘
目前为止一切正常
假如我们再去修改密码
修改密码时会验证原密码
于是数据库就这样查询:
SELECT password from users where username=‘bingdao‘‘;
只有在传入数据到数据库时才会进行安全的转义(猜想的一种情景)
这样数据库就会报错
那么我们就利用这个漏洞吧
‘ or 1 in (select password from users where username=‘admin‘)--
这样当我们再次修改密码时就会将admin的密码返回出来!
但本技巧理论性较强
我也尚未实验过
大家随意看看
THE END