freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

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

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安全 # 系统安全 # 数据安全 # 漏洞分析 # 网络安全技术
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录