目錄
Pass-01(JS 繞過)
Pass-02(文件類型驗證)
Pass-03(黑名單驗證)
Pass-04(黑名單驗證.htaccess)
Pass-05(大小寫繞過)
Pass-06(末尾空格)
Pass-07(增加一個.)
Pass-08(增加一個::$DATA)?
Pass-09(代碼不嚴謹)
Pass-10(PPHPHP)
Pass-11(0x00 截斷)
Pass-12(Post 0x00 截斷)
Pass-13(圖片木馬)
Pass-14(圖片木馬)
Pass-15(圖片木馬)
Pass-16(二次渲染繞過)
Pass-17(條件競爭)
Pass-18(解析漏洞)
Pass-19(黑名單)
Pass-20(白名單)
Pass-01(JS 繞過)
1.保存當前頁面。
2.使用編輯器打開頁面,修改代碼。
3.修改成如下內容。
if (1 == -1 )?
4.打開我們下載的html文件,上傳我們的1.php,上傳成功。
Pass-02(文件類型驗證)
1.通過下面代碼可以看出,他驗證的是文件類型。
2.使用 bp 攔截,修改Content-Type: image/png。
3.放包之后就發現上傳成功。
Pass-03(黑名單驗證)
1.根據代碼我們發現是黑名單驗證。
2.根據apche服務器能夠使用php解析.phtml .php3,我們可以使用php3后綴嘗試上傳。
Pass-04(黑名單驗證.htaccess)
使用.htaccess(超文本訪問)是許多 Web 服務器根據目錄應用設置的有用文件,允許在運行時覆蓋 Apache 服務器的默認配置。使用.htaccess,我們可以在運行時輕松啟用或禁用任何功能。
<FilesMatch "loudong.jpg">SetHandler application/x-httpd-php</FilesMatch>






Pass-05(大小寫繞過)
代碼里面沒有驗證大寫,可以把文件名變成大寫
1.我們使用bp抓包進行修改。
2.上傳成功。
Pass-06(末尾空格)


Pass-07(增加一個.)


Pass-08(增加一個::$DATA)
在 window 的時候如果文件名+"::$DATA"會把::$DATA 之后的數據當成文件流處理,不會檢測后綴名,且保持::$DATA 之前的文件名,他的目的就是不檢查后綴名例如:"phpinfo.php::$DATA"Windows 會自動去掉末尾的::$DATA 變成"phpinfo.php"上面代碼沒有::$DATA,這塊的驗證

Pass-09(代碼不嚴謹)
借助的是代碼不嚴謹deldot,即從字符串的尾部開始,從后向前刪除點.,直到該字符串的末尾字符不是.為止。而如果中間有個空格,就不會繼續刪除
<?php
include '../common.php';
$file_name = deldot('image.jpg. .');//刪除文件名末尾的點
echo $file_name;
?>
使用bp抓包,在文件名后添加 ". ."
Pass-10(PPHPHP)
str_ireplace 函數用于字符串替換操作,不區分大小寫其語法是str_ireplace(find,replace,string,count)。參數 find 必需,規定要查找的值;replace 必需,規定替換 find 中的值的值;string 必需,規定被搜索的字符串。


Pass-11(0x00 截斷)
這個案例要求php 的 magic_quotes_gpc 為 OFF 狀態關鍵的代碼在于這里的’save_path 是一個可控的變量,但是后面還拼接上一個后綴名,也需要繞過


00 截斷是操作系統層的漏洞,由于操作系統是 C 語言或匯編語言編寫的,這兩種語言
在定義字符串時,都是以\0(即 0x00)作為字符串的結尾。操作系統在識別字符串
時,當讀取到\0 字符時,就認為讀取到了一個字符串的結束符號。因此,我們可以通
過修改數據包,插入\0 字符的方式,達到字符串截斷的目的。
我們這里上傳loudong.jpg。
再使用bp抓包修改。
Pass-12(Post 0x00 截斷)
和上面一題代碼對比,這里使用的是 Post 方式
但和 get 對比,需要多做一次解碼的工作
GET 型提交的內容會被自動進行 URL 解碼,在 POST 請求中,%00 不會被自動解碼
使用bp抓包修改
我們需要對%00進行url編碼,然后放包
Pass-13(圖片木馬)
這個案例會驗證上傳內容,確認是圖片格式,所以不能簡單把 php 轉化為 jpg,需要使用圖片木馬
copy image.png /b + info.php /a webshell.png






Pass-14(圖片木馬)
getimagesize() 函數用于獲取圖像大小及相關信息,成功返回一個數組,失敗則返回 FALSE 并產生一條 E_WARNING 級的錯誤信息
Pass-15(圖片木馬)
PHP 中的 exif_imagetype()函數用于確定圖像的類型。此函數讀取給定圖像的第一個字節并檢查其簽名。當找到正確的簽名時,則 exif_imagetype()返回適當的常量值;否則它返回 False。
和上面的題的步驟一樣
Pass-16(二次渲染繞過)
這個案例使用的是 imagecreatefromjpeg、imagecreatefrompng、imagecreatefromgif三個不同的方法來驗證不同的文件,繞過格式不正確,會報出異常但這題重新渲染了圖片,植入木馬的圖片實際已經被刪除了,這個案例建議使用 gif 的文件來上傳木馬,gif 最高支持 256 種顏色。由于這種特性,重新渲染改動不會太多!
?Nodepad++安裝新插件

Pass-17(條件競爭)
這個是白名單驗證,unlink 函數是刪除文件,rename 函數進行文件的移動(也會刪除源文件)
但仔細看這段代碼,是不管什么文件都能傳,但不管是否圖片,后門都刪除,可以考慮條件競爭
就是沒刪除之前,如果文件是打開的狀態,可能刪除失敗,這樣就能保留原理的文件
直接上傳一個1.php文件,然后進行抓包,將數據包發送至intruder下。
然后發包,用另一個瀏覽器一直訪問1.php地址,只要在上傳的一瞬間,他還沒來的及刪除、修改就可以了。
Pass-18(解析漏洞)
這里的話采用了白名單

Pass-19(黑名單)



Pass-20(白名單)
end() 函數將數組內部指針指向最后一個元素,并返回該元素的值,所以這個函數可以接受數組的
reset() 函數將內部指針指向數組中的第一個元素,并輸出,所以這個函數也可以接受數組的
count() 統計數組有多少個元素
既然可以接受數組
save_name[0]=upload-20.php
save_name[2]= jpg
這行代碼拼接的名字為
upload-20.php+"." +save_name[1]的數據
由于 save_name[1]沒有,結果為 upload-20.php.
使用bp抓包,并如下圖修改