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

本文由红日安全成员: 七月火编写,如有不当,还望斧正。本文转载自先知社区:https://xz.aliyun.com/u/10394前言大家好,我们是红日安全-代码审计小组。最近我们小组正在…

本文由Red Sun Security成员撰写:  7月Fire,如果您有任何错误,您仍然希望成为斧头。 本文转载自先知社区:https://xz.aliyun.com/u/10394 前言 大家好,我们是Red Sun Security - Code Audit Team。最近,我们的团队正在开发一个PHP代码审计项目,供大家学习。我们给这个项目命名为  PHP-Audit-Labs 您现在看到的系列文章属于项目 的第一阶段 此阶段的内容来自  PHP SECURITY CALENDAR 2017 对于每个问题,我们给出相应的分析并结合实际的CMS进行解释。在文章的最后,我们还将为每个人留下一个CTF主题进行练习,我希望每个人都喜欢它。以下是 第14部分 代码审核文章:第14天 - 雪人 标题名为Snowman,代码如下:

漏洞分析  本主题是关于 变量,覆盖 和 路径遍历 在 行10-11  胡萝卜 类的构造函数注册超全局数组  $ _GET 以便它可以覆盖 第8行 定义  $ this-> 变量。在 的第16行 的析构函数中,  file_put_contents 函数的第一个参数由  $ this->拼接。 变量,它允许我们控制文件的写入位置,最后导致任意文件写入问题。下面我们尝试使用 有效载荷 id=./var/www/html/shell.php& shell=',)%0a // 写入  webshell 

案例分析 对于此示例分析,我们选择了最新版本的  DuomiCMS_3.0  CMS具有全局变量注册问题。如果程序编写不正确,将导致变量覆盖。这次我们将分析由变量覆盖引起的  getshell 问题。 首先让我们看看CMS中的全局变量注册代码,它位于  duomiphp/common.php 文件中,如下所示:

其中  _RunMagicQuotes 函数使用  addslashes 函数转义特殊符号。让我们搜索  fwrite 函数,看看是否有可写的可写文件程序(为了写  shell )。 phpstorm 程序搜索结果如下:

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

$ weburl 变量和  $令牌 该变量是从  POST模式 获得的,其变量仅由  _RunMagicQuotes 函数和  duomiphp \ webscan.php 文件过滤规则过滤,但它不影响我们的写入shell 。过滤规则如下:

但是,为了使用这个文件,我们必须是  admin 标识,否则没有访问该文件的权限。因此,让我们看看CMS如何识别用户的身份。我们可以使用先前的变量覆盖来伪造身份吗? 跟进  admin \ admin_ping.php 文件包含  admin \ config.php 文件,那么我们应该注意以下代码:

我们需要知道程序如何处理用户的身份。按照  duomiphp \ check.admin.php 文件,并按照以下代码:

我们可以看到这里记录了用户名,组和用户,然后查看对应于  admin 的三个值。找到  admin \ login.php文件,如下图所示,我们只让  checkUser 方法返回1是admin用户。

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

我们使用正确的管理员帐户密码直接登录后台。您可以观察到用户和admin用户对应的组都是1。

所以现在我们只使用变量来覆盖漏洞,覆盖 会话 的值,从而伪造  admin 身份,然后我们就可以愉快地编写shell了。 利用 我们需要找到一些打开  session_start 函数的程序来帮助我们伪造身份。我们将在这里选择  member/share.php 文件。

让我们首先访问以下 有效负载  http://localhost/member/share.php?_SESSION [duomi_group _]=1& _SESSION [duomi_admin _]=1 当我们访问 有效载荷 时,我们对应于 会话 的用户和组变为1.然后,我们将以下数据包写入webshell: POST /admin/admin_ping.php?action=set HTTP/1.1 主机: www.localhost.com 高速缓存控制: max-age=0 升级 - 不安全请求: 1 用户代理: Mozilla/5.0(Windows NT 6.1; Win64; x64)AppleWebKit/537.36(KHTML,与Gecko一样)Chrome/69.0.3497.100 Safari/537.36 接受: 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 连接:关闭 内容类型: application/x-www-form-urlencoded 内容长度: 34 WEBURL=';的phpinfo(); //&安培;标记=

修复建议 实际上,此漏洞与  Dedecms 变量覆盖漏洞非常相似。在官方修复代码  Dedecms 中,它比检测变量名称更多是PHP的原始超全局数组,如果是,则直接退出并告知变量是不允许的,具体修复代码如下:

结论 阅读上述分析后,我不知道您是否对 变量覆盖 引起的漏洞有了更深入的了解。当然,如果文中有任何不便,可以从这里下载  CMS (  DuomiCMS_3.0 )。我也希望你会成为斧头。如果您对我们的项目感兴趣,请随时发送电子邮件至  hongrisec@gmail.com 第14天 分析文章就在这里,我们最后留下了一个CTF主题供大家练习,主题如下:链接: https://pan.baidu.com/s/1pHjOVK0Ib-tjztkgBxe3nQ 密码: 59t2(主题环境:PHP5.2 。 X) 该解决方案将分阶段发布。如果您有任何好的解决方案,您可以在文章的底部留言,祝大家愉快!