freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

PHP代码审计之HadSky
2023-03-16 21:11:04
所属地 北京

环境搭建:

首先使用phpstudy进行环境搭建,创建网站之后,进入下一 步。

1678970751_64130f7f4f48c96394526.png!small

接着进入安装过程。

1678970764_64130f8ce7592b514036e.png!small

安装完成之后,输入设置好的密码。进行登录。

1678970774_64130f96a327f3ea98874.png!small

代码审计:

路由分析

该系统使用 puyuetian 自研框架进行开发,我们从页面访问情况可以看到,在功能点调用时总是从index.php开始走的,所以我们先去看看index.php文件内容:index.php中上面是一些环境检测代码,这里包含一个框架加载文件puyuetian.php。

1678970784_64130fa0c0fe60215ffd6.png!small

在初始时框架就会加载如缓存、访问控制、框架公用变量等文件,而前台的路由

主要由下面的 laod.php 文件进行控制,跟进该文件

1678970794_64130faa408fb64165bcb.png!small

在该文件中通过get传入c参数来控制路由,如果不传入该参数,则默认访问phpscript目录下

main.php,否则包含phpscript目录下相应文件实现相应功能。

1678970805_64130fb520d78f80f7984.png!small

而后台路由我们需要访问admin.php,这里的app其实代表app文件夹,

superadmin:index则表示superadmin文件夹下的index.php文件,这样路由就定位到该php文件,继续跟进

该文件

1678970813_64130fbd94159ab20ac7f.png!small

在该文件中,在代码中需要传递另一个参数 s 来控制调用后台的某些功能点,以此类推,/app

目录下文件的调用方式就是通过这样来调用的。

1678970823_64130fc7bfb51408785a0.png!small

1.任意文件写入漏洞

全局搜索 file_put_contents( 时,发现这里写入的内容直接可通过POST传参控制

1678970833_64130fd1be7cfed3602c6.png!small

回溯文件,在文件最开始通过传入type参数来控制switch....case来执行我们的

file_get_contents() ,

1678970842_64130fda32bfc1430d4bc.png!small

而这里的path也是通过我们GET传入的,只是这里的path参数有realpath() 函数包裹和下面代码进行限制。1678970852_64130fe4e71ad25ea4eae.png!small

需要传入type=save,path是一个存在的文件则可以覆盖该文件将任意内容写入。1678970862_64130fee4fca4fc024cdc.png!small

通过type=mkfile,并且传入 mkname 参数即可创建文件,这样我们就可以通过创建的文件进行文件内容的写入。

1678970872_64130ff87ec4d18c59681.png!small

漏洞复现:

1678970881_64131001c8b7d8f9a6ae7.png!small

我们构造路由进行测试,

在这里我们找一个目录下的文件进行测试,代码中是会提示保存失败的,

但是我们后台查看文件已经写入了。

1678970898_641310125e9b9094f1177.png!small

进入本地文件夹,发现成功写入phpinfo

1678970905_64131019d41c2f340752f.png!small

访问看看。

1678970913_641310211445135e6c9dc.png!small

2.任意文件删除漏洞

全局搜索 unlink() 函数,经过前面的分析这里的$path我们确定是

可控的,只要该文件存在即可进行删除。

1678970926_6413102eec34f1ebea42a.png!small

发现该处代码调用过程中没有做过滤。

1678970934_6413103655fd85ae6be48.png!small

漏洞复现:

进入安装目录下。

1678970946_64131042d4ba8064af6d6.png!small

使用burpsuite进行抓包。

1678970953_64131049ab4385e59ff5f.png!small

成功删除新建的文件。

1678970961_64131051566af338da7f1.png!small

3.任意文件删除导致rce漏洞

通过上述文件中任意文件删除漏洞,那么我们就可以删除锁文件(xx.locked)达到重装的效果

看下面的install.php中,最上面接收参数,也就是我们安装时填入的一些数据库信息。

1678970970_6413105ab29989d48d346.png!small

在这里也要保证数据库在执行连接、创建等操作时不报错。如果数据库执行期间报错的话那么就会导致系统安装不成功,后续的config.php即使写入文件也无法利用。

1678970979_6413106362d1cf9ba2de7.png!small

在config.php文件中,在红框中的参数是我们可以“控制"的参数。

1678970986_6413106aca26a1f1860c2.png!small

在这里mysql_prefix注入特殊字符可以顺利安装,文件内容也会被顺利写入。那么我们该如何执行config.php,接着往下分析

1678970995_641310731a06d0f0f0e22.png!small

上面config.php文件中我们可知,必须定义了puyuetian常量才可以访问该文件,而我们知道index.php路由文件中包含了框架加载文件puyuetian.php ,而在该文件中包含了config.php文件,也就是说只要我们成功安装系统,再访问index.php的话就可以成功rce了。

1678971004_6413107c406b3e20628f8.png!small

1678971011_64131083d2b2f7f561367.png!small

漏洞复现:

首先在安装界面填入我们payload,这里系统会成功安装。

1678971021_6413108de9b776e901a52.png!small

成功触发phpinfo

1678971029_641310950adda6b86b2a4.png!small

1678971036_6413109cd409a00636698.png!small

4.任意文件读取漏洞

全局危险函数 file_get_contents( 。

1678971045_641310a51aefb3c4a216c.png!small

传入type=edit走到这个分支,这里白名单后缀已经可以满足我们读取大部分文件,path可控。

1678971055_641310afe2b13c58f57f0.png!small

当我们GET传入json参数时,就会进入ExitJson函数中,该函数的大致意思就是将我们读取到的内容通过

json形式进行回显。

1678971066_641310ba993064c7a6aff.png!small

1678971073_641310c1f0dfe5d3e4fa5.png!small

漏洞复现:

1678971083_641310cbf41b86cf9c373.png!small

1678971091_641310d331580160c6ebc.png!small

5.模板上传绕过getshell

进入后台的上传功能。

1678971101_641310dd32621b51155cf.png!small

定位到如下代码处 app\superadmin\phpscript\app.php

通过控制 t=uploadapp 参数来控制代码执行此处的else if,其中就是上传zip文件的代码,可以看到这里

代码的后缀白名单,然后通过ZipArchive class(php自带类库,可以对文件进行压缩与解压缩处理

下的open方法打开压缩文件。

1678971110_641310e61babae041afe8.png!small

然后通过ZipArchive::extractTo()方法将.zip文件解压到根目录。且通过ZipArchive解压文件的骚操作还有很多,这里就使用最简单的方式进行getshell。

1678971117_641310ed62f14334e50d9.png!small

下面是ZipArchive Class下的一些常用方法

php中有一个ZipArchive类,可以用于文件的压缩与解压的操作,ZipArchive类的使用教程,可以查看下面的方法。

php ZipArchive类使用方法

1、声明一个 ZipArchive 类的使用方法$zip = new ZipArchive;

2、打开一个压缩文件$zip->open('new.zip', ZipArchive::CREATE);

(1)、open 中的第一个参数 'new.zip',是要打开的压缩文件

(2)、open 中的第二个参数,有四个值,可以参考如下ZIPARCHIVE::OVERWRITE:检测zip文件是否存在,如果不存在则会新建,如果存在则会被覆盖

ZIPARCHIVE::CREATE:如果指定的zip文件不存在,则新建一个

ZIPARCHIVE::EXCL:如果指定的zip文件存在,则会报错

ZIPARCHIVE::CHECKCONS:对指定的zip执行其他一致性测试

3、addFile 可以添加文件到压缩包中$zip->addFile('test.txt');

4、addEmptyDir 添加一个空目录到压缩包中$zip->addEmptyDir ('newdir');

5、addFromString 添加指定的内容的文件到压缩包中$zip->addFromString('new.txt', '这里是要添加的内容');

6:extractTO 将压缩包解压到指定文件$zip->extractTo('test');

7:getNameIndex 根据压缩包内文件索引返回文件名称$zip->getNameIndex(0);

8:getStream 获取压缩包中指定文件的内容$zip->getStream('hello.txt');

9:renameIndex 修改压缩包中指定索引的文件$zip->renameIndex(0,'newname.txt');

10:renameName 修改指定文件的名称$zip->renameName('word.txt','newword.txt');

11:deleteIndex 删除压缩包中指定索引的文件$zip->deleteIndex (0);

12:deleteName 删除压缩包中指定的文件$zip->deleteName('word.txt');

ZipArchive类使用示例

1、php使用 ZipArchive 类压缩文件的方法<?php

$zip = new ZipArchive();

$zipname = 'file.zip';

//打开一个压缩文件,如果没则新建一个

$zip->open($zipname, ZipArchive::CREATE);

//添加一个文件到压缩

$zip->addFile('robots.txt');

//添加一个空目录到压缩包中

$zip->addEmptyDir('file');

//添加一个自定义内容的文件

$zip->addFromString('file/txt.txt', '我是要添加的内容!');

$zip->close();

?>

2、php使用 ZipArchive 类解压文件的方法<?php

$zip = new ZipArchive();

if($zip->open('file.zip') === true) {

if(!is_dir('mochu')){ //检测文件是否存在

mkdir('mochu'); //如果文件不存在,则新建

}

$zip->extractTo('mochu'); //将文件解压到 mochu 文件中!

$zip->close();

}

?>

3、php ZipArchive类压缩包操作<?php

$zip = new ZipArchive();

if($zip->open('file.zip') === true) {

//把压缩文件内索引为0的文件修改成newname.txt

$zip->renameIndex(0,'newname.txt');

//把压缩文件内的new.txt修改成newword.txt

$zip->renameName('newname.txt','tip.txt');

//删除压缩文件内索引为0的文件

$zip->deleteIndex(0);

//删除压缩文件的img.png

$zip->deleteName('img.png');

// 关闭zip文件

$zip->close();

}

?>

漏洞复现:

这里我们将我们的php文件进行压缩

1678971134_641310fef3a280c1afac5.png!small

1678971145_641311090519dcfa8e87e.png!small

1678971152_64131110bd85f8b94cc02.png!small

1678971161_64131119b0a4d60fea794.png!small

REF:

https://cri1stur.github.io/2023/02/02/hadsky%E4%BB%A3%E7%A0%81%E5%AE%A1%E8%AE%A1/

https://wx.zsxq.com/dweb2/index/footprint/88455551854122

https://blog.csdn.net/qq_51577576/article/details/121985574


# web安全 # 系统安全 # 数据安全 # 漏洞分析 # 网络安全技术
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录