文件上傳/下載 漏洞
沖沖沖,好好學習 2020.02.13
淦靶場之前,先來點知識鋪墊鋪墊。
文件上傳漏洞
- 前端Js繞過。
- MIME類型繞過
- 后綴名大寫寫繞過 / php4 、php5
- 00截斷
- 覆蓋 .htaccess
- windows文件流特性繞過
- 雙寫文件名繞過
- 條件競爭
任意文件下載漏洞
如何查找任意文件下載漏洞:
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
第一題:
發現上傳,發現了個彈窗,打算抓包來看看是個怎么回事,但是並沒有發現相關的數據包,因為這不是服務器返回的信息,而是來自網頁的前端校驗(可以查看源碼看看代碼),並不沒有發送數據到服務器,這樣做是為了提高用戶體驗,節省時間,馬上報錯。
我們看下源碼,是常規的前端JavaScript判斷后綴,但是后綴過不去。
解決辦法1. 先把一句話木馬的后綴改成允許通過的后綴形式,如:.jpg
然后打開burp suite ,瀏覽器點擊上傳,在bp里抓取到的數據包把后綴名改回 .php
把jpg
改成php
再forward
上傳成功,按一下
再訪問一下這個URL看是不是 404 ,如果不是的話,就拿URL上菜刀。
解決辦法2.應為是js的代碼,可以在網頁按F12查看源碼,把checkFile()函數刪掉,或者改一下代碼,讓return true 。簡單粗暴解決js校驗。
插播一個知識點:
先介紹下: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 點擊上傳,抓包,改包
先把包send to repeater ,再把Content-Type:application/octet-stream改成 image/png jpg gif (根據題目要求),題目說要上傳圖片的。
發現上傳成功,並發現了保存位置 ../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的來執行。但是這被注釋掉了,沒開,所以用不了,同理,其他的后綴不知道行不行。
抓包改包,用php4 后綴試了下,發現成功上傳了,URL訪問試試,沒有404,再上菜刀,
看到一句話木馬原樣輸出了,說明 .php4
后綴名的文件它不解析,那就換一個后綴名再試試,用 phtml
再試試
其實右擊也是可以看到保存文件錄路徑的。
這里再回想以下,代碼能否解析取決於 配置文件里如何設置。
在這里后面加上其他格式的后綴名也行,如 .txt
的。
插播,什么是 .htaccess 文件
0x00前言
.htaccess文件是用於apache服務器下的控制文件訪問的配置文件,因此Nginx下是不會生效的。
.htaccess可以控制錯誤重定向,初始頁面設置,文件夾的訪問權限,文件的跳轉等。
Nginx如果直接訪問,可以下載該文件。如果是apache的話,正常情況下該文件是不可被訪問的,但是可以通過php的include之類的文件包含函數進行內容訪問。
其實最好不要用.htaccess文件,因為目錄多了后,每個目錄都有個.htaccess很難管理。
0x02設置文件訪問權限
我們可以在.htaccess中使用以下代碼拒絕1.php被訪問
如果要允許訪問,那么把deny from all 改為allow from all即可,那么如果要禁止某個ip訪問該文件
0x03錯誤重定向&重定向
特別注意:.htaccess文件在windows下沒法直接命名,Linux下是可以的
那怎辦呢,找到apache原有的那個 .htaccess文件 復制一個過來,再修改里面的內容即可。
第四題:
這題就是利用這個文件的設置,其實效果跟上一題的 改配置文件 是一樣的。
這樣的話, 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
先看看第三題,他的源碼里有這么一行代碼:
就是把上傳的圖片文件重命名,在前面加個隨機數,就會是這個樣子
那這個.htaccess文件就沒用了,apache不認它。
第五題:
先看下源碼,嗯哼?
一波騷操作把 .htaccess 也給你禁掉。那就禁吧...
再看一眼,發現,這些后綴名只是過濾了一部分,大小寫的換一下就能繞過來了,
比如: .Php、.PHp、等沒有過濾,就能用啦。
怎么防御?我們不建議用黑名單過濾,建議的是用白名單,只允許白名單中規定的幾種后綴名的文件上傳。
第六題:
這題的源碼,沒有為文件名后綴去空格功能。
利用win的特性(linux 沒有的)。文件的后綴名的后面加空格是沒有效果的,系統會自動刪掉。后面的空格沒了。在bp中改包
選好文件,打開抓包,點擊上傳,bp改包,ok ,路徑知道了,就訪問看有無404,上菜刀。
第七題:
跟第六題差不多,在win下文件名后綴末尾加上 . (點號) 也是可以的繞過后台校驗。第七題源碼沒有刪除末尾的 .
做法跟第六題一模一樣。跳過不講了。
第八題:
php在window的時候如果文件名+"::$DATA"會把::$DATA之后的數據當成文件流處理
,不會檢測后綴名
.且保持"::$DATA"之前的文件名。其目的就是不檢查后綴名....
上傳成功。上菜刀。
第九題:
用個投機的方法把這題解決掉。先去看源碼:
這里對文件名:執行了一次去空格trim()
,再去點 deldot()
。
對后綴名:一次截取后綴名 strrchr()
,一次轉換為小寫 ,再一次去::$DATA
,最后去空。
假如輸入的后綴名是 .php. .
(點與點之間有個空格) ,經過deldot之后剩下 .php. (末尾有個空格),最后一步去空格,剩下就是.php.這就能成功繞過了。
這個思路挺猥瑣的,鑽空子。
第十題:
先回想一下,在SQL注入的時候,當union被過濾一次的時候,怎么辦?
那就用 uniunionon
嘛,當union被過濾后,剩下的就拼成了一個union 。同理的過濾多次的話就多拼幾個嘛。
這題也是類似的。源碼里的函數,把所有的后綴名都被吃掉了 一次 ,注意這個次數很關鍵,如果是循環的一直吃先去就很尷尬了。
上傳,開bp 抓包,改后名。 pphphp ,注意這種情況:phphpp 但這也是:phphpp
所以刪完第一個php就剩下 hpp 了,這不對。有了URL,看看404沒,再上菜刀。
第11題:
思路是 00截斷。先抓包看看是個什么情況。
很神奇的看到了個GET類型的 save_path = ../upload/
的參數,一看名字就知道是文件保存路徑,那就試試這個路徑是不是可控的,手動改變一下看看會怎樣,把 /upload/刪掉。
發現上傳成功了,證明路徑真的是可控的,自己能手動改變。那有能怎樣呢?
開腦洞:把路徑改為 ../upload/666.php
,直接在目錄里創建一個php文件,命名為 666.php
,然后再把文件上傳進去看會發生什么,
提示上傳出錯了,
那就加個%00 來截斷,這樣的話,上傳的文件就會被寫入了路徑后面創建的11.php文件里。
%00截斷有局限性,不一定能用 。得看php版本。
第12題:
抓包開始, 發現了個 POST型的參數其實跟第11題是差不多的。
按照上一題的思路,卻發現失敗了。
因為,在POST型參數里加%00是會被理解為 字符串的 %00 ,而不是十六進制的空格,所以換種方式加,先在 php后面放個 +
號(十六進制是:2b
),文件名 改為 jpg再在后面到Hex加個空格。
找到 2b 把它改成 00
然后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: 用圖片和一句話木馬拼接起來。百度有教程怎么做。
先來看看上傳個webshell.php試試,抓包
題目說只允許圖片類型的文件上傳,並且根據文件頭識別是不是圖片類型,那偽造一個文件頭吧,手動加入 GIF 89A ,上傳成功。
拿着路徑去測試,發現成功了,只顯示了GIF 89A,而PHP代碼成功解析了 。上菜刀。
第14題:
跟13題做法一樣,略了。14的代碼跟13 有細微不同,具體可以去研究一下。
第15題:
同上,區別在代碼的實現方式。等有空再去做一下代碼審計,對比一下這幾道題的異同。在這題,要打開php exif拓展 ,附方法,放在文檔末尾。
上傳完用文件包含來檢查一下,看到最后的一句話木馬已經被解析了。上菜刀。
?file=./upload/9120200218014542.png
第16題:二次渲染
這題跟前面所有的題都不同。先研究一下源碼。
這題會吧上傳的圖片文件“加工”,加工后就把文件改了,前后文件發生變化,但也是有不發生變化的部分。先上傳一張沒有木馬的圖片,上傳成功后,另保存成功后的圖片,用軟件 winhex 查看圖片二進制信息,對比兩個圖片二進制上的差別,在第一張圖里不變的地方,插入一句話木馬。再把帶馬的圖傳上去,
再去包含里測試下,然后菜刀。
第17、18題:
條件競爭,筆記還沒放上來,在另一個腳本專題
第19題:%00 截斷
上傳,抓包,
----> ->去hex改
完成,下面步驟略。
第20題:先抓包試試看。
先把 Content-Type 改成 image/jpeg
在后面介紹幾個上邊經常出現的PHP函數:
- 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的漏洞修復