孫 梅,郭宇燕,韓 超,余 磊
目前,Web在互聯網中得到了最為廣泛的應用,Web的功能和交互性也在不斷增強,承載的業務也越來越多,大量的數據存儲在各種Web系統中.針對Web應用的攻擊成為了攻擊者的主要目標,Web應用安全成為了目前互聯網的主要安全問題[1].當前Web安全威脅主要集中在Web數據處理、Web應用程序、Web業務流程等方面.如果程序員在設計系統、開發系統中沒有充分考慮到安全因素,很容易遭到黑客的攻擊,如XSS、CSRF、SQL注入等攻擊[1-2].這些都是因為Web應用程序或者Web數據處理存在的安全漏洞而導致的.
滲透測試是通過模擬黑客的攻擊方法和漏洞發掘技術來評估計算機系統安全的一種評估方法,該方法是從攻擊者角度發現分析系統的缺陷及漏洞,進而嘗試利用某些漏洞對信息系統實現主動攻擊的過程,從而評估系統存在的可能安全風險問題[2].本文主要研究Web中SQL注入、XSS注入、文件上傳漏洞、邏輯漏洞等的滲透測試方法.
本文通過在本地搭建一個滲透測試站點DVWA,模擬各種攻擊方法對DVWA站點進行滲透,研究Web的滲透測試方法設計分析和防護措施.DVWA是一套集成了常見Web漏洞的php+mysql系統,其中包含了暴力破解、SQL注入、XSS、CSRF、文件上傳等一系列的安全漏洞.
SQL注入漏洞是目前針對Web應用危害最大、且攻擊成本最低的漏洞.2013年,SQL注入攻擊在OWASP TOP10中處于第一名的位置[3].SQL注入形成的根本原因是開發人員在開發代碼時,未對用戶的輸入進行過濾或者過濾不嚴格,用戶輸入的內容被后臺數據庫直接運行,導致Web數據泄露或被篡改等威脅的發生[4].一般,攻擊者通過Web應用程序提交一段精心構造的SQL代碼,查詢數據庫中的敏感信息,如管理員的賬號密碼、用戶的個人信息等.當數據庫用戶的權限比較大時,如mysql的root用戶,mssql的sa用戶,攻擊者還可以通過巧妙地組合SQL語句,向目標服務器寫入木馬文件,甚至獲得目標服務器操作系統的shell,直接執行系統命令.下文通過手工注入和自動注入來研究和分析SQL注入的滲透測試方法.
(1)驗證是否存在sql注入點.首先將DVWA的安全等級設置為低,然后打開SQL注入頁面,在USER ID位置輸入3′and ′3′=′3,如圖1所示.如果正常返回了數據,說明輸入的內容被數據庫執行了,猜測Web程序的sql語句為:select*from 表名 where id=′3′and ′3′=′3′,由于and ′3′=′3′在邏輯上為真,所以返回了id為3的用戶信息.輸入3′and ′3′=′4,點擊提交.由于and ′3′=′4′在邏輯上為假,所以這次沒有返回數據.根據以上兩種情況,可以判斷USER ID位置存在SQL注入.

圖1 驗證sql注入

圖2 判斷字段數
(2)判斷字段的個數.輸入3′order by 2#,如圖2所示.在mysql數據庫中,#的作用為單行注釋符,order by會對查詢的結果進行排序,攻擊者通常使用order by子句來判斷表的字段數.由于此時正常返回了數據,說明查詢了2個字段.輸入3′order by 3#,點擊提交后,返回了字段異常錯誤.說明表中字段的個數不足3個,即判斷字段的個數為2.
(3)獲取數據庫名.輸入3′union select 1,database()#,這里使用union查詢,union可以把多個select語句的結果組合到一個集合中,database函數用來查詢數據庫名,從返回結果可以看出,數據庫名為dvwa.如圖3所示.

圖3 獲取數據庫名
(4)獲取表名.輸入 3′union select 1,table_name from information_schema.tables where table_schema=dvwa#,information_schema是MySQL 5.0及其以上版本自帶的系統數據庫,它提供了對數據庫元數據的訪問接口,可以將它理解成數據庫的字典,mysql的表名、列名、訪問權限、索引信息等都存儲在內.結合mysql中的關鍵字可以從information_schema數據庫中查詢到攻擊者想要的信息,如圖4所示.根據返回結果判斷dvwa數據庫下包含了users表和guestbook表.注意使用sql語句查詢時,需要將數據庫名、表名轉換成16進制格式,否則查詢不到數據;mysql關鍵字的信息見表1.

圖4 獲取表名

表1 mysql關鍵字
(5)獲 取 列 名.輸 入 3′union select 1,group_concat (column_name) from information_schema.columns where table_name=users#,如圖5所示.其中group_concat函數可以將列進行分組,便于顯示和查看.根據返回的列名可以猜測,password列中可能存放著用戶的密碼信息.

圖5 獲取列名
(6)獲取數據.在用戶id位置輸入3′union select 1,password from users#,如圖6所示,此時后臺數據庫執行的sql語句為select*from表名where id=′3′union select 1,password from users#′.

圖6 獲取數據
成功獲取到了用戶的密碼.但密碼是被md5加密過的密文,將密文拿到一些在線解密網站上進行解密,如果密碼的長度和復雜度比較弱,就很容易獲得明文.
sqlmap是一款開源的、使用python編寫的跨平臺SQL注入工具,它可以自動地發現并利用SQL注入漏洞.另外,sqlmap還集成了許多實用的第三方腳本,當目標網站上安裝了WAF或者防火墻設備時,攻擊者甚至可以通過這些腳本的幫助繞過防火墻的過濾和攔截.
(1)sqlmap向目標服務器寫文件.sqlmap向目標服務器寫文件的命令格式是sqlmap-u"url地址"--file-write="本地文件"--file-dest="遠程文件",如圖7所示.

圖7 sqlmap寫文件的命令參數
如圖8所示,sqlmap成功將本地的1.php寫入到目標服務器的C盤根目錄下,并命名成了shell.php.在實際的滲透測試過程中,1.php通常是攻擊者預備好的木馬文件,利用SQL注入上傳到目標服務器上以后,可以直接獲得目標服務器的控制權.

圖8 寫文件
(2)獲取操作系統的shell.sqlmap獲取操作系統shell的命令格式是sqlmap-u"url地址"--os-shell,如圖9所示.

圖9 sqlmap獲取shell的命令參數

圖10 執行系統命令
如圖10所示,sqlmap已經獲取到了操作系統的shell,由于數據庫用戶的權限比較大,甚至可以直接使用net user命令添加系統用戶,至此目標服務器已經完全被控制了.
SQL注入的防御,首先要從代碼層面入手,SQL注入產生的根本原因是用戶可以輸入自定義的SQL語句.程序在處理用戶的輸入時,必須對輸入的內容進行檢查,過濾其中包含的特殊字符,或者對特殊字符進行轉義.開發人員需要重點關注的關鍵字和特殊字符如下.
(1)sql語句關鍵字:and、or、select、from、where等.
(2)sql語句特殊字符:單引號、雙引號、分號等.
另一方面可以從應用層防止SQL注入攻擊,目前國內主流的安全廠商都有一些專業的Web應用防護設備,例如綠盟科技的WAF with MSS,啟明星辰的天清Web應用安全網關等.這些WAF設備自身定義了許多SQL注入過濾規則,攻擊者輸入的危險字符會先經過應用層的WAF設備,再提交給Web的后端數據庫,一定程度地降低了Web應用的安全風險.
最后,Web站點接入的數據庫應遵循用戶角色最小權限原則[5],針對不同類型的操作,創建對應權限的數據庫用戶,最大限度地降低SQL注入的危害.
當用戶訪問網頁時,攻擊代碼在用戶的瀏覽器上被執行,就形成了一次XSS跨站腳本攻擊.XSS跨站攻擊危害的主要是Web用戶,并不會直接危害Web服務器[6].根據XSS漏洞的原理可以將XSS跨站攻擊劃分成反射性XSS和存儲型XSS,對于反射性XSS,攻擊者需要欺騙用戶點擊一個惡意URL才能攻擊成功[7].存儲型XSS的危害相對來說更大一些,攻擊者提交的惡意代碼,會被Web服務器端接收并存儲,訪問該網頁的用戶,他們的瀏覽器會執行這段惡意代碼.
首先將DVWA的安全等級設置為低,然后打開反射性XSS頁面.在輸入框中輸入一串JavaScript代碼,如圖11,點擊提交后頁面的變化如圖12所示.在Javascript語言中,alert函數的作用是彈出對話框,因此這里在頁面上輸出了一個值為3的對話框,說明提交的Javascript腳本代碼在瀏覽器上執行了,以上過程就觸發了一次跨站腳本攻擊.在實際的滲透測試中,XSS不僅僅是彈出一個對話框這么簡單.攻擊者往往會精心編寫一些攻擊代碼,或者使用互聯網上的XSS攻擊平臺進行攻擊,Javascript的功能越強大,XSS漏洞的危害就越大.

圖11 測試語句

圖12 彈框
打開存儲型XSS頁面,看到一個用戶留言板,我們在消息框中輸入一串Javascript代碼,如圖13所示,然后點擊提交,頁面的變化如圖14所示.

圖13 測試語句

圖14 彈出cookie值
這里使用到了Javascript中document對象的cookie屬性,結合alert函數將已登錄用戶的cookie值彈出.從返回結果可以看出,輸入的Javascript代碼被執行了.而且輸入的內容已經被存儲到數據庫中,每當有人瀏覽該用戶的留言時,都會在他的瀏覽器上執行攻擊者插入的Javascript代碼.一些用戶量大的論壇或者新聞站點,一旦出現存儲型XSS漏洞,很有可能造成大量用戶的身份認證信息泄露,危害很大.
burpsuite是Java語言編寫的一款web應用攻擊平臺,它是Web安全測試者最常用的工具.burpsuite自身相當于一個代理服務器,用戶通過瀏覽器訪問Web站點時,流量會先經過burpsuite,再由burpsuite將流量發送給目標服務器,因此在流量傳遞的過程中,攻擊者可以對流量進行分析和修改.除此之外,burpsuite中還集成了許多的功能模塊,例如中繼模塊、掃描模塊、爬蟲模塊、編碼模塊等等,并且各個模塊之間是互相聯通的.在XSS漏洞的挖掘過程中,黑客通常會使用到burpsuite的中繼repeater模塊,通過不斷地修改需要提交的數據包,來對XSS漏洞進行檢測和利用.
(1)XSS繞過DVWA中級安全級別檢查.首先打開burpsuite,將代理模塊配置成監聽本機的8080端口,如圖15所示.

圖15 burp代理
然后將瀏覽器的網絡代理設置成burpsuite所在的主機,這樣用戶通過瀏覽器訪問web站點時,流量就會先流經burpsuite.
接下來將DVWA的安全級別設置為中,打開反射性XSS頁面,在輸入框內隨便輸入一串字符123a,點擊提交后,burpsuite攔截到了本次的請求,將請求包發送到repeater模塊,然后點擊Go可以發送本次攔截到的數據包,如圖16所示.

圖16 repeater模塊
在repeater模塊中,可以不斷地更改要發送的數據包,然后在response響應包中查找提交的內容.如果提交的Javascript代碼在響應包中能被查找到,則證明此處存在XSS漏洞.經過測試發現,DVWA的中級安全級別過濾了Javascript關鍵字,但是可以變換大小寫繞過檢查.最終通過提交<Script>alert(3)</Script>,成功觸發了一次XSS攻擊,如圖17所示.

圖17 大小寫變換
(2)XSS繞過DVWA高安全級別檢查.將DVWA的安全級別設置為高,打開反射性XSS頁面,同樣將數據包發送到burpsuite的repeater模塊下.經過測試發現,高安全級別下script標簽的大小寫都被過濾了.雖然無法通過javascript插入XSS代碼,但是可以使用html中的圖片標簽img,配合標簽的onerror事件成功觸發XSS攻擊,如圖18所示.

圖18 圖片標簽
通過burpsuite對以上三個不同安全級別的DVWA XSS跨站滲透測試,可以看出burpsuite通過不斷分析、修改數據包,從而繞過Web應用程序的檢測和過濾.
XSS跨站腳本攻擊和SQL注入類似,都是因為用戶輸入了非法字符,所以最根本的防御方法就是對用戶的輸入進行過濾.在HTML超文本標記語言中,>、<、/、”都是比較有特殊意義的字符,在程序的代碼中應該禁止用戶提交這些字符.XSS問題產生的關鍵是輸入和輸出,有時用戶輸入的值可能有多個輸出點,所以不僅需要在輸入點進行過濾,在各個輸出點也要進行嚴格的檢查.另外微軟公司的IE瀏覽器在Internet Explorer 6 SP1時引入了一項http-only擴展,可以攔截客戶端腳本操作cookie值,目前所有主流的瀏覽器都支持了http-only,使用瀏覽器的http-only特性可以有效防御XSS cookie劫持.
上傳漏洞也是Web安全測試中經常遇到的一種漏洞類型,在Web技術發展的早期,黑客們非常喜歡利用上傳漏洞對Web站點發起攻擊.許多網站都會有一些文件上傳點,例如上傳附件、上傳用戶頭像等.如果開發人員沒有對用戶上傳的文件類型進行校驗,攻擊者可以上傳一些惡意的代碼文件,獲得Web站點的控制權.針對文件上傳漏洞,瀏覽器端的過濾是沒有作用的.攻擊者通過修改Javascript代碼,或者直接禁用網站的Javascript腳本功能,可以很輕松地繞過瀏覽器的過濾.
將DVWA的安全級別設置為低,打開文件上傳的頁面,選擇本地的3.php進行上傳,由于服務器沒有對文件的擴展名進行校驗,所以成功上傳了php格式的文件,如圖19所示.

圖19 成功上傳
將DVWA的安全級別設置為中,打開文件上傳的頁面.中級安全級別DVWA的代碼對上傳點進行過濾,僅允許上傳jpeg或png格式的文件,所以3.php無法直接上傳成功,如圖20所示.

圖20 僅允許上傳圖片
接下來打開burpsuite工具,攔截一次上傳請求.發現在html body中有一個Content-Type字段,用于定義文件的MIME類型.當上傳php格式的文件時,Content-Type字段的值為application/octet-stream,表示將文件以二進制流的格式上傳,我們將其修改為圖片格式image/jpeg,如圖21所示,這一次成功地上傳了3.php.

圖21 修改Content-Type
另一種繞過上傳過濾的思路——%00截斷[8].當程序執行到%00時,會錯誤地把它當成結束符,所以后面的數據就被忽略了.例如把上傳的文件命名成3.php%00.jpg,服務器會誤認為上傳的是圖片文件,但是執行時卻是php腳本文件.
通過burpsuite可以很輕松地實現%00截斷,首先上傳一張圖片3.jpg,攔截數據包后修改filename的值,注意這里需要將%00進行URL解碼.修改完成后提交數據包,成功繞過了服務器端的檢查,如圖22所示.%00截斷是一種非常經典的攻擊手法,在與文件操作相關的地方都可以嘗試使用它,例如文件包含、文件上傳、文件下載等.

圖22 截斷上傳
在滲透測試中,攻擊者通常會利用上傳漏洞向目標服務器上傳一句話木馬,再結合網站管理工具實現對目標服務器的進一步控制.中國菜刀就是一款專業的網站管理工具,它體積小巧且功能強大,支持asp、php、jsp等眾多類型的網站.
下面使用中國菜刀,連接腳本文件獲得網站的webshell.首先將一句話木馬<?php@eval($_POST[‘world’]);?>寫入3.php.再利用上傳漏洞將3.php上傳到目標服務器,打開中國菜刀客戶端,連接3.php,連接密碼為world,最終可以獲得網站的webshell,如圖23所示.

圖23 獲得webshell
中國菜刀還支持許多第三方功能,例如文件管理、數據庫管理、虛擬終端等,每種功能都有特定的使用場景,給安全滲透測試帶來了很大的便利.
上傳漏洞的危害雖然很大,但是只要配置正確,就可以設計出安全的文件上傳點,以下提供幾種上傳漏洞的防御思路[8].
(1)使用白名單的方式,嚴格判斷文件的后綴名以及MIME類型.
(2)將上傳后的目錄和文件命名成隨機數.
(3)服務器端存放文件的目錄設置成只讀的權限,限制文件的執行.
通過以上幾種方法,可以有效地防止上傳漏洞的發生.
邏輯漏洞是一種新型Web安全漏洞,自出現以來,迅速成為黑客的主要攻擊目標.它是一種業務處理流程設計缺陷,主要發生在Web的業務流程中.傳統的安全測試主要依靠漏洞類型的自動化掃描檢測,這種方式往往容易忽略業務系統的邏輯漏洞,而且傳統的安全設備也很難對邏輯漏洞進行防御.國內很多大型互聯網廠商都曾被曝光過邏輯漏洞,例如知乎任意用戶登錄,新浪任意密碼重置,淘寶網支付漏洞等等,企業很可能因為簡單的業務邏輯漏洞而蒙受巨大損失.
目前,在線消費和支付已遍布人們生活的各個方面.由于涉及到資金方面的問題,一旦存在漏洞,對個人和企業來說危害非常大.
訂單金額篡改是一種常見的支付漏洞.購買商品一般分為三個步驟:填寫信息、提交訂單、付款.在最后一步付款時進行抓包嘗試修改訂單的金額,如果程序沒有對支付的金額做校驗,那么就可以低價買到高價的商品.
不僅訂單金額,訂單數量也是可以篡改的.在支付的過程中,最終的價格是由商品的數量決定的,比如:數量為1時價格為5元,數量為2時價格為10元,那么當攻擊者修改商品的數量為負數時,最終的金額也會變為負數,賬戶里的錢不但沒有減少反而增加了.
還有一種支付漏洞是訂單請求重放,攻擊者通過攔截商品購買成功時的數據包,對數據包進行請求重放.如果程序沒有對訂單多次重復提交進行限制,那么就會導致購買商品一直增加.
越權漏洞指攻擊者請求操作某條數據時,Web應用程序沒有對該數據的所有者進行判斷,導致攻擊者可以自行修改參數,操作不屬于自己的數據.越權漏洞在增、刪、改、查的位置都有可能發生,一般分為水平越權和垂直越權.水平越權是相同權限用戶之間的越權,比如使用A學生的賬號操作B學生的賬號就屬于水平越權.而垂直越權是不同權限級別用戶之間的越權,比如使用學生賬號操作教師賬號,或者普通用戶訪問管理員用戶的資源,都屬于垂直越權.
為了防止用戶因忘記密碼而無法登錄,大部分網站都提供了找回密碼的功能.常見的找回密碼方式有:手機驗證碼、郵箱、密保問題等.以上這些方式如果在邏輯設計上存在缺陷,就有可能存在密碼重置漏洞.
使用手機驗證碼找回密碼時,如果用戶的請求頁面不是直接提交到后臺服務器,而是先經中間節點再到達后臺服務器,并且后臺服務器未對用戶的手機號進行校驗,中間節點就可以通過修改手機號,給指定的手機號發送驗證碼,進而實現對任意用戶的密碼重置.有時候即便驗證了用戶的手機號,但是由于驗證碼的位數較短,攻擊者通過暴力窮舉也能很容易獲取到正確的驗證碼,如一個4位純數字的驗證碼可以在幾分鐘之內枚舉一遍.
使用郵箱找回密碼時,大部分網站是向郵箱發送一個找回密碼的鏈接,用戶在瀏覽器上訪問該鏈接就可以進入重置密碼的頁面.找回密碼的鏈接中通常會加入校驗參數,我們稱之為token.通過對比token值與服務器端生成的值是否匹配來判斷當前找回密碼的鏈接是否有效,但是如果這個token值不是隨機生成的就會造成安全問題.類似于這種弱token的現象有很多,例如使用用戶名的md5值或base64編碼作為token值,攻擊者可以很容易地構造token值重置任意用戶的密碼.
邏輯漏洞與公司的業務是緊密相關的,要想防御邏輯漏洞,必須關注業務系統中每一個環節可能存在的安全風險.
支付環節中,把與金錢、數量有關的參數做數字簽名,可以有效地避免數據被篡改.在找回密碼環節,如果需要客戶端輸入手機號,應該嚴格校驗手機號是否和登錄者的身份一致,還需要考慮驗證碼是否能被暴力破解,一般建議驗證碼的長度為6位,并且設置驗證碼的有效時間和失敗嘗試的次數.另外對于郵箱找回密碼的情況,token值不能使用時間戳或者有規律可尋的數字字符,應當使用復雜的token生成機制,讓攻擊者無法推測出具體的值.最后,對于越權漏洞,應該驗證一切來自客戶端的參數,尤其是和用戶權限相關的參數.
隨著信息安全知識的普及,越來越多的企業逐漸認識到信息安全的重要性.Web安全是信息安全領域的一個重要分支,目前也是一個相對熱門的就業方向.由于安全事件的發生是不可預期的,許多企業都配備了專職的Web安全技術人員,在不影響業務系統正常運行的前提下,定期對公司的Web應用系統進行滲透測試,發現被測系統中可被利用的安全隱患.
本文從一個滲透測試者的角度出發,在個人電腦上搭建了一個Web站點,然后對其進行了漏洞的測試和利用.這些測試方法不僅可以作為Web安全評估的方法,也可以作為Web安全課程教學的實踐教學方法,引導學生通過個人搭建環境,完成Web安全的研究和分析.