学习了一波某师傅的代码审计,以后开始写一些PHP代码审计的文章
一些常见的危险函数如:eval、assert 、file_put_contents、move_uploaded_file、unlink…等等
YIXUNCMS2.0采用mvc框架,快速通读了cms大致的目录如下,开始危险函数的查找
这是在rips代码审计工具中扫描到的结果,能够自动化地挖掘 PHP 源代码潜在的安全漏洞
一、任意文件删除
admin/controls/flink.class.php
代码中中存在危险函数参数可控的函数
1 | function update(){ |
在update
这个函数中存在操作文件的一个过程,并且unlink
函数的参数是我们可控的
先过第一个if,post发送一个值让它不为空,再往下程序又接收一个logo
的变量并且也是可控的
再往下看判断文件是否存在,再执行删除操作
审计了上面的内容,我们就可以开始构造poc来验证了,由于是MVC框架访问的方式也是不一样的
public/uploads/logos
我们用三个../目录穿越回到cms的根目录删除文件
下断点,在debug中就可以观察到poc验证时的状态,最终拼接出来的文件路径就可以达到任意文件删除效果
只要我们删除install_lock.txt文件就可以重新安装该cms系统
二、任意内容写入
models/flink.class.php
file_put_contents
危险函数搜索,先分析在被调用的地方是否有可控的参数
1 | class Flink{ |
str_replace
会把接收到的host的点替换为下划线,后面的array_pop
是提取后缀名的操作并且没有过滤,我们传参时直接传递一个php后缀的文件即可,最后会拼接成host.php
由于在MVC框架中models
是不能被直接访问的,我们必须在controls
找调用downlogo
的地方
在controls/flink.class.php
文件中insert
方法调用了downlogo
,传递给downlogo的参数是可控的,我们直接调用这个方法传递一个数据给downlogo函数写入
审计完内容后我们来构造poc来验证一下
file_put_contents
函数是读取内容写入到文件的一个函数,我们把需要写入的内容放在另外一个文件中,然后传递给file_put_contents
函数读取
这里我们随意在可访问的文件中写一个phpinfo的内容写入即可
在debug中的状态,传递给file_put_contents
的$data
已经变成了我们写入的内容
我们再去查看YIXUNCMS2.0\public\uploads\logos
目录下存在一个文件,就是我们刚刚写入的
直接访问即可
三、任意内容写入
classes/baseset.class.php
1 | static function writeindex($style,$start){ |
writeindex
方法在写入内容时有两个参数是通过参数传递过来的,由于MVC框架,这里也是不能直接访问我们找一下在哪调用了这个函数,然后再查看参数是否可控
writeConfig
方法中调用了writeindex
1 | static function writeConfig($post){ |
我们继续跟进调用writeConfig
的地方
在admin/controls/base.class.php
中调用set
方法,set
方法调用了writeConfig
方法
1 | function set(){ |
审计了上面的内容,我们来构造poc
writeindex
方法是修改index.php
中CSTART
和TPLSTYLE
两个常量的值
1 | define("CSTART","0"); |
构造闭合0");<?php phpinfo();?><?php //
闭合第一个值第二值自然就无需传递了为空即可
我们去查看index.php的值就已经被成功覆盖了