文件上傳
無限制
直接上傳一句話后門,使用蟻劍連接:
獲得flag:
前端驗證
嘗試直接上傳后門,發現被攔截,經過判斷為Javascript
前端驗證:
這里可以使用Firefox瀏覽器插件禁用頁面js代碼,或者使用burp suite繞過前端驗證。
這里展示如何使用burp suite繞過前端驗證
先將文件名改為1.jpg
,上傳時通過burp suite將文件名修改為1.php
,即可繞過驗證。
使用蟻劍獲得flag。
.htaccess
.heaccess
是什么
.htaccess文件(或者"分布式配置文件")提供了針對目錄改變配置的方法, 即,在一個特定的文檔目錄中放置一個包含一個或多個指令的文件, 以作用於此目錄及其所有子目錄。作為用戶,所能使用的命令受到限制。
概述來說,htaccess文件是Apache服務器中的一個配置文件,它負責相關目錄下的網頁配置。通過htaccess文件,可以幫我們實現:網頁301重定向、自定義404錯誤頁面、改變文件擴展名、允許/阻止特定的用戶或者目錄的訪問、禁止目錄列表、配置默認文檔等功能。
簡單來說,就是我上傳了一個.htaccess文件到服務器,那么服務器之后就會將特定格式的文件以php格式解析。
.htaccess
漏洞利用
//方法一
SetHandler application/x-httpd-php //所有的文件當做php文件來解析
//方法二
AddType application/x-httpd-php .jpg //.jpg文件當作php文件解析
題解過程
構造.htaccess
文件並上傳。
上傳一句話后門,使用蟻劍類工具連接,獲得flag:
MIME驗證
MIME是什么
多用途互聯網郵件擴展類型。它設計的最初目的是為了在發送電子郵件時附加多媒體數據,讓郵件客戶程序能根據其類型進行處理。然而當它被HTTP協議支持之后,它的意義就更為顯著了。它使得HTTP傳輸的不僅是普通的文本,而變得豐富多彩。
每個MIME類型由兩部分組成,前面是數據的大類別,例如聲音audio、圖象image等,后面定義具體的種類。
常見的MIME類型
超文本標記語言文本 .html text/html
普通文本 .txt text/plain
GIF圖形 .gif image/gif
JPEG圖形 .jpeg,.jpg image/jpeg
服務端MIME類型檢測是通過檢查http包的Content-Type字段中的值來判斷上傳文件是否合法的。那就好辦了,不管我上傳什么類型的文件,我只要修改Content-Type字段來讓檢測通過就行了。
題解過程
上傳php文件,提示:
查看源代碼,發現沒有前端驗證,猜測為MIME驗證。
修改Content-Type
上傳成功:
使用蟻劍連接,得到flag
文件頭檢測
上傳php文件,顯示錯誤,提示如下:
修改MIME為jpg格式上傳:
顯示錯誤,提示如下:
猜測應該是對文件內容檢測。
制作圖片馬:
copy 原圖片.jpg/b + 后門.php/a 圖片馬.php
b表示二進制文件
a表示ASCII碼文件
使用蟻劍連接,得到flag
00截斷
00截斷原理
0x00是十六進制表示方法,是ascii碼為0的字符,在有些函數處理時,會把這個字符當做結束符。這個可以用在對文件類型名的繞過上。
00截斷的利用方法
我以前以為所謂00截斷就是在文件名中加%00
進行截斷,但這種方式是不對的,為什么呢?比如攻擊者構造文件名:admintony.php%00a.jpg
,在提取后綴名的時候遇到%00
則認為字符串結束了,那么他提取到的后綴名會是.php
,.php
后綴又不允許上傳所以上傳失敗了。
應該在數據包中必須含有上傳后文件的目錄情況才可以用,比如數據包中存在path: uploads/
,那么攻擊者可以通過修改path的值來構造paylod: uploads/aa.php%00
為什么修改path才可以,因為程序中檢測的是文件的后綴名,如果后綴合法則拼接路徑和文件名,那么攻擊者修改了path以后的拼接結果為:uploads/aaa.php%00/2018051413370000.php
,移動文件的時候會將文件保存為uploads/aaa.php
,從而達到Getshell效果。
題解過程
上傳php文件,進行測試
發現url中包含上傳路徑,猜測是文件名拼接在目錄名后再進行后綴的驗證。
使用00
截斷,%00是被服務器解碼為0x00發揮了截斷作用
蟻劍,flag:
源碼分析
<?php
header("Content-type: text/html;charset=utf-8");
error_reporting(0);
//設置上傳目錄
define("UPLOAD_PATH", dirname(__FILE__) . "/upload/");
define("UPLOAD_URL_PATH", str_replace($_SERVER['DOCUMENT_ROOT'], "", UPLOAD_PATH));
if (!file_exists(UPLOAD_PATH)) {
mkdir(UPLOAD_PATH, 0755);
}
if (!empty($_POST['submit'])) {
$name = basename($_FILES['file']['name']);
$info = pathinfo($name);
$ext = $info['extension'];
$whitelist = array("jpg", "png", "gif");
if (in_array($ext, $whitelist)) {
$des = $_GET['road'] . "/" . rand(10, 99) . date("YmdHis") . "." . $ext;
if (move_uploaded_file($_FILES['file']['tmp_name'], $des)) {
echo "<script>alert('上傳成功')</script>";
} else {
echo "<script>alert('上傳失敗')</script>";
}
} else {
echo "文件類型不匹配";
}
}
?>
basename(path,suffix) //函數返回路徑中的文件名部分。
參數 | 描述 |
---|---|
path | 必需。規定要檢查的路徑。 |
suffix | 可選。規定文件擴展名。如果文件有 suffix,則不會輸出這個擴展名。 |
pathinfo() //返回一個關聯數組包含有 path 的信息。
<?php
print_r(pathinfo("/testweb/test.txt"));
?>
/*
Array
(
[dirname] => /testweb
[basename] => test.txt
[extension] => txt
)
*/
將上傳的文件統一重新命名,在這里發生了截斷,實現了攻擊。
雙寫后綴
$name = basename($_FILES['file']['name']);
$blacklist = array("php", "php5", "php4", "php3", "phtml", "pht", "jsp", "jspa", "jspx", "jsw", "jsv", "jspf", "jtml", "asp", "aspx", "asa", "asax", "ascx", "ashx", "asmx", "cer", "swf", "htaccess", "ini");
$name = str_ireplace($blacklist, "", $name);
代碼僅將黑名單替換為空白,只需要構造:.pphphp
,就可以繞過。
上傳后門,蟻劍,flag