之前搭好了靶場,Upload-labs 靶場搭建 及一句話木馬的原理與運用-CSDN博客
今天開始通關并寫詳細流程
Pass-1
來到靶場的第一關
先隨便上傳php 代碼
點擊上傳
發現文件類型被限制了
方法1:
改文件后綴為合法文件(.jpg .png .gif),再抓包修改回php文件
例如我將它改為.jpg
改完后打開bp抓包,然后點擊上傳
抓到包后修改文件后綴 .jpg為.php
改為
?然后發送,回到上傳頁面,因為木馬已經經過前端驗證又改為php文件,所以木馬被執行
右鍵上傳成功的圖片,新標簽頁打開
其實這里剛開始我上傳的一句話木馬是<?php @eval($_POST['a']);?>
但上傳打開圖片鏈接就出現服務器錯誤,無法顯示上傳的文件
這里說一下為什么要先改后綴再上傳抓包改后綴
因為文件上傳以后數據包是從客戶端發往服務端,而bp抓包是相當于在服務端抓,js前端驗證是在客戶端進行的,這樣一來因為這題是js前端驗證,木馬文件要先進行js前端驗證才能進行抓包,而.php文件后綴是被js禁止上傳的,也就是說該木馬文件連第一步前端驗證都沒通過,抓包是抓不了的。(所以要先改為jpg后綴繞過js前端驗證,再進行抓包改為php就能上傳木馬成功)
后來在別處得知運用到<?php phpinfo();?>
<?php phpinfo();?>
是一段簡單的 PHP 代碼,用于顯示當前服務器的 PHP 配置信息
<?php ... ?>
:PHP 的起始和結束標簽,包裹其中的 PHP 代碼。
phpinfo();
:PHP 內置函數,調用后會生成一個完整的 HTML 頁面,包含服務器的 PHP 環境信息。
顯示 PHP 配置
包括:
PHP 版本、運行模式(如 CLI 或 Apache 模塊)。
編譯選項(如支持的擴展、安全設置)。
服務器環境變量(如 $_SERVER
內容)。
已加載的擴展(如 MySQL、GD 庫等)。
php.ini
的配置參數(如內存限制、上傳文件大小等)
調試用途
開發時常用它檢查服務器是否正常加載了特定擴展(如 curl
、pdo_mysql
),或確認配置(如 error_reporting
)是否生效
如果想限制顯示的信息,可以用參數:
<?php phpinfo(INFO_MODULES); // 僅顯示已加載的擴展 ?>
與一句話木馬的區別
核心區別對比表
特性 | phpinfo() | 一句話木馬 |
---|---|---|
主要功能 | 顯示服務器配置信息 | 提供遠程代碼執行能力 |
危險性 | 低(信息泄露) | 極高(系統控制) |
典型用途 | 調試/信息收集 | 權限維持/滲透 |
代碼復雜度 | 單函數調用 | 常含加密/混淆邏輯 |
檢測難度 | 通常被允許 | 安全軟件會重點監控 |
方法2:
可以F12鍵打開查看器可以看到前端驗證的代碼
這里其實禁用前端就可以了 (既然Javascript過濾了文件,那把Javascript禁用了就沒辦法過濾,也就可以上傳了 )
打開設置里的調試程序,勾選禁用Javascript
這個是把前端所有的js函數都禁用了(為了瀏覽器以后能正常使用,要記得過關以后把Javascript開啟)
Pass-2
這題同樣先上傳文件看看
發現提示文件類型不正確,那就是改Content-type就可以
同樣選擇文件后抓包上傳
然后改文件類型,把改為image/jpeg試試
上傳成功打開圖片
Pass-3
這題上傳了php文件后發現是黑名單驗證,禁止上傳四種后綴的名單
現在想辦法繞過,在網上查了一下后了解到在某些特定的環境中某些特殊后綴會被當做php文件解析php、php2、php3 4 5 6 7以及pht、phtm、phtml,然后用php5試了一下,先將之前的<?php phpinfo();?>文件名改一下
上傳后同樣復制圖片地址,然后另建訪問,但發現是空白頁
弄了好一會不知道怎么回事,后來在一個博主那里了解到使用phpstudy搭建的upload-labs可能無法加載出這個界面,我的就是,而他給出的方法是修改#AddType application/x-httpd-php .php .phtml為AddType application/x-httpd-php .php .phtml .php5 .php3,然后別忘了#要刪除,然后就可以正常訪問圖片地址
我按他說的試了一下,先打開phpstudy的配置文件下的httpd-conf配置文件
然后修改
保存過后就可以訪問圖片路徑
Pass-4
這題著實不會,因為過濾了太多文件
乍一看還好,往后一看更多
這里參照了別人的博客,利用.htaccess,可以重寫文件解析繞過,大概做法如下
先寫一個文件命名為.htaccess,這個文件內容的意思是告訴apache遇到jpg文件時按照php去解析
再創建一個php測試文件
最后分別將.htaccess 和xxx.jpg文件上傳,然后用瀏覽器訪問xxx.jpg即可
Pass-5
查看源碼,發現過濾了更多后綴,這次連.htaccess文件也被過濾了
但看到源碼中過濾數組有小寫和大小寫混合,但沒有純大寫,而下面也沒有轉小寫
因為php文件名是不區分大小寫的,所以直接上傳
Pass-6
這題先上傳上一題的文件,發現果然被過濾
然后查看源碼,發現過濾這塊有點不一樣,這題相比上一題沒有trim()函數對文件名進行去空格處理
而關于文件上傳的題之前在deepseek上了解到 在windows環境下,系統會自動去除文件名后面的點和空格,而在linux環境下,會保留文件名的特殊字符,我的環境在windows搭建成的,所以就好解決了? 方法就是抓包添加空格,進而消耗掉過濾數,然后windows就會幫我刪掉空格,那么完成
先上傳剛剛的文件,然后抓包添加空格放行即可
Pass-7
查看關卡源碼,對比第四關,發現少了刪除文件末尾的點
第六關一樣,windows文件后綴名不能加’.',一樣使用burp抓包然后后綴加一個點
Pass-8
查看源碼,發現相比之前的代碼少了刪除文件末尾的點
所以同樣上傳之前的php文件,windows文件后綴名不能加. 所以進行bp抓包 ,然后在后綴加.
最后放行即可
Pass-9
首先查看源碼發現這題少了去除字符串::$DATA
所以直接使用bp抓包在文件名后綴加::$DATA,最后放行
Pass-10
這一題之前的所有方法都用不了了,但需要注意的是,沒有循環驗證,代碼只執行一次
既然這樣先雙寫試試看,然后抓包發現的確是將一個php去掉以后拼接了一個新的php
最后放行復制鏈接訪問解析即可
Pass-11
這題注意到save_path這個可控變量,后面還有一個后綴名需要繞過
這里需要知道%00截斷但要注意使用這個有兩個條件
php版本小于5.3.4
php的magic_quotes_gpc為OFF狀態
然后解釋一下00截斷:php在處理文件名或路徑時,如果遇到URL編碼的%00,它會被解釋為一個空字節(即ASCLL值為0),在php5.3以前,php會將這個空字節轉換為\000的新式,然后就會導致文件名被截斷,只保留%00之前的部分,然后可能會導致文件被保存到另一個意外的位置從而產生安全風險(php語言的底層為c語言,\0在C語言中是字符串的結束符,所以導致00截斷的發生)
接下來注意到img_path是通過get傳參傳遞的,所以不妨將這個路徑改為upload/Untitled.php%00,則不管后面是什么東西都會被截掉,然后經過move_upload_file函數將臨時文件重新復制給截斷之前的文件路徑,但還是要上傳jpg文件以保證后續程序的運行
接下來就是上傳 抓包 修改 放行
Pass-12
這一題發現和上一題不一樣,上一題是get傳參,這一題是post傳參
上一關%00經過url編碼,而post不會自行編碼,所以應該要對%00進行urldecode編碼,可直接利用bp中的快捷鍵convert selection進行快速url編碼
然后我上傳的文件類型不正確,Content-type也需要改一下,改為image/jpeg或image/png
改完后send即上傳成功
Pass-13
這題的圖片馬其實就是在一張圖片中寫入一句話改為php文件然后與另一張圖片合成新圖片,上傳該圖片利用php的文件包含特性將圖片以php進行解析
先將一張圖片寫入一句話
使用終端合成新圖片再上傳,最后利用文件包含漏洞讀取即可
copy liu.jpg /b + liu.php /a new.jpg
?當然我也使用了bp發現直接抓包加入一句話要方便得多
Pass-14
檢查源碼發現pass檢查圖標內容開頭2個字節
也不清楚能干嘛,就像之前一樣先找一張正常的圖片然后加入phpinfo
然后發現上傳成功
pass-15
這題看了源碼后看提示
然后注意到getimagesize()函數,具體解析在這里
php getimagesize 函數 – 獲取圖像信息 | 菜鳥教程
然后同樣上傳上一題的圖片馬即可
Pass-16
查看提示有重新渲染,先看看源碼
imagecreatefromjpeg()函數,二次渲染是由Gif文件或URL創建一個新圖像。成功則返回一圖像標識符/圖像資源,失敗則返回false,導致圖片馬的數據丟失,上傳圖片失敗。
按照前幾關的方式上傳,可以上傳,但是包含漏洞無法解析。原因就是二次渲染將圖片馬里面的php代碼刪除了。接下來把原圖和修改后的圖片進行比較,看那里沒有被渲染,在這里插入php代碼。這里使用beyond compare。
把上傳的圖片右鍵保存本地,看有沒有被渲染的地方,加入php代碼
再重新上傳
Pass-17
提示需要進行代碼審計,先看看源碼
發現如果上傳的符合它的白名單,那就進行重命名,如果不符合,直接刪除!解析的機會都沒有,這讓我想到了條件競爭,如果我在它刪除之前就訪問這個文件,他就不會刪除了。接下來直接實驗
上傳一個php文件,然后burp抓包發到爆破模塊