1、概述
二次注入是指已存储(数据库、文件)的用户输入被读取后再次进入到 SQL 查询语句中导致的注入。
二次注入是sql注入的一种,但是比普通sql注入利用更加困难,利用门槛更高。普通注入数据直接进入到 SQL 查询中,而二次注入则是输入数据经处理后存储,取出后,再次进入到 SQL 查询。
2、原理
二次注入的原理,在第一次进行数据库插入数据的时候,使用了 addslashes 、get_magic_quotes_gpc、mysql_escape_string、mysql_real_escape_string等函数对其中的特殊字符进行了转义,但是addslashes有一个特点就是虽然参数在过滤后会添加 “\” 进行转义,但是“\”并不会插入到数据库中,在写入数据库的时候还是保留了原来的数据。在将数据存入到了数据库中之后,开发者就认为数据是可信的。在下一次进行需要进行查询的时候,直接从数据库中取出了脏数据,没有进行进一步的检验和处理,这样就会造成SQL的二次注入。
比如在第一次插入数据的时候,数据中带有单引号,直接插入到了数据库中;然后在下一次使用中在拼凑的过程中,就形成了二次注入。
二次注入,可以概括为以下两步:
第一步:插入恶意数据
进行数据库插入数据时,对其中的特殊字符进行了转义处理,在写入数据库的时候又保留了原来的数据。
第二步:引用恶意数据
开发者默认存入数据库的数据都是安全的,在进行查询时,直接从数据库中取出恶意数据,没有进行进一步的检验的处理。
配合下图可以有更好的理解:
3、注入方法
比如:登录注册账号密码,(对于没有进行过滤sql语句)通过构造playload来进行SQL注入。
注册一个账号 :admin’-- -
密码:123456
最后通过修改账号密码,‘admin’-- -(注释了后面的密码)
造成在不知道其他用户admin的情况下可以修改其密码
实验环境演示
1、注册用户名admin’-- -(后面的-是为了突出前面的空格,起到了注释作用)
2、 注册成功
3、查看注册源代码
发现用户在注册的时候没有进行特殊符号过滤,所以再一次说明我们注册的用户成功!
4、进行修改密码(攻击)
5、查看结果
攻击成功,在不知道admin用户的密码情况下,修改了密码。攻击者可以用这个账号进行登录,从而造成很大的影响。
6、查看修改密码的源代码
可以看到用户名为:admin’-- -后面注释了密码,造成了在不知道admin用户密码的情况下可以修改其密码。
之后就可以利用这个admin用户登录造成信息泄露