二次注入原理
二次注入漏洞字面上理解可能就是结合两个注入漏洞点实现sql注入的目的,但是这其中还有几个细节需要讲解一下。首先,第一个注入点因为经过过滤处理所以无法触发sql注入漏洞,比如addslashes
函数,将单引号等字符转义变成\’。但是存进数据库后,数据又被还原了,也就是反斜杠没了,在这种情况下,如果能发现一个新的注入同时引用了被插入了的数据库数据,就可以实现闭合新发现的注入漏洞引发漏洞。

演示
程序提供用户注册(reg.php
)和邮箱搜索(search.php
)两个功能,程序在config.php
文件中使用addslashes
转义所有的GPC输入,然后再将数据插入数据库中,如下图所示,用户输入含有'
的用户名会完整的存入数据库。


'
被安全的存入了数据库,如果又将该用户名从数据库中取出来,然后再用于数据库查询,若没转义该用户名,则会出现二次注入,演示如下:
搜索邮箱:e@qq.com
, 得到mysql报错如下,显然'
引发了数据库错误,也就是说这里是可以利用sql注入的。

这里是可以利用盲注,union注入和报错注入的, 当然,注入的利用还和username等字段的长度限制有关。
注册用户名: ' union select 1,user(),2,3 #
, 邮箱:cc@qq.com
, 然后搜索邮箱cc@qq.com
, 得到如下结果:

演示代码
- config.php
1 |
|
- reg.php
1 |
|
- search.php
1 |
|