中間件漏洞
IIS
- IIS6.0文件解析 xx.asp;.jpg
- IIS6.0目錄解析 xx.asp/1.jpg
- IIS 7.0畸形解析 xxx.jpg/x.asp
Apache
- %0a(CVE-2017-15715)
- 未知后綴 test.php.xxx
Nginx
- 訪問連接加/xxx.php test.jpg/xxx.php
- 畸形解析漏洞 test.jpg%00xxx.php
- CVE-2013-4547 test.jpg(非編碼空格)\0x.php
Tomcat
- xxx.jsp/
- xxx.jsp%20
- xxx.jsp::$DATA
Upload-Labs練習(xí)
pass-01
傳一個php文件上去,點上傳,彈窗說該文件不允許上傳,根據(jù)處理的速度推斷應(yīng)該是前端判斷文件是否合法惕医,故查看源碼,果然有一段javascript:
<script type="text/javascript">
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 + "類型的文件,當(dāng)前文件類型為:" + ext_name;
alert(errMsg);
return false;
}
}
</script>
我們直接在頁面元素中將onsubmit事件刪除榨呆,就可以上傳了情组。
也可以修改文件名稱為1.jpg沙峻,然后用burp suite抓包修改文件名為1.php暖夭,繞過前端檢查锹杈。
pass-02
上傳1.jpg然后burpsuite修改后綴即可撵孤。
$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.'文件夾不存在,請手工創(chuàng)建邪码!';
}
}
可以看到,服務(wù)端通過檢查MIME來確定文件類型
pass-03
上傳一個.php文件咬清,提示不允許上傳asp,aspx,php,jsp后綴文件闭专,那么我們就從后綴下手
Apache服務(wù)器有一個特性,會從右往左開始解析文件后綴旧烧,如果最右邊的擴展名不可識別影钉,就繼續(xù)往左判斷,直到遇到可以識別的后綴為止掘剪,所以這里我們上傳 1.php.xxxxx 即可繞過
$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); //轉(zhuǎn)換為小寫
$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 . '文件夾不存在,請手工創(chuàng)建!';
}
}
既然基于黑名單判斷夺谁,那么我們需要知道Apache可以解析php,phtml后綴的文件廉赔,故上傳 1.phtml直接繞過
pass-04
- 此處基于依舊可以通過上傳 1.php.xxxx 繞過檢查
- 上傳.htaccess進行覆蓋也可以:
上傳一個.htaccess文件含有以下內(nèi)容:
SetHandler application/x-httpd-php
或是
<FilesMatch ".jpg">
SetHandler application/x-httpd-php
</FilesMatch>
然后隨便上傳任意后綴的文件,apache均會當(dāng)作php解析.
源碼:
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists($UPLOAD_ADDR)) {
$deny_ext = array(".php",".php5",".php4",".php3",".php2","php1",".html",".htm",".phtml",".pHp",".pHp5",".pHp4",".pHp3",".pHp2","pHp1",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf");
$file_name = trim($_FILES['upload_file']['name']);
$file_name = deldot($file_name);//刪除文件名末尾的點
$file_ext = strrchr($file_name, '.');
$file_ext = strtolower($file_ext); //轉(zhuǎn)換為小寫
$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 = '此文件不允許上傳!';
}
} else {
$msg = $UPLOAD_ADDR . '文件夾不存在,請手工創(chuàng)建匾鸥!';
}
}
pass-05
- 利用apache解析特性上傳1.php.xxxx繞過
- 查看源碼發(fā)現(xiàn)沒有對文件名進行大小寫統(tǒng)一蜡塌,故1.PHP既可繞過驗證
pass-06
- 利用apache解析特性上傳1.php.xxxx繞過
- 用Burpsuite抓包修改文件名,后綴末尾加空格即可繞過
pass-07
- 直接上傳1.php.xxxx
- 在文件后綴名加 . (Windows系統(tǒng)會自動去除文件名末尾的.和空格)
pass-08
看源碼發(fā)現(xiàn)這里沒有對文件名進行去 ::DATA 即可繞過馏艾。
pass-09
查看源碼的過濾規(guī)則,將文件名設(shè)置為 '1.php. .' 即可繞過規(guī)則檢查
pass-10
程序使用str_ireplace函數(shù)替換掉了文件名中的敏感字笆环,但該函數(shù)只會匹配一次攒至,
故我們雙寫后綴名來繞過: 1.pphphp
pass-11
查看源碼發(fā)現(xiàn)使用白名單過濾厚者,但通過url中通過get方式提交了 save_path 參數(shù)躁劣,并將其拼接到文件名中,
故我們修改 /?sava_path=../upload/1.php%00 使用%00將 $_GET('save_path') 后面的文件名截斷库菲。
然后上傳1.jpg繞過
$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
$ext_arr = array('jpg','png','gif');
$file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
if(in_array($file_ext,$ext_arr)){
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
if(move_uploaded_file($temp_file,$img_path)){
$is_upload = true;
}
else{
$msg = '上傳失斦送!';
}
}
else{
$msg = "只允許上傳.jpg|.png|.gif類型文件熙宇!";
}
}
pass-12
與pass-11無異鳖擒,只是將提交save_path參數(shù)的方法改成了POST,用burpsuite抓包修改即可烫止。
pass-13
查看源碼發(fā)現(xiàn)通過讀取文件前兩個字節(jié)判斷文件類型蒋荚,所以需要我們制作圖片馬:
copy normal.jpg/b+shell.php/a webshell.jpg
參數(shù)/b指定以二進制格式復(fù)制、合并文件; 用于圖像類/聲音類文件
參數(shù)/a指定以ASCII格式復(fù)制馆蠕、合并文件期升。用于txt等文檔類文件
pass-14
程序通過使用 getimagesize() 函數(shù)獲取圖片信息惊奇,故仍制作圖片馬繞過檢查
pass-15
程序通過使用 exif_imagetype() 函數(shù)獲取文件類型,故仍制作圖片馬繞過檢查
pass-16
查看源碼看到后端程序?qū)D片進行了imagecreatefromgif()操作播赁,即判斷文件是否為合法gif文件颂郎,
這里我們上傳圖片馬,然后用burpsuite抓包容为,在 Content-Type 下兩行乓序,即文件內(nèi)容開頭處添加
GIF89a ,即可繞過驗證
繞過imagecreatefromgif()函數(shù)的方法
https://secgeek.net/bookfresh-vulnerability/
pass-17
競爭條件
pass-18
競爭條件
pass-19
在文件名處使用0x00截斷符繞過