(一)是什么?
——何为二次注入?
——为了预防SQL注入攻击,而将输入到应用程序中的某些数据进行了“转义(escape)”,但是这些数据却又在“未被转义(Unescaped)”的查询窗体中重复使用。
简单地说,二次注入和普通注入一样是一个程序漏洞,它发生在用户提交的值被存储在数据库中,然后这个值被应用程序中的某些其他功能使用而不转义或者过滤数据。
(二)区别
参考网上的总结,二次注入和普通注入的区别主要有:
普通注入:(1)在http后面构造语句,是立即直接生效;
(2)普通注入很容易被扫描工具扫描到。
二次注入:(1)先构造语句(此语句含有被转义字符的语句);
(2)将我们构造的恶意语句存入数据库;
(3)第二次构造语句(结合前面已被存入数据库的语句构造。因为系统没有对已存入的数据做检查,成功注入);
(4)二次注入更加难以被发现。
(三)二次注入示例
用模拟登陆和修改密码进行操作:
首先,假设我们注册了两个用户:用户①名字为“csdner”,密码是“csdner123456”;
用户②名字为“csndner'--” ,密码是“csdner1111”。
请注意,此处的用户②的名字就是sql注入有效负载,它没有被转义或者截断,而是按照原样保存在了数据库中。
然后,我们登陆用户②,并修改它的密码为“csdn222”。注意此时登陆的是用户②。因此,我们为此用户名构造密码更改查询
UPDATE users
SET password='csdn222'
WHERE username='csdner'--' and password='csdn1111'
记住此时被查询的是用户②。但是,因为在SQL中,--是开启注释的标志,这样子的话,不知不觉中被更改密码的成了用
户①(实际上,上面的代码已经自动被CSDN当做注释处理了,恰好成了注入的样子)
也就是说,现在的查询语句长下面这个样子:
UPDATE users
SET password='csdn222'
WHERE username='csdner'
查询导致更新用户“csdner”的密码,而不是“csdner'- - ” 因此成功执行二阶sql注入。
(四)小结
参考了网上的资料,总结一下二次注入的精髓就是,第一次构造的语句只是为了第二次构造做的铺垫,第二次才是真正的攻击。
当然,二阶SQL注入也适用于其他场景,其中数据库中的数据是要被检索的。