[程式碼審計]php上傳漏洞總結
背景:
這兩天在網上瞎看,看到別人總結的一個上傳漏洞靶場,覺得很不錯,就是自己測試了下,
感覺對程式碼審計能力提高還是有幫助的,下面簡單介紹靶場的解題思路(當然,每一題可能存在多種上傳方式)。
靶場地址:https://github.com/c0ny1/upload-labs
一、環境搭建
建議使用靶場提供的測試環境。
二、解題思路
Pass-01:
檢查程式碼:
function checkFile() {
var file = document.getElementsByName('upload_file')[0].value;
if (file == null || file == "") {
alert("請選擇要上傳的檔案!");
return false;
}
//定義允許上傳的檔案型別
var allow_ext = ".jpg|.png|.gif";
//提取上傳檔案的型別
var ext_name = file.substring(file.lastIndexOf("."));
//判斷上傳檔案型別是否允許上傳
if (allow_ext.indexOf(ext_name + "|") == -1) {
var errMsg = "該檔案不允許上傳,請上傳" + allow_ext + "型別的檔案,當前檔案型別為:" + ext_name;
alert(errMsg);
return false;
}
}
由程式碼可知程式僅用js在前端做了簡單的字尾名檢查,很容易繞過。
本地目錄放兩個檔案,一個phpinfo.png,一個phpinfo.php。 上傳phpinfo.png抓包,在這將png改成php即可。
Pass-02:
檢查程式碼:
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists($UPLOAD_ADDR)) {
if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) {
if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR . '/' . $_FILES['upload_file']['name'])) {
$img_path = $UPLOAD_ADDR . $_FILES['upload_file']['name'];
$is_upload = true;
}
} else {
$msg = '檔案型別不正確,請重新上傳!';
}
} else {
$msg = $UPLOAD_ADDR.'資料夾不存在,請手工建立!';
}
}
這裡僅對上傳type型別做了判斷。
這裡將Content-Type: application/octet-stream修改成Content-Type: image/png即可。
Pass-03:
檢查程式碼:
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists($UPLOAD_ADDR)) {
$deny_ext = array('.asp','.aspx','.php','.jsp');
$file_name = trim($_FILES['upload_file']['name']);
$file_name = deldot($file_name);//刪除檔名末尾的點
$file_ext = strrchr($file_name, '.');
$file_ext = strtolower($file_ext); //轉換為小寫
$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字串::$DATA
$file_ext = trim($file_ext); //收尾去空
if(!in_array($file_ext, $deny_ext)) {
if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR. '/' . $_FILES['upload_file']['name'])) {
$img_path = $UPLOAD_ADDR .'/'. $_FILES['upload_file']['name'];
$is_upload = true;
}
} else {
$msg = '不允許上傳.asp,.aspx,.php,.jsp字尾檔案!';
}
} else {
$msg = $UPLOAD_ADDR . '資料夾不存在,請手工建立!';
}
}
這裡只對基本型別做了簡單的判斷,可以上傳php3,php5等型別的檔案,由於我的環境配的不能解析php3等類似的檔案,所以這裡我們上傳.htaccess檔案,內容如下
AddType application/x-httpd-php .jpg
意思讓伺服器將.jpg檔案當做php解析。
然後在上傳phpinfo.jpg即可。
=======================================
*後面的請參考(歡迎訂閱我的專欄):
https://xiaozhuanlan.com/topic/7036829451*
相關文章
- 程式碼審計之邏輯上傳漏洞挖掘
- 米安程式碼審計 05 檔案上傳漏洞
- PHP程式碼審計學習總結PHP
- PHP程式碼審計 XSS反射型漏洞PHP反射
- Java程式碼審計篇 - ofcms系統審計思路講解 - 篇3 - 檔案上傳漏洞審計Java
- 米安程式碼審計 06 PHPYUN V3.0 任意檔案上傳漏洞PHP
- 程式碼審計入門總結
- PHP程式碼審計PHP
- PHP程式碼審計03之例項化任意物件漏洞PHP物件
- 檔案上傳漏洞總結(全)
- 3. 檔案上傳漏洞——漏洞總結筆記筆記
- [JavaWeb]Shiro漏洞集合——程式碼審計JavaWeb
- 米安程式碼審計 07 越權漏洞
- 漏洞重溫之檔案上傳(總結)
- PHP審計之PHP反序列化漏洞PHP
- java程式碼審計人工漏洞檢測方法Java
- 米安程式碼審計 04 截斷漏洞剖析
- 【PHP程式碼審計】Null字元問題PHPNull字元
- PHP程式碼審計常用工具PHP
- PHP程式碼審計——Day 5-postcardPHP
- php原始碼審計PHP原始碼
- 檔案上傳漏洞全面滲透姿勢總結
- Java程式碼審計篇 - ofcms系統審計思路講解 - 篇4 - XXE漏洞審計Java
- php程式碼審計分段學習(php_bug)[2]PHP
- Java程式碼審計篇 - ofcms系統審計思路講解 - 篇2 - SQL隱碼攻擊漏洞審計JavaSQL
- 基於php審計關鍵詞審計技巧總結 網路安全學習PHP
- PHP程式碼審計——Day2-TwigPHP
- 網站程式碼漏洞審計挖掘與修復方法網站
- 網站漏洞檢測 wordpress sql注入漏洞程式碼審計與修復網站SQL
- 記一次完整的PHP程式碼審計——yccms v3.4審計PHP
- PHP程式碼審計歸納-Ali0thPHP
- PHP程式碼審計——Day3-Snow FlakePHP
- php 非同步上傳圖片幾種方法總結PHP非同步
- PHP 程式碼優化技巧總結PHP優化
- PHP函式漏洞審計之addslashes函式-PHP函式
- PHP反序列化漏洞總結PHP
- PHP程式碼審計01之in_array()函式缺陷PHP函式
- php程式碼審計之——phpstorm動態除錯PHPORM除錯