upload-lab 靶場實戰


文件上傳/下載 漏洞

沖沖沖,好好學習 2020.02.13

淦靶場之前,先來點知識鋪墊鋪墊。
image
image

文件上傳漏洞

  1. 前端Js繞過。
  2. MIME類型繞過
  3. 后綴名大寫寫繞過 / php4 、php5
  4. 00截斷
  5. 覆蓋 .htaccess
  6. windows文件流特性繞過
  7. 雙寫文件名繞過
  8. 條件競爭

任意文件下載漏洞

如何查找任意文件下載漏洞:
1.查找傳入文件名的參數:
--> 導入文件等參數,要是直接輸入文件名,就有可能存在注入點。
2.注意如下幾參數名:
--> RealPath,FilePath,filepath,Path,path,inputFile,url,urls,Lang,dis,data,readfile,filep
--> src,menu,META-INF,WEB-INF
3.代碼中如何查找漏洞:
PHP為例,有如下等代碼,就有可能存在任意文件下載漏洞
--> readfile
--> fopen
--> file_get_contents

Windows敏感文件路徑
--> C:\boot.ini //查看系統版
--> C:\Windows\System32\inetsrv\MetaBase.xml //IIS配置文
--> C:\Windows\repair\sam //存儲系統初次安裝的密碼
--> C:\Program Files\mysql\my.ini //Mysql配置
--> C:\Program Files\mysql\data\mysql\user.MYD //Mysql
--> rootC:\Windows\php.ini //php配置信息
--> C:\Windows\my.ini //Mysql配置信息

Linux敏感文件路徑
--> /root/.ssh/authorized_keys
--> /root/.ssh/id_rsa
--> /root/.ssh/id_ras.keystore
--> /root/.ssh/known_hosts
--> /etc/passwd
--> /etc/shadow
--> /etc/my.cnf
--> /etc/httpd/conf/httpd.conf
--> /root/.bash_history
--> /root/.mysql_history
--> /proc/self/fd/fd[0-9]*(文件標識符)
--> /proc/mounts /porc/config.gz

上靶場 upload-lab

第一題:

image
發現上傳,發現了個彈窗,打算抓包來看看是個怎么回事,但是並沒有發現相關的數據包,因為這不是服務器返回的信息,而是來自網頁的前端校驗(可以查看源碼看看代碼),並不沒有發送數據到服務器,這樣做是為了提高用戶體驗,節省時間,馬上報錯。
我們看下源碼,是常規的前端JavaScript判斷后綴,但是后綴過不去。
image

解決辦法1. 先把一句話木馬的后綴改成允許通過的后綴形式,如:.jpg
然后打開burp suite ,瀏覽器點擊上傳,在bp里抓取到的數據包把后綴名改回 .php
image

jpg改成php 再forward
image
上傳成功,按一下
imageimage
再訪問一下這個URL看是不是 404 ,如果不是的話,就拿URL上菜刀。

解決辦法2.應為是js的代碼,可以在網頁按F12查看源碼,把checkFile()函數刪掉,或者改一下代碼,讓return true 。簡單粗暴解決js校驗。
image

插播一個知識點:

先介紹下:Content-Type 的常見幾種類型

text/plain          文本類型
text/css           css類型
text/html           html類型
application/x-javascript    js類型
application/json      json類型
image/png jpg gif       image/*
(/.+\.(png|jpg|gif)$/.test(pathname)) 匹配到圖片

第二題:

看了下源碼,沒有發現前端js校驗,那就是后台的了,開bp抓包。
選擇了個 一句話木馬 webshell.php 點擊上傳,抓包,改包
image

先把包send to repeater ,再把Content-Type:application/octet-stream改成 image/png jpg gif (根據題目要求),題目說要上傳圖片的。
image

發現上傳成功,並發現了保存位置 ../upload/webshell.php 在當前位置的上一級目錄的upload下。URL訪問,無404返回就上菜刀(用完記得清空緩存)。

第三題:

當題目說不讓上傳 提示:不允許上傳.asp,.aspx,.php,.jsp后綴文件!
這幾個后綴名的文件時,就用下面的替代被禁止的那些。
ASP: asa/cer/cdx
ASPX: ashx/asmx/ascx
PHP: php4/php5/phtml
JSP: jspx/jspf
就用對應的后綴名替代前面的那些。
不一定行,都試試吧。下圖是apache的配置文件,它是可以識別phtml后綴名的文件當作是php的來執行。但是這被注釋掉了,沒開,所以用不了,同理,其他的后綴不知道行不行。
image

抓包改包,用php4 后綴試了下,發現成功上傳了,URL訪問試試,沒有404,再上菜刀,
image
看到一句話木馬原樣輸出了,說明 .php4 后綴名的文件它不解析,那就換一個后綴名再試試,用 phtml再試試
image

image
其實右擊也是可以看到保存文件錄路徑的。
這里再回想以下,代碼能否解析取決於 配置文件里如何設置。
image
在這里后面加上其他格式的后綴名也行,如 .txt 的。

插播,什么是 .htaccess 文件

0x00前言
.htaccess文件是用於apache服務器下的控制文件訪問的配置文件,因此Nginx下是不會生效的。

.htaccess可以控制錯誤重定向,初始頁面設置,文件夾的訪問權限,文件的跳轉等。

Nginx如果直接訪問,可以下載該文件。如果是apache的話,正常情況下該文件是不可被訪問的,但是可以通過php的include之類的文件包含函數進行內容訪問。

其實最好不要用.htaccess文件,因為目錄多了后,每個目錄都有個.htaccess很難管理。

0x02設置文件訪問權限
我們可以在.htaccess中使用以下代碼拒絕1.php被訪問
image
image
如果要允許訪問,那么把deny from all 改為allow from all即可,那么如果要禁止某個ip訪問該文件
image
image
0x03錯誤重定向&重定向
image
image
image

特別注意:.htaccess文件在windows下沒法直接命名,Linux下是可以的
那怎辦呢,找到apache原有的那個 .htaccess文件 復制一個過來,再修改里面的內容即可。

第四題:

這題就是利用這個文件的設置,其實效果跟上一題的 改配置文件 是一樣的。
image
這樣的話, 03.jpg 文件就會被當做php代碼來編譯。就把一句話木馬文件名改成 03.jpg 就ok了。再上菜刀 。
第四題有點離譜哈,把第三題的方法禁止了,各種可能的文件后綴名都禁止掉了。
$deny_ext = array(".php",".php5",".php4",".php3",".php2",".php1",".html",".htm",".phtml",".pht",".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")

那,這種題型的繞過怎么防御呢? 因為apache只認 這個文件名.htaccess
image
先看看第三題,他的源碼里有這么一行代碼:
image
就是把上傳的圖片文件重命名,在前面加個隨機數,就會是這個樣子
image
那這個.htaccess文件就沒用了,apache不認它。

第五題:

先看下源碼,嗯哼?
image
一波騷操作把 .htaccess 也給你禁掉。那就禁吧...
image
再看一眼,發現,這些后綴名只是過濾了一部分,大小寫的換一下就能繞過來了,
比如: .Php、.PHp、等沒有過濾,就能用啦。
怎么防御?我們不建議用黑名單過濾,建議的是用白名單,只允許白名單中規定的幾種后綴名的文件上傳。

第六題:

這題的源碼,沒有為文件名后綴去空格功能。
image

利用win的特性(linux 沒有的)。文件的后綴名的后面加空格是沒有效果的,系統會自動刪掉。后面的空格沒了。在bp中改包
imageimage

選好文件,打開抓包,點擊上傳,bp改包,ok ,路徑知道了,就訪問看有無404,上菜刀。
image

第七題:

跟第六題差不多,在win下文件名后綴末尾加上 . (點號) 也是可以的繞過后台校驗。第七題源碼沒有刪除末尾的 .
image

做法跟第六題一模一樣。跳過不講了。

第八題:

php在window的時候如果文件名+"::$DATA"會把::$DATA之后的數據當成文件流處理,不會檢測后綴名.且保持"::$DATA"之前的文件名。其目的就是不檢查后綴名....
image
上傳成功。上菜刀。
image

第九題:

用個投機的方法把這題解決掉。先去看源碼:
image
這里對文件名:執行了一次去空格trim() ,再去點 deldot()
對后綴名:一次截取后綴名 strrchr() ,一次轉換為小寫 ,再一次去::$DATA,最后去空。
假如輸入的后綴名是 .php. . (點與點之間有個空格) ,經過deldot之后剩下 .php. (末尾有個空格),最后一步去空格,剩下就是.php.這就能成功繞過了。
這個思路挺猥瑣的,鑽空子。

第十題:

先回想一下,在SQL注入的時候,當union被過濾一次的時候,怎么辦?
那就用 uniunionon 嘛,當union被過濾后,剩下的就拼成了一個union 。同理的過濾多次的話就多拼幾個嘛。
這題也是類似的。源碼里的函數,把所有的后綴名都被吃掉了 一次 ,注意這個次數很關鍵,如果是循環的一直吃先去就很尷尬了
image

上傳,開bp 抓包,改后名。 pphphp ,注意這種情況:phphpp 但這也是:phphpp
所以刪完第一個php就剩下 hpp 了,這不對。有了URL,看看404沒,再上菜刀。
image
image

第11題:

思路是 00截斷。先抓包看看是個什么情況。
image
很神奇的看到了個GET類型的 save_path = ../upload/ 的參數,一看名字就知道是文件保存路徑,那就試試這個路徑是不是可控的,手動改變一下看看會怎樣,把 /upload/刪掉。
image

發現上傳成功了,證明路徑真的是可控的,自己能手動改變。那有能怎樣呢?
開腦洞:把路徑改為 ../upload/666.php ,直接在目錄里創建一個php文件,命名為 666.php ,然后再把文件上傳進去看會發生什么,
image

提示上傳出錯了,
那就加個%00 來截斷,這樣的話,上傳的文件就會被寫入了路徑后面創建的11.php文件里。
image
%00截斷有局限性,不一定能用 。得看php版本。

第12題:

抓包開始, 發現了個 POST型的參數其實跟第11題是差不多的。
image
按照上一題的思路,卻發現失敗了。
image
因為,在POST型參數里加%00是會被理解為 字符串的 %00 ,而不是十六進制的空格,所以換種方式加,先在 php后面放個 + 號(十六進制是:2b),文件名 改為 jpg再在后面到Hex加個空格。
image
找到 2b 把它改成 00
imageimage
然后ok發送

插播 常用文件頭:(利用文件頭判斷文件類型)

(1).JPEG; .JPE;.JPG, “JPGG raphic File"
(2).gif, "GIF 89A”
(3).zip, “Zip Compressed"
(4).doc; .xls; .xlt; .ppt; .apr , "MS Compound Document v1 or Lotus Approach APRfi1e"

JPEG (jpg), 文件頭: FFD8FF
PNG (png), 文件頭: 89504E47
GIF (gif), 文件頭: 47494638
TIFF (tif), 文件頭: 49492A00
Windows Bitmap (bmp), 文件頭: 424D
CAD (dwg), 文件頭: 41433130
Adobe Photoshop (psd), 文件頭: 38425053
Rich Text Format (rtf), 文件頭: 7B5C727466
XML (xml), 文件頭: 3C3F786D6C
HTML (html), 文件頭: 68746D6C3E
Email [thorough on ly] (eml), 文件頭: 44656C6966572792D646174653A
Outlook Exp ress (dbx), 文件頭: CFAD12FEC5FD746F
Outlook (pst), 文件頭: 2142444E
MS Word/Excel (xls.or.doc), 文件頭: D0CF11E0
MS Access (mdb), 文件頭: 5374616E64617264204A
WordPerfect (wpd), 文件頭: FF575043
Adobe Acrobat (pdf ), 文件頭: 255044462D312E
Quicken (qdf), 文件頭: AC9EBD8F
Windows Password (pwl) , 文件頭: E3828596
ZIP Archive (zip), 文件頭: 504B0304
RAR Archive (rar), 文件頭: 52617221
Wave (wav), 文件頭: 57415645
AVI (avi), 文件頭: 41564920
Real Audio (ram) , 文件頭: 2E7261FD
Real Media (rm), 文件頭: 2E524D46
MPEG (mpg), 文件頭: 000001BA
MPEG (mpg), 文件頭: 000001B3
Quicktime (mov), 文件頭: 6D6F6F76
Windows Media (asf ), 文件頭: 3026B2758E66CF11
MIDI (mid) , 文件頭: 4D546864

第13題:

法1:圖片碼繞過,直接計入文件頭
法2: 用圖片和一句話木馬拼接起來。百度有教程怎么做。
image
image
先來看看上傳個webshell.php試試,抓包
題目說只允許圖片類型的文件上傳,並且根據文件頭識別是不是圖片類型,那偽造一個文件頭吧,手動加入 GIF 89A ,上傳成功。
image
拿着路徑去測試,發現成功了,只顯示了GIF 89A,而PHP代碼成功解析了 。上菜刀。
image

第14題:

跟13題做法一樣,略了。14的代碼跟13 有細微不同,具體可以去研究一下。

第15題:

同上,區別在代碼的實現方式。等有空再去做一下代碼審計,對比一下這幾道題的異同。在這題,要打開php exif拓展 ,附方法,放在文檔末尾。
imageimage
上傳完用文件包含來檢查一下,看到最后的一句話木馬已經被解析了。上菜刀。
?file=./upload/9120200218014542.png
image

第16題:二次渲染

這題跟前面所有的題都不同。先研究一下源碼。
這題會吧上傳的圖片文件“加工”,加工后就把文件改了,前后文件發生變化,但也是有不發生變化的部分。先上傳一張沒有木馬的圖片,上傳成功后,另保存成功后的圖片,用軟件 winhex 查看圖片二進制信息,對比兩個圖片二進制上的差別,在第一張圖里不變的地方,插入一句話木馬。再把帶馬的圖傳上去,
image
再去包含里測試下,然后菜刀。

第17、18題:

條件競爭,筆記還沒放上來,在另一個腳本專題

第19題:%00 截斷

上傳,抓包,
image
---->image ->去hex改image image
完成,下面步驟略。

第20題:先抓包試試看。

image
先把 Content-Type 改成 image/jpeg
image

在后面介紹幾個上邊經常出現的PHP函數:

  1. trim() 函數移除字符串兩側的空白字符或其他預定義字符。
    還有相關的兩個函數:
    ltrim() - 移除字符串左側的空白字符或其他預定義字符。
    rtrim() - 移除字符串右側的空白字符或其他預定義字符。

語法:trim(string,charlist)
string: 必須 規定要檢查的字符串。
charlist:可選。規定從字符串中刪除哪些字符。如果省略該參數,則移除下列所有字符:
"\0" - NULL
"\t" - 制表符
"\n" - 換行
"\x0B" - 垂直制表符
"\r" - 回車
" " - 空格
例子:刪除“ Hedy!”

2.strrchr() 函數查找字符串在另一個字符串中最后一次出現的位置開始,並返回從該位置到字符串結尾的所有字符。找不到則返回 FALSE 。
語法:strrchr(string,char)
string : 必須參數。規定被檢索的字符串。
char :必須參數。規定要查找的字符串,若是數字的話就按ASCII碼對應的字符來。

3.str_ireplace() 函數替換字符串中的一些字符(不區分大小寫)。
語法:str_ireplace(find,replace,string,count)
find 必需。規定要查找的值。
replace 必需。規定替換 find 中的值的值。
string 必需。規定被搜索的字符串。
count 可選。一個變量,對替換數進行計數。
例子:$file_name = str_ireplace($deny_ext,"", $file_name); 在文件名$file_name中查找有沒有$deny_ext中包含的值,有的話就替換成 "" 空。


PHP exif擴展方法開啟詳解

本節主要介紹了如何開啟PHP exif擴展方法,主要在於對php.ini文件的修改

服務器配置說明:

1.在php.ini文件中找到;extension=php_exif.dll,去掉前面的分號
2.在php.ini文件中找到;extension=php_mbstring.dll,去掉前面的分號,並將此行移動到extension=php_exif.dll之前,使之首先加載*。

3.找到[exif]段,把下面語句的分號去掉。

;exif.encode_unicode = ISO-8859-15
;exif.decode_unicode_motorola = UCS-2BE
;exif.decode_unicode_intel = UCS-2LE
;exif.encode_jis =
;exif.decode_jis_motorola = JIS
;exif.decode_jis_intel = JIS


這部分算是完結了 2020.2.18 Bitores 漏洞修復的知識后面再補充。等等看什么時候有空專題研究 top10的漏洞修復


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM