前言:
现在你们对“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回显