二次注入是什么?

攻击者构造的恶意数据存储在数据库后,恶意数据被读取并进入到SQL查询语句所导致的注入。
防御者可能在用户输入恶意数据时对其中的特殊字符进行了转义处理,但在恶意数据插入到数据库时被处理的数据又被还原并存储在数据库中,当Web程序调用存储在数据库中的恶意数据并执行SQL查询时,就发生了SQL二次注入。
二次注入常用于注册,完整的二次注入有两个步骤:

一:插入恶意数据

进行数据库插入数据时,对其中的特殊字符进行了转义处理,在写入数据库的时候又保留了原来的数据。

二:引用恶意数据

开发者默认存入数据库的数据都是安全的,在进行查询时,直接从数据库中取出恶意数据,没有进行进一步的检验的处理,导致插入的数据拼接到SQL语句中,产生了闭合和执行,从而导致产生SQL注入。

image.png

注入流程示范

可在sqli-labs less-24中练习二次注入。流程就是我们注册一个账户,账户名叫admin’#,因为管理员叫admin,后面的【’】是为了闭合SQL语句,【#】是为了注释SQL语句后面内容。
因为登录时会查询数据库,查询语句可能就是select from users where username=’xxxxxx’ and password=’xxxxxxx’ limit 0,1;
注册成功的话我们尝试登录时就会在数据库中执行select
from users where username=’admin’’#…….【#】之后的内容会被注释掉,从而把admin的数据查询出来,我们也就成功使用admin进行了登录

新建用户

注册,点击新建用户New User
新建一个以admin’#开头的用户如:admin’#smile
设置密码为123

二次注入 - 图3
登录账户

跳转到登录页面,登录用户admin’#smile即可
二次注入 - 图4
修改密码为123
二次注入 - 图5
再次到登录页面输入admin 123登录成功,admin的密码被我们成功修改,二次注入成功。

防御

二次注入一般发生在注册和登录功能处,所以针对这两种行为的输入进行控制,禁止特殊符号输入即可。