什么是二次注入
二次注入可以理解为,攻击者构造的恶意数据存储在数据库后,恶意数据被读取并进入到SQL查询语句所导致的注入。防御者即使对用户输入的恶意数据进行转义,当数据插入到数据库中时被处理的数据又被还原,Web程序调用存储在数据库中的恶意数据并执行SQL查询时,就发生了SQL二次注入。
可以理解为就是第一次注入并不是为了直接注入,第一次注入不会影响什么,第二次注入才会导致注入的产生,达到自己的目的
题型
二次注入的特点就是会给你一个登录页面以及注册页面,有时候注册页面还要需要你自己去找,但这个注册页面一般为url+register.php,然后在注册时去猜测它的sql注册语句如你注册了一个admin'#,密码自己设置,就可能会把admin后面的sql语句给注释掉,那么你的用户名就是admin,密码就是你设置那个,也就是说你把管理员的密码重新设置了,但不一定是单引号闭合;
有的题是注册和修改密码配合在一起了,如https://www.cnblogs.com/jackie-lee/p/16124022.html
这位大佬就是用的这个实验做的相关的题型
例题
多说无益,用题去见真章
buuctf October 2019 Twice SQL Injection 1
题目名字就已经告诉我们,这就是一个二次注入的题目
打开网页有两个页面,一个是登录页面,一个注册页面,去注册页面注册一个账号,然后登录上去先看看情况,看看注入点在哪里,注册之后登录上面之后发现一个框,可以输入东西并在上面显示,试一下sql注入相关的语句,发现它会对关键符号进行转义;
先不管这里了,去别的地方测试测试,那么下一个地方就是用注册和登录了,想用上面的知识点注册一个管理员页面,但不行,我感觉原因就是这个知识点用admin'#这个账号注册的知识点,需要和修改密码哪里配合使用,但这里只有注册和登录页面,所以我想着直接用sql语句看看会不会执行
用户名:1" union select database()#
密码:1
注册发现并没有太大的变化
试一试单引号
用户名:1' union select database()#
账号:1
发现回显出了数据库,感觉有戏
继续
1‘ union select group_concat(table_name) from information_schema.tables where table_schema='ctftraining' #
1’ union select group_concat(column_name) from information_schema.columns where table_name='flag'#
1‘ union select flag from flag #
得到flag
随后如果在找到相关二次注入的题目,本篇博客会继续更新;