二次注入原理与实例分析

原理
第一步:插入恶意代码,向数据库插入数据的时候,虽然对特殊字符串进行了转义,但写入数据库的时候还保留了原来的内容(不管有没有发生转义),使得数据本身已经包含恶意内容
第二步:引用恶意数据,恶意数据写入数据库中,在利用查询读取恶意数据,没有检查,就会造成SQL的二次注入
实例分析
在sqli-lab第24关中,利用的就是二次注入
二次注入原理与实例分析
我们首先审查源码,可以发现在注册的页面
二次注入原理与实例分析
使用了mysql_real_escape_string()这个转义函数,将传入的参数进行转义,但是仍然存放在数据库中,并没有将其过滤。在更改密码的页面中,执行更新语句的时候并没有对username这个变量进行过滤。
二次注入原理与实例分析
我们查看数据库发现,有一个admin的用户
二次注入原理与实例分析
于是我们在注册用户的时候可以注册一个恶意用户admin ‘#,发现恶意用户的用户名成功存入数据库
二次注入原理与实例分析
尝试用admin ‘#来更改admin的密码,由于更改的密码的时候,并未对从数据库传来的用户名进行过滤,所以使用admin ‘#这个账号更改密码的时候将sql语句后半部分闭合变成
update users set password=’123456’ where username=’admin’ #

因此这里更改的是admin这个账号的密码,由于后半部分闭合,所以不需要admin这个账号的密码也能执行update这个语句。
二次注入原理与实例分析
二次注入原理与实例分析
看数据可以发现,用admin ‘#这个账号更改admin这个账号的密码更改成功
防御方法
1、需对传入数据库中的数据进行过滤而非转义,一旦发现非法字符串就应该禁止其传入数据库。
2、不能百分百相信数据库中的数据,需对其进行过滤。