PHP-代码审计-文件上传
生活随笔
收集整理的這篇文章主要介紹了
PHP-代码审计-文件上传
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
函數
move_uploaded_file
move_uploaded_file ( string $filename , string $destination ) : bool
-
$filename 上傳的文件的文件名。
-
$destination 移動文件到這個位置。
-
本函數檢查并確保由 filename 指定的文件是合法的上傳文件(即通過 PHP 的 HTTP POST
上傳機制所上傳的)。如果文件合法,則將其移動為由 destination 指定的文件。 -
move_uploaded_file—>傳送門1
move_uploaded_file—> 傳送門2
文件上傳漏洞
- 文件上傳漏洞是最早的漏洞,也是最容易理解的漏洞,代碼都寫再文件里面執行,如果能吧文件上傳到管理員或者應用程序不想讓你上傳的目錄,那就存在文件上傳漏洞。
挖洞經驗
-
文件上傳中的上傳點都是調用一個上傳類,上傳函數為move_uploaded_file()
-
而文件上傳又只有這一個函數,所以文件上傳在代碼審計的時候,最快的方式就是去搜索 move_uploaded_file()函數
幾個文件上傳漏洞代碼分析
未過濾或本地過濾
move_uploaded_file($_FILES["file"]["tmp_name"],$FILES["file"]["name"])- move_uploaded_file 函數直接吧上傳的臨時文件copy到新文件
黑名單擴展名過濾
PHPCMSv9限制
1. 限制擴展名不夠全
- 上傳文件格式不可預測的性質導致了可能有漏魚之網擴展名
- 不同的WebServer 默認有不同的可以解析的
- 下面的驗證就有了漏魚之網,并沒過濾cdx,存在繞過
2. 限制擴展名的方式有文件
function getExt($filename){return substr($filename,strripos($filename,'.'+1));$disallowed_types =array("php","asp","aspx"); //獲取文件擴展名 $FilenameExt = strtolower(getExt($_FILES["file"]["name"])); #判斷是否在允許的擴展名里面 if(in_array($FilenameExt,$disallowed_types)){die("disallowe type");} else {$filename = time().".".$FilenameExt;move_uploaded_file($_FILES["file"]["tmp_name"],"upload/".$FileName); }- 這段diamond的問題在獲取文件擴展名與驗證擴展名。
- 如果我們上傳文件名 的時候為 " 1.php",注意后面有一個空格,則這里$FilenameEXT的值為"php空格",后面有一個空格,
- 這時候inarray(FilenameExt,FilenameExt,FilenameExt,disallowed_types) 是返回false,最終成功上傳文件
文件頭content-type驗證繞過
- 只要在文件頭中加上GIF89a后上傳,則通過,這是因為程序用了一先不可靠的函數去判斷是不是圖片文件,比如getmagesize()函數
- 找一段段存在該漏洞的代碼 可以看到就驗證了contet-type類,我們抓包修改為該類型也許就繞過了
條件競爭上傳
傳送門—>條件競爭
FUZZ文件上傳
傳輸門—>在該文章實驗七
還有更多繞過姿勢,該文章只是講一下上傳代碼分析基本思路
總結
以上是生活随笔為你收集整理的PHP-代码审计-文件上传的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHP-代码审计-文件读取(下载)
- 下一篇: PHP-代码审计-文件删除