關於原理方面就不加贅述了,可以Google一下,我貼一下幾百年前我的理解:原理:上傳一個腳本(jsp,asp,php),然后就得到機子的shell (哇,感覺很粗糙)
文件上傳漏洞的幾種常見的姿勢:
1.js前端驗證
2.mime
3.后綴名
4.修改字母大小寫(同第一種,就是把PHP幾種大小寫試一試 還有可能是phtml)
5.00截斷
6.上傳含有一句話的圖片
最簡單的:先直接上傳一個php文件,看是否正確
1.js前端驗證:
一般都是在網頁上寫一段JavaScript腳本,校驗上傳文件的后綴名,有白名單形式也有黑名單形式。
判斷方式:在瀏覽加載文件,但還未點擊上傳按鈕時便彈出對話框,內容如:只允許上傳.jpg/.jpeg/.png后綴名的文件,而此時並沒有發送數據包。
解決方法:
1):抓包,修改文件后綴名 比如:傳上去的是一個jpg格式,然后改成php 要看能不能傳上去 如果傳不上去就改后綴 然后抓包改成php
2):直接F9,HTML里面 將filename="xxser.jpg"修改為filename="1.php"
這里注意第二種,把長度修改了,要是之前Content-Length =200 這里就要修改為196
2.MIME驗證:
MIME類型用來設定某種擴展名文件的打開方式,當具有該擴展名文件被訪問時,
瀏覽器會自動使用指定的應用程序來打開。
1)content-type字段校驗:
GIF 圖片的MIME image/gif
CSS text/css
jpg image/jpg
比如:上傳了一個php,抓包,看到php的MIME類型為 application/php ,
而在Upload.php判斷文件類型是否為image/jpeg,這里就無法通過驗證
解決:在包里面把Content-Type 更改為 image/jpeg ,通過驗證
2)文件頭校驗
可以通過自己寫正則匹配,判斷文件頭內容是否符合要求,這里舉幾個常見的文件頭對應關系:
(1) .JPEG;.JPE;.JPG,”JPGGraphic File”
(2) .gif,”GIF 89A”
(3) .zip,”Zip Compressed”
(4) .doc;.xls;.xlt;.ppt;.apr,”MS Compound Document v1 or Lotus Approach APRfile”
解決辦法:在木馬內容基礎上再加了一些文件信息,有點像下面的結構
GIF89a<?php phpinfo(); ?>
3.后綴名( 00截斷) 這是一個講述截斷在文件上傳和包含之中的利用:http://www.2cto.com/article/201502/377462.html
客戶端傳輸到服務端 在服務端:緩存上傳的文件,然后服務器端進行驗證,如果符合要求,就上傳到目錄, 如果不符合,就直接把緩存文件刪除
方法:抓包,將上傳的1.jpg改成 2.php(空格)1.jpg 然后單擊HEX進入十六進制編輯,
將文件名中空格的十六進制20改成00 (這里就是去找到改的那句話),單擊“GO”
發現成功上傳2.php 2.php后面的字符已經被截斷(可以在Raw里面找到)
6.上傳含有一句話的圖片
上傳含有一句話的圖片,上菜刀,右鍵添加shell,地址欄輸入 上傳地址
講述中國菜刀用法:
這里上傳成功了(一般php都是傳自己寫的一句話木馬),就在網址欄得到網址欄了,打開菜刀,
右鍵添加,編碼格式選擇UTF-8,腳本類型PHP ,然后連接,shell拿到了,然后就開始可以去搞事情了
或者flag拿到了