命令执行漏洞,用户通过浏览器在远程服务器上执行任意系统命令,严格意义上,与代码执行漏洞还是有一定的区别。

0x01漏洞实例

例1:

<?php
$target=$_REQUEST['ip'];
$cmd = shell_exec('ping '.$target);
echo "<pre>{$cmd}</pre>";
?>

提交 http://127.0.0.1/cmd.php?ip=|net user

提交以后,命令变成了 shell_exec('ping '.|net user)

0x02 常用命令执行函数

  exec()、system()、popen()、passthru()、proc_open()、pcntl_exec()、shell_exec() 、反引号` 实际上是使用shell_exec()函数

system() 输出并返回最后一行shell结果。 
exec() 不输出结果,返回最后一行shell结果,所有结果可以保存到一个返回的数组里面。 
passthru() 只调用命令,把命令的运行结果原样地直接输出到标准输出设备上。

popen()、proc_open() 不会直接返回执行结果,而是返回一个文件指针

<?php
#system('net user');
#passthru ('dir'); #echo exec('whoami');
#echo shell_exec('whoami');
#echo `whoami`;
?>

0x03 漏洞利用及绕过姿势  

| 命令管道符

<>>> 文件重定向符

测试: 0 | dir c:

  代码只过滤了部分特殊字符,可以考虑用其他字符进行测试,这边列举一下Window/Linux可利用的特殊字符:

windows支持:

|     直接执行后面的语句      ping 127.0.0.1|whoami

||    前面出错执行后面的 ,前面为假       ping  2 || whoami

&   前面的语句为假则直接执行后面的,前面可真可假                       ping 127.0.0.1&whoami

&&前面的语句为假则直接出错,后面的也不执行,前面只能为真    ping 127.0.0.1&&whoami

Linux支持:

;     前面的执行完执行后面的      ping 127.0.0.1;whoami

|     管道符,显示后面的执行结果   ping 127.0.0.1|whoami

11   当前面的执行出错时执行后面的   ping 1||whoami

&   前面的语句为假则直接执行后面的,前面可真可假                       ping 127.0.0.1&whoami

&&前面的语句为假则直接出错,后面的也不执行,前面只能为真    ping 127.0.0.1&&whoami

0x04 如何防止命令执行漏洞

  PHP内置的两个函数可以有效防止命令执行:

  escapeshellarg() 将给字符串增加一个单引号并且能引用或者转码任何已经存在的单引号,这样以确保能够直接将一个字符串传入 shell 函数,并且还是确保安全的。对于用户输入的部分参数就应该使用这个函数。资料参考:http://cn.php.net/manual/zh/function.escapeshellarg.php

   escapeshellcmd() 对字符串中可能会欺骗 shell 命令执行任意命令的字符进行转义。 此函数保证用户输入的数据在传送到 exec() 或 system() 函数,或者 执行操作符 之前进行转义。资料参考:http://cn.php.net/manual/zh/function.escapeshellcmd.php

  当然,修复方法还有很多方式,修复方式一般有两种思维:

  1、黑名单:过滤特殊字符或替换字符  2、白名单:只允许特殊输入的类型/长度

修复代码示例一:

<?php
$target=$_REQUEST['ip'];
$octet = explode( ".", $target );
if( ( is_numeric( $octet[0] ) ) && ( is_numeric( $octet[1] ) ) && ( is_numeric( $octet[2] ) ) && ( is_numeric( $octet[3] ) ) && ( sizeof( $octet ) == 4 ) ) {
$target = $octet[0] . '.' . $octet[1] . '.' . $octet[2] . '.' . $octet[3];
$cmd = shell_exec('ping '.$target);
echo "<pre>{$cmd}</pre>";
}
else {
echo '<pre>ERROR: You have entered an invalid IP.</pre>';
}
?>

修复代码示例二:

<?php
$target=$_REQUEST['ip'];
$cmd = shell_exec('ping '. escapeshellcmd($target));
echo "<pre>{$cmd}</pre>";
?>

最后

欢迎关注个人微信公众号:Bypass--,每周原创一篇技术干货。

参考文章:

  命令执行漏洞  http://www.jianshu.com/p/1e706f13b088

PHP代码审计笔记--命令执行漏洞的更多相关文章

  1. ASP代码审计 -4.命令执行漏洞总结

    命令执行漏洞: 保存为cmd.asp,提交链接: http://localhost/cmd.asp?ip=127.0.0.1 即可执行命令 <%ip=request("ip" ...

  2. 2020/1/28 PHP代码审计之命令执行漏洞

    0x00 命令执行漏洞原理 应用程序有时需要调用一些执行系统命令的函数,如在PHP中,使用system.exec.shell_exec.passthru.popen.proc_popen等函数可以执行 ...

  3. PHP代码审计笔记--代码执行漏洞

    漏洞形成原因:客户端提交的参数,未经任何过滤,传入可以执行代码的函数,造成代码执行漏洞. 常见代码注射函数: 如:eval.preg_replace+/e.assert.call_user_func. ...

  4. ASP代码审计学习笔记 -4.命令执行漏洞

    命令执行漏洞: 保存为cmd.asp,提交链接: http://localhost/cmd.asp?ip=127.0.0.1 即可执行命令 <%ip=request("ip" ...

  5. FastJson远程命令执行漏洞学习笔记

    FastJson远程命令执行漏洞学习笔记 Fastjson简介 fastjson用于将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean.fastjson.ja ...

  6. Kali学习笔记30:身份认证与命令执行漏洞

    文章的格式也许不是很好看,也没有什么合理的顺序 完全是想到什么写一些什么,但各个方面都涵盖到了 能耐下心看的朋友欢迎一起学习,大牛和杠精们请绕道 实验环境: Kali机器:192.168.163.13 ...

  7. PHP代码审计学习之命令执行漏洞挖掘及防御

    [1]可能存在命令执行漏洞的函数: 00x1:常用的命令执行函数:exec.system.shell_exec.passthru 00x2:常用的函数处理函数:call_user_func.call_ ...

  8. php代码审计5审计命令执行漏洞

    命令执行漏洞:通过易受攻击的应用程序在主机操作系统上执行任意命令,用户提供的数据(表单,cookie,http头等)未过滤 挖掘思路:用户能够控制函数输入,存在可执行代码的危险函数 命令执行和代码执行 ...

  9. 2011-11-14:命令执行漏洞防御,PHP反序列化漏洞产生原因,笔记

    命令执行漏洞防御尽量不要使用系统执行命令在进入执行命令函数方法之前,变量一定要做好过滤,对敏感字符进行转义在使用动态函数之前,确保使用的函数是指定的函数之一对PHP语言来说,不能完全控制的危险函数最好 ...

随机推荐

  1. Java设计模式(9)适配器模式(Adapter模式)

    适配器模式定义:将两个不兼容的类纠合在一起使用,属于结构型模式,需要有Adaptee(被适配者)和Adaptor(适配器)两个身份. 为何使用适配器模式 我们经常碰到要将两个没有关系的类组合在一起使用 ...

  2. 卡片式ViewPager,一屏展示多个pager item,设置高度不一致的tabBar

    ViewPager的基本用法不必多说,这都很简单,我们可以在ViewPager中加载一个ImageView,也可以加载一个Fragment,这都是目前非常常见的用法.那么我今天说的是ViewPager ...

  3. R语言使用RMySQL连接及读写Mysql数据库 测试通过

    R语言使用RMySQL连接及读写Mysql数据库 简单说下安装过程,一般不会有问题,重点是RMySQL的使用方式. 系统环境说明 Redhat系统:Linux 460-42.6.32-431.29.2 ...

  4. 自己用过的一些比较有用的css3新属性

    css3刚推出不久,虽然大多数的css3属性在很多流行的浏览器中不支持,但我个人觉得还是要尽量开始慢慢的去了解并使用css3(还有html5),因为我觉得这是一种趋势,它是一种已经被制定的标准.我并不 ...

  5. QIODevice (Qt中所有 I/O devices 的基类,QFile,QBuffer,QTcpSocket等)

    QIODevice是所有Qt I/O设备的基类,它提供了对支持块读写设备(例如QFile,QBuffer,QTcpSocket)的通用实现和抽象接口.QIODevice是一种抽象,不能被实例化,但是, ...

  6. Mac下安装Pyqt

    1.安装sip brew install sip 2.安装pyqt brew install pyqt

  7. 去掉WIN7 桌面图标的小箭头

    reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Icons" ...

  8. (笔记)Mysql命令show databases:显示所有数据库

    show databases命令用于显示所有数据库. show databases命令格式:show databases; (注意:最后有个s) 例如:mysql> show databases ...

  9. Java的图形用户界面的基本工具

    AWT(Abstract Window Toolkit),中文译为抽象窗口工具包,该包提供了一套与本地图形界面进行交互的接口,是Java提供的用来建立和设置Java的图形用户界面的基本工具. AWT中 ...

  10. java 项目 存入mysql后 变问号 MySql 5.6 (X64) 解压版 1067错误与编码问题的解决方案

    [参考]MySQL 5.7.19 忘记密码 重置密码 my.ini示例 服务启动后停止 环境 Java环境JDK1.8  安装好了 mysql-5.6.38-winx64  idea2016(64) ...