背景
这是温故知新的一个系列,也是重新拾起WEB安全的一个系列,同时希望能稍微有点对初学者的帮助。第一篇先来讲讲OS命令注入
bWAPP里面有两个页面也就是两个漏洞,来验证OS命令注入。一个是有回显的,一个是没有的,其实本质都是一样,没有回显的,可以利用类似ceye平台来验证dns请求或者http请求,自己搭建一个也不难,flask或者Django起一个,调试模式,看日志也是OK的。
难度区分
一般来讲,bWAPP有三个难度,高中低,一般高的也不是不可以绕过,但是很复杂,不在这个系列里面去温故知新或者去记录了,但是有些会给出链接,供参考。
正文
前两个作为开篇前言,后面的系列就不会再写了,下面开始正文。
代码分析
先上代码:
<?php
if(isset($_POST["target"]))
{
$target = $_POST["target"];
if($target == "")
{
echo "<font color="red">Enter a domain name...</font>";
}
else
{
echo "<p align="left">" . shell_exec("nslookup " . commandi($target)) . "</p>";
}
}
?>
可以看出问题的关键就在这里shell_exec,高危函数,类似的还有很多,可以参考我的博客WEB安全第一篇--对服务器的致命一击:代码与命令注入
追踪代码,再来看看
function commandi($data)
{
switch($_COOKIE["security_level"])
{
case "0" :
$data = no_check($data);
break;
case "1" :
$data = commandi_check_1($data);
break;
case "2" :
$data = commandi_check_2($data);
break;
default :
$data = no_check($data);
break;
}
return $data;
}
可以看出难度不同,检查不同,难度低没有检查,难度中等,使用commandi_check_1函数进行检查,难度高等使用commandi_check_2函数进行检查。具体来看看这两个检查函数
function commandi_check_1($data)
{
$input = str_replace("&", "", $data);
$input = str_replace(";", "", $input);
return $input;
}
function commandi_check_2($data)
{
return escapeshellcmd($data);
}
function commandi_check_3($data)
{
$input = str_replace("&", "", $data);
$input = str_replace(";", "", $input);
$input = str_replace("|", "", $input);
return $input;
}
不检查的好说,直接 | 拼接在执行的命令就行了,难度高的用来escapeshellcmd函数,标准PHP防御OS命令执行的函数,绕过方式可以参考Exploit/bypass PHP escapeshellarg/escapeshellcmd functions
我们来说说中等
中等难度
在中等难度中过滤了&和;其实这没啥用一个|拼接一样执行,我们按照commandi_check_3的标准过滤掉|,再来尝试注入。
可以尝试``我们来试试
Payload:%26%26%60id%20>1.txt%60
参考文献
https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Remote commands execution/Intruder/command_exec.txt
https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Remote commands execution/Intruder/command-execution-unix.txt