原文地址
注入原理
攻击者构造恶意的数据并存储在数据库后,恶意数据被读取并进入到SQL查询语句所导致的注入。
防御者可能在用户输入恶意数据时对其中的特殊字符进行了转义处理,但在恶意数据插入到数据库时被处理的数据又被还原并存储在数据库中,当Web程序调用存储在数据库中的恶意数据并执行SQL查询时,就发生了SQL二次注入。
利用条件
- 插入恶意数据——构造恶意语句并进行数据库插入数据时,虽对其中特殊字符进行了转义处理,但在写入数据库时仍保留了原来的数据;
- 引用恶意数据——开发者默认存入数据库的数据都是安全的,在进行调用时,直接从数据库中取出构造的恶意数据,没有进行进一步的检验。
注入实例
Sqli-labs-24
审计代码
在注册新用户时,用mysql_escape_string()函数对输入数据进行字符转义;
mysql_escape_string()与mysql_real_escape_string() 完全一样,均转义字符串中的特殊字符(\x00 \n \r \ ‘ ” \x1a),除了 mysql_real_escape_string() 接受的是一个连接句柄并根据当前字符集转移字符串之外。mysql_escape_string() 并不接受连接参数,也不管当前字符集设定。
在更改密码时,直接从session中取username,为进行过滤放入修改密码的语句;
实操
插入恶意数据:创建新用户;
username:batman’#
password:123321
单引号虽被转义,但在插入数据库时反斜杠没有被带入;
引用恶意数据:登录并修改密码;
New Password:111111
此时在后端实际执行的代码为:
UPDATE users SET PASSWORD='111111' where username='batman'#' and password='$curr_pass'
batman’# 的单引号对前面的单引号进行了闭合,#注释掉了后面的语句,就相当于对batman进行了改密;