二次注入原理与实例分析

    技术2025-07-24  17

    原理: 第一步:插入恶意代码,向数据库插入数据的时候,虽然对特殊字符串进行了转义,但写入数据库的时候还保留了原来的内容(不管有没有发生转义),使得数据本身已经包含恶意内容 第二步:引用恶意数据,恶意数据写入数据库中,在利用查询读取恶意数据,没有检查,就会造成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、不能百分百相信数据库中的数据,需对其进行过滤。

    Processed: 0.012, SQL: 9