PHP代码审计(chinaz)


一、准备文件

chinaz CMS源码

rips、seay打包


二、整体分析

如下图所示,chinaz没有采用MVC框架,所以比较易于分析
在这里插入图片描述

可以看到网页主要功能文件直接放到了根目录下,然后 library 目录存了一些类文件,值得注意的是 logs 目录,里面存放着日志文件,但是扩展名为 php,虽然用 .htaccess 防止了 php 的解析
在这里插入图片描述


三、任意文件包含+getshll

1. 使用 rips 扫到任意文件包含,如图
在这里插入图片描述

虽说是任意文件包含,其实只能读包含扩展名为 php 的文件,虽然在 php5.3.4 以下的版本可以使用 00截断,但是我用的是 5.4。其实之前有注意到日志文件的扩展名为 php,而日志文件的内容很可能是可控的。

暂且不管,先走完流程

2. 在 phpstorm 中分析代码
在这里插入图片描述
Ctrl + 右键,跟踪 filter 函数
在这里插入图片描述

代码简单易懂,我们以 POST 方式传入 page,使用 filter 过滤参数中的 .,在末尾拼接 .php ,然后调用 require_once 包含文件,虽然限制了我们使用目录穿越,但是还是可以使用绝对路径绕过。

3. 分析日志文件,尝试写马

使用 Ctrl + Shift + F 全局搜索 logfile.php,观察在哪里写入了日志文件
在这里插入图片描述
进入config.php,继续全局搜索 $cfg_logfile
在这里插入图片描述

在 common.php 中,继续跟进
在这里插入图片描述

找到了写入日志文件的函数为 write_log(),Ctrl + 右键 查看函数调用
在这里插入图片描述

在该文件的 loadFile() 函数中找到了调用,loadFile 获取一个参数,如果该参数不是一个文件,则会调用 write_log(),写入日志,而日志内容包含所获取的参数,继续查看 loadFile() 的调用
在这里插入图片描述

在 view.php 的 echoContent() 中找到调用,并且观察到 loadFile() 参数的一部分来自于 echoContent 的第一个参数
在这里插入图片描述

在 index.php 中找到 echoContent 的调用,经过刚才的分析可知,$data['page'] 若不存在,则会被写入日志。而 $data['page'] 来自于 $_GET['page'],filter 函数只过滤了 点,影响不大
在这里插入图片描述

访问 /index.php?page=<?php phpinfo(); ?>,页面报错,并且 <?php phpinfo(); ?> 被写入日志
在这里插入图片描述
在这里插入图片描述

4. 利用前面的文件包含去解析马儿

POST page=/logs/logfile,成功解析
在这里插入图片描述

四、命令执行

可以看到 seay 扫到很多命令执行漏洞,随便找了一个跟踪
在这里插入图片描述

定位到 view.php 的第60行,通过回溯,找到函数的调用顺序:在 index.php 中调用 viwe:echoContent,echoContent 继续调用 view:ParseIf,因为在 echoContent 中传入的参数为 $_GET[‘page’] 所以尝试传入 ?page=xxx 观察变量 $strIf,结果如下
在这里插入图片描述

其中xxx为传入的 page,如果传入 1") 可以向前闭合,使用 // 可以注释掉后面的内容,二者中间为 if 的语句,if 恒为真,即可以执行任意命令,payload如下:

?page=1") phpinfo();die();//

使用 die() 命令,可以让程序在第一次执行 eval() 后退出程序,防止命令多次执行,和出现页面不存在的图片(因为我们传入的 page 不存在),影响体验
结果如下
在这里插入图片描述

在百度变量覆盖的时候发现了一个师傅的利用方式,在此记录一下
直接盗图了,师傅勿怪(点此去师傅的博客
![

五、变量覆盖

观察到多个页面存在如下代码,有变量覆盖的危险,而 $post_data 来自于过滤后的$_POST,是用户可控的数据
在这里插入图片描述

但是我实在没找到利用的方式,最后看了前面说的师傅的博客

如图,在 normaliz.php 中存在 preg_replace(),并且三个参数都可以通过 foreach 获得,所以三个参数皆可控
在这里插入图片描述

所以师傅的 payload 如下

POST /action.php
page=normaliz&method=/xxx/e&mail_replacement=phpinfo()&source=xxx

查阅官方文档得知

PHP 5.5.0 起, 传入 “\e” 修饰符的时候,会产生一个 E_DEPRECATED 错误; PHP 7.0.0 起,会产生 E_WARNING 错误,同时 “\e” 也无法起效。

特意准备去下个 php6 来测试一下,结果意外的发现并没有实际存在的6版本

鉴于 5.5 和 7 之间,下了个 5.6 版本的,也成功执行了,但是 7 已经失效,猜测在 7 以下的版本都可以成功执行

六、总结

有位名人曾说过,“不要满足于自己所发现的,还要多研究一下别人的博客,不仅能巩固自己已有的知识,还能学到一些新的知识”

好吧 ~_~,就是我自己说的

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值