二次注入
二次注入是指已存储(数据库、文件)的用户输入被读取后再次进入到 SQL 查询语句中导致的注入。二次注入是sql注入的一种,但是比普通sql注入利用更加困难,利用门槛更高。普通注入数据直接进入到 SQL 查询中,而二次注入则是输入数据经处理后存储,取出后,再次进入到 SQL 查询。
原理
在第一次进行数据库插入数据的时候,仅仅只是使用了 addslashes 或者是借助 get_magic_quotes_gpc 对其中的特殊字符进行了转义,在后端代码中可能会被转义,但在存入数据库时还是原来的数据,数据中一般带有单引号和#号,然后下次使用在拼凑SQL中,所以就形成了二次注入。
过程
- 插入1‘#
- 转义成1\’#
- 不能注入,但是保存在数据库时变成了原来的1’#
- 利用1’#进行注入,这里利用时要求取出数据时不转义
换言之, 二次注入需要具备的两个条件:
(1)用户向数据库插入恶意语句(即使后端代码对语句进行了转义,如mysql_escape_string、mysql_real_escape_string转义)
(2)数据库对自己存储的数据非常放心,直接取出恶意数据给用户
利用
:以sqli-lab24为例
1正常来说无法通过注入来登录admin,因为用户输入会被转义
2注册admin ‘#
3登录admin ‘# 转义成admin\’#,则登录的是admin’#
4修改admin ‘# 由于这里不会被转义,故可以直接利用,这个时候就变成了修改了admin的密码了
防御
1 解决SQL注入最推荐的方法还是预处理+数据绑定。
2 另一个防御的点就是 对输入一视同仁,无论输入来自用户还是存储,在进入到 SQL 查询前都对其进行过滤、转义