目錄
一、.htacess
二、代碼審計
三、php ts版本安裝
1、下載ts版本php
2、放入到phpstudy指定文件夾中
3、修改php配置文件
4、修改php.ini文件
5、修改httpd.conf文件
(1)定位文件
(2)修改文件
6、重啟小皮
7、切換ts版本php?
四、滲透實戰
1、構造.htacess文件
2、構造圖片文件
3、上傳.htacess和圖片文件
4、獲取圖片地址
5、訪問腳本
本文通過《upload-labs靶場通關筆記系列》來進行upload-labs靶場的滲透實戰,本文講解upload-labs靶場第四關文件.htacess滲透實戰。
一、.htacess
.htaccess 是 Apache 服務器的分布式配置文件,全稱是Hypertext Access(超文本入口)。.htaccess 是 Apache 服務器的分布式配置文件,全稱是Hypertext Access(超文本入口)。.htaccess 文件提供了針對目錄改變配置的方法, 即,在一個特定的文檔目錄中放置一個包含一個或多個指令的文件, 以作用于此目錄及其所有子目錄。
.htaccess 文件能夠對 Apache 服務器的特定目錄進行配置,借助它可以修改文件類型的解析規則。所以,若成功上傳一個惡意的 .htaccess 文件,就可以讓服務器把其他后綴的文件當作 PHP 文件來解析,進而實現文件上傳htacess繞過。
二、代碼審計
打開文件上傳靶場的第4關,查看源碼并分析,如下所示代碼使用黑名單方法檢測腳本,雖然包含多種變體(".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", ".ini"),但可能遺漏新的危險擴展名(如.htacess等)。
<?php
// 初始化上傳狀態和消息變量
$is_upload = false; // 標記文件是否上傳成功
$msg = null; // 存儲上傳過程中的錯誤信息// 檢查用戶是否提交了表單(點擊了上傳按鈕)
if (isset($_POST['submit'])) {// 檢查上傳目錄是否存在if (file_exists(UPLOAD_PATH)) {// 定義禁止上傳的文件擴展名黑名單(包含各種大小寫變體)$deny_ext = array(".php",".php5",".php4",".php3",".php2",".php1", // PHP相關擴展".html",".htm",".phtml",".pht", // HTML相關".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".pHp1", // PHP大小寫變體".Html",".Htm",".pHtml", // HTML大小寫變體".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml", // JSP相關".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml", // JSP大小寫變體".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer", // ASP相關".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr", // ASP大小寫變體".sWf",".swf", // Flash文件".ini" // 配置文件);// 獲取上傳文件名并處理$file_name = trim($_FILES['upload_file']['name']); // 去除首尾空格$file_name = deldot($file_name); // 刪除文件名末尾的點(防止file.php.繞過)$file_ext = strrchr($file_name, '.'); // 獲取文件擴展名(從最后一個點開始)$file_ext = strtolower($file_ext); // 轉換為小寫統一比較$file_ext = str_ireplace('::$DATA', '', $file_ext); // 去除NTFS備用數據流::$DATA$file_ext = trim($file_ext); // 去除擴展名首尾空格// 檢查擴展名是否在黑名單中if (!in_array($file_ext, $deny_ext)) {// 獲取上傳臨時文件路徑$temp_file = $_FILES['upload_file']['tmp_name'];// 構造目標路徑(直接使用原始文件名,存在安全隱患)$img_path = UPLOAD_PATH.'/'.$file_name;// 移動上傳文件到目標位置if (move_uploaded_file($temp_file, $img_path)) {$is_upload = true; // 標記上傳成功} else {$msg = '上傳出錯!'; // 文件移動失敗(可能是權限問題)}} else {$msg = '此文件不允許上傳!'; // 文件類型被禁止}} else {$msg = UPLOAD_PATH . '文件夾不存在,請手工創建!'; // 上傳目錄不存在}
}
?>
由于.htaccess后綴的文件本關卡沒有在黑名單種,故而可以通過上傳.htacess文件利用文件解析規則繞過,舉個例子,.htaccess文件內容如下所示。
<FilesMatch "test4.jpg">SetHandler application/x-httpd-php
</FilesMatch>
在將.htaccess文件上傳到服務器后,再上傳一個test4.jpg文件(文件內容為php腳本),服務器會將test.jpg當作test4.php文件解析再進行訪問。總之,雖然在本關卡中不能上傳.php后綴的文件,但是可以通過先上傳.htacess文件,再上傳滿足.htacess的圖片文件,這樣即可通過上傳此2個類型文件達到繞過服務器的過濾規則的目的。?
三、php ts版本安裝
詳細很多使用phpstudy搭建靶場的網安人參考upload-labs靶場攻略卻無法復現成功,為何PHPStudy中AddType application/x-httpd-php,以及.htacesss滲透方法等Apache命令之所以在Apache的設置文件中設置后未實現目標效果呢,這是由于PHP的版本不符導致的,但注意這里的PHP版本并不是指PHP7.3.0、PHP7.4.0這種版本號,也不是適用于32位的PHP、適用于64位的PHP這種不同機型的版本,而是PHP的NTS(Non Thread Safe)與TS(Thread Safe)的這種不同版本導致的。如下所示,當前phpstudy中點擊軟件管理,我們查看php軟件都是nts版本,故而如果像滲透成功,需要安裝TS版本的PHP,并在Apache中配置好相關設置。
將ts版本的php軟件集成到phpstudy,步驟如下所示。?
1、下載ts版本php
在php官網下載ts版本的php軟件,官網地址如下所示。
https://windows.php.net/download
以php7.30為例,下載過程要選擇ts版本(即thread safe),具體如下圖黑框所示。?
2、放入到phpstudy指定文件夾中
將下載解壓后的ts版本php放到小皮的指定目錄中,即“Extensions\php”子目錄中,具體如下所示。
3、修改php配置文件
進入到php_7.3.30_t文件夾內,找到php.ini-development文件,復制黏貼一份并改名為php.ini。
4、修改php.ini文件
打開php.ini,找到extension_dir,并把前面的";"符號刪掉(在php.ini相當于注釋符),其值改為"PHP文件的路徑/ext"。
;extension_dir = "D:/phpstudy_pro/Extensions/php/php-7.3.30ts/ext"
修改后如下所示,記得修改后保存文件。
5、修改httpd.conf文件
(1)定位文件
接下來在PHPStudy安裝Apache的目錄下,打開Apache的配置文件httpd.conf,以我的安裝目錄為例,httpd.conf的位置如下所示。
D:\phpstudy_pro, httpd.conf在D:\phpstudy_pro\Extensions\Apache2.4.39\conf
?也可以通過phpstudy-設置-httpd.conf找到該文件,具體方法如下所示。
(2)修改文件
為例防止將httpd.cofn改壞了,建議先把httpd.conf備份一份,以后更換時直接替換就好。搜索LoadModule,找到有很多LoadModule語句的地方。
.在末尾加上LoadModule php7_module "PHP文件的路徑/php7apache2_4.dll"和PHPIniDir "PHP文件的路徑"。
LoadModule php7_module "D:/phpstudy_pro/Extensions/php/php-7.3.30ts/php7apache2_4.dll"
PHPIniDir "D:/phpstudy_pro/Extensions/php/php-7.3.30ts"
修改后效果如下所示,注意需要保存文件。
6、重啟小皮
完成修改配置文件后,需要重啟服務生效,如下所示。
7、切換ts版本php?
通過首頁-網站-管理-php版本-切換到php-7.3.30ts,將php切換為ts版本的php服務。
四、滲透實戰
1、構造.htacess文件
2、構造圖片文件
構造圖片文件test4.jpg,內容為顯示phpinfo的信息,具體如下所示,后綴為。
<?php
phpinfo();
?>
3、上傳.htacess和圖片文件
打開upload靶場的第四關,將.htacess和test4.jpg文件,如下所示兩個文件都上傳成功。
http://127.0.0.1/upload-labs/Pass-04/index.php
4、獲取圖片地址
鼠標右鍵點擊上傳成功的反饋框,獲取到圖片的URL地址,具體如下所示。
http://127.0.0.1/upload-labs/upload/test4.jpg
5、訪問腳本
復制圖片地址到URL地址欄并訪問,顯示php版本號就是上傳成功,.hatcess繞過成功,文件成功上傳到upload目錄下了