大佬博文(看着这个就够了,我的不用看了,我只是自己总结一下。)

二次注入

原理:二次排序注入,也称存储型注入。即:先将导致 SQL 注入的字符预先存到数据库中, 当再次调用到这个恶意构造的字符时就可以触发注入。

利用了 waf 等对存入数据库的东西不进行过滤,只进行转义的特点,存到数据库中之后还是你输入的原数据,然后在第二次用到该数据的时候,它与操作它的 sql 语句形成 sql 注入

这里涉及到用户体验/功能等问题,比如:你写一篇正常的关于 sql 注入或其他涉及 sql 的博文,文章中包含 sql 注入等语句,然后你要存入数据库,waf 等不应该将威胁字符、字符串等给去掉. 这可能也是安全与功能体验的一个矛盾点吧。

在本关中,其主要功能的有 3 个 php 文件: login.php 负责查询数据库用户存在和验证登录, login_create.php 创建新用户, pass_change.php 修改老用户密码。

本次的过滤在账户登录和密码处,使用了 mysql_real_escape_string 函数

mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符,但并不会替换或去除。

因此,我们输入的特殊字符会被它转义而不奏效, 但是之后存储进数据库时依然会还原成原来的样子。

此外,我们发现 pass_change.php 中直接把 session 中的用户名直接拿来用了, 结合上面的过滤函数,如果知道确切的用户,可以构造单引号闭合来修改其密码。

有些开发者过于轻心大意,当将从数据库中取出的数据拼接到 sql 语句上时,不进行检测过滤,从而导致二次注入。

具体细节就不讲了,看大佬博文吧。以后遇到别的再加上来。