二次注入的基本原理
二次注入是指已存储(数据库、文件)的用户输入被读取后再次进入到 SQL 查询语句中导致的注入。在将数据存入到了数据库中之后,开发者就认为数据是可信的。在下一次进行需要进行查询的时候,直接从数据库中取出了脏数据,没有进行进一步的检验和处理,这样就会造成SQL的二次注入。比如在第一次插入数据的时候,数据中带有单引号,直接插入到了数据库中;然后在下一次使用中在拼凑的过程中,就形成了二次注入
实例
#在mysql中代表注释,后面语句不执行
- 创建新用户名字为Dumb’#
登入数据库中发现问题数据Dumb’# 和正常数据 - 修改密码
当修改成功时,再次进入数据库查看。发现正常数据的密码被修改了
原因
username直接从数据库中取出,没有经过转义处理。在更新用户密码的时候其实执行了下面的命令:
“UPDATE users SET PASSWORD=’123′ where username=’Dumb’#‘ and password=’123456’”;
#在mysql中表示为注释,则#后的语句将不判断.直接执行
“UPDATE users SET PASSWORD=’123′ where username=’Dumb’
直接修改Dumb的密码 。
因为我们将问题数据存储到了数据库,而程序再取数据库中的数据的时候没有进行二次判断便直接带入到代码中,从而造成了二次注入;