龙空技术网

PHP代码审计之HadSky

区块软件开发 109

前言:

现在你们对“php个人博客开发教程”大约比较注重,小伙伴们都需要了解一些“php个人博客开发教程”的相关内容。那么小编在网上汇集了一些对于“php个人博客开发教程””的相关知识,希望大家能喜欢,同学们一起来了解一下吧!

环境搭建:

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

接着进入安装过程。

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

代码审计:路由分析

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

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

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

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

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

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

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

该文件

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

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

1.任意文件写入漏洞

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

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

file_get_contents() ,

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

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

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

漏洞复现:

我们构造路由进行测试,

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

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

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

访问看看。

2.任意文件删除漏洞

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

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

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

漏洞复现:

进入安装目录下。

使用burpsuite进行抓包。

成功删除新建的文件。

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

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

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

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

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

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

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

漏洞复现:

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

成功触发phpinfo

4.任意文件读取漏洞

全局危险函数 file_get_contents( 。

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

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

json形式进行回显。

漏洞复现:5.模板上传绕过getshell

进入后台的上传功能。

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

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

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

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

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

下面是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文件进行压缩

REF:

from

标签: #php个人博客开发教程 #php回显