安全測試===sqlmap(壹)轉載
六、優化
這些參數可以優化Sqlmap的性能。
1.一鍵優化
參數:-o
添加此參數相當於同時添加下列三個優化參數:
- --keep-alive
- --null-connection
- --threads=3 (如果沒有設置一個更好的值)
這些參數具體含義見后文。
2.HTTP長連接
參數:--keep-alive
該參數讓Sqlmap使用HTTP長連接。該參數與“--proxy”矛盾。
3.HTTP空連接
參數:--null-connection
有一種特殊的HTTP請求類型可以直接獲得HTTP響應的大小而不用獲得HTTP響應體。顯然這在布爾型盲注中可以節約很大的帶寬。當然這一技術是需要服務器端支持的。該參數與“--text-only”矛盾。
4.HTTP並發
參數:--threads
使用該參數指定Sqlmap可以達到的最大並發數。從性能和網站承受能力兩方面考慮最大並發數不要超過10。
七、注入
這些參數被用於指定要測試的參數、定制攻擊荷載和選擇篡改腳本。
1.要測試的注入點
參數:-p和--skip
默認情況下Sqlmap會測試所有GET參數和POST參數,當level大於等於2時會測試cookie參數,當level大於等於3時會測試User-Agent和Referer。實際上還可以手動指定一個以逗號分隔的、要測試的參數列表,該列表中的參數不受level限制。這就是“-p”的作用。
舉個例子,若想只測試GET參數“id”和User-Agent,則可以這么寫:
-p "id,user-agent"
如果不想測試某一參數則可以使用“--skip”。如設置了level為5但不想測試User-Agent和Referer,則可以這么寫:
--level=5 --skip="user-agent,referer"
有時會遇到偽靜態網頁。動態網頁會明目張膽地列出參數,如:
/user.php?id=1
顯然參數是id,值為1。但若是偽靜態網頁則可能這樣寫:
/user/1/
將參數隱藏在URL中。通常情況下Sqlmap不會對這樣的偽靜態網頁的參數做測試,因為Sqlmap無法判斷哪個是參數。若想要對這樣的偽靜態進行測試,只需要加上“*”,告訴Sqlmap哪個是偽靜態參數就行,剩下事的和GET參數沒有什么區別。如:
python sqlmap.py -u "http(s)://target.cc/user/1*/"
2.指定數據庫管理系統
參數:--dbms
dbms是“Database Management System”的縮寫。默認情況下Sqlmap會自動檢測網站使用的數據庫管理系統,Sqlmap支持以下這些數據庫管理系統:
- MySQL
- Oracle
- PostgreSQL
- Microsoft SQL Server
- Microsoft Access
- Firebird
- SQLite
- Sybase
- SAP MaxDB
- DB2
如果Sqlmap自動檢測失敗或是不想讓Sqlmap進行數據庫指紋檢測,可以使用參數“--dbms”手動指定數據庫管理系統,如:“--dbms postgresql”。
對於Mysql和Microsoft SQL Server和要這樣指定:
--dbms MySQL <version> --dbms Microsoft SQL Server <version>
對於MySQL來說,是類似這樣的:5.0。對於Microsoft SQL Server來說,是類似這樣的:2005。
如果在添加“--dbms”參數的同時還添加了“--fingerprint”,Sqlmap只會在指定的數據庫管理系統內進行指紋識別。
只有在很確定時使用“--dbms”,否則還是讓Sqlmap自動檢測更好些。
3.指定運行數據庫管理系統的操作系統
參數:--os
默認情況下Sqlmap會自動檢測運行數據庫管理系統的操作系統,目前完全支持的操作系統有:
- Linux
- Windows
如果很確定可以使用參數“--os”指定運行數據庫管理系統的操作系統。當然在只用很確定時才應該使用此參數,否則還是讓Sqlmap自動檢測更好些。
4.生成無效參數值時強制使用大數
參數:--invalid-bignum
有時在注入測試時需要生成無效參數,一般情況下Sqlmap會取已有參數(如:id=13)的相反數(如:id=-13)作為無效參數。但若添加“--invalid-bignum”,Sqlmap就會取大數(如:id=99999999)作為無效參數。
5.生成無效參數值時強制使用邏輯操作符
參數:--invalid-logical
有時在注入測試時需要生成無效參數,一般情況下Sqlmap會取已有參數(如:id=13)的相反數(如:id=-13)作為無效參數。但若添加“--invalid-logical”,Sqlmap就會使用邏輯操作符(如:id=13 AND 18=19)作為無效參數。
6.生成無效參數值時強制使用字符串
參數:--invalid-string
有時在注入測試時需要生成無效參數,一般情況下Sqlmap會取已有參數(如:id=13)的相反數(如:id=-13)作為無效參數。但若添加“--invalid-logical”,Sqlmap就會使用字符串(如:id=akewmc)作為無效參數。
7.關閉payload轉換
參數:--no-cast
在檢索結果時Sqlmap會將所有輸入轉換為字符串類型,若遇到空值(NULL)則將其替換為空白字符。 這樣做是為了防止如連接空值和字符串之類的任何錯誤發生並可以簡化數據檢索過程。 但是有報告顯示在老版本的Mysql中這樣做會導致數據檢索出現問題,因此添加了“--no-cast”來告訴Sqlmap不要這樣做。
8.關閉字符串編碼
參數:--no-escape
有時Sqlmap會使用用單引號括起來的字符串值作為payload,如“SELECT 'foobar'”,默認地這些值會被編碼,如上例將被編碼為: “SELECT CHAR(102)+CHAR(111)+CHAR(111)+CHAR(98)+CHAR(97)+CHAR(114))”。這樣做既可以混淆視聽讓人一時難以洞察payload的內容又可以在后台服務器使用類似magic_quote或mysql_real_escape_string這樣的轉義函數的情況下字符串不受影響。當然在某些情況下需要關閉字符串編碼,如為了縮減payload長度,用戶可以使用“--no-escape”來關閉字符串編碼。
9.定制payload
參數:--prefix和--suffix
有時只有在payload后添加用戶指定的后綴才能注入成功。另一種場景是用戶已經知道查詢語句怎么寫的,此時可以直接指定payload的前綴和后綴來完成檢測和注入。
一個有漏洞的源碼示例如下:
query = "SELECT * FROM users WHERE id=('" . $\_GET['id'] . "') LIMIT 0, 1";
對這樣的例子可以讓Sqlmap自動檢測邊界范圍也可以手動指出邊界范圍:
python sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/get_str_brackets.php?id=1" -p id --prefix "')" --suffix "AND ('abc'='abc"
最終SQL語句會變成:
SELECT * FROM users WHERE id=('1') <PAYLOAD> AND ('abc'='abc') LIMIT 0, 1
這個句子語法是正確的,payloa也能執行。
在簡單的測試環境下Sqlmap不需要被提供定制的邊界范圍就能夠自動檢測並完成注入,但在真實世界中某些應用可能會很復雜如嵌套JOIN查詢,此時就需要為Sqlmap指明邊界范圍。
10.修改注入數據
參數:--tamper
除了用CHAR()編碼字符串外Sqlmap沒有對payload進行任何混淆。 該參數用於對payload進行混淆以繞過IPS或WAF。 該參數后跟一個tamper腳本的名字。 若該tamper腳本位於sqlmap的安裝目錄的tamper/目錄中,就可以省略路徑和后綴名,只寫文件名。 多個tamper腳本之間用空格隔開。
在tamper/目錄中有許多可用的tamper腳本。tamper腳本的作用是對payload進行混淆。 我們還可以自己寫tamper腳本,這屬於Sqlmap的高級用法,一個有效的tamper腳本如下所示:
# 必須要導入的庫 from lib.core.enums import PRIORITY # 定義該tamper腳本的優先級 __priority__ = PRIORITY.NORMAL def tamper(payload): '''此處是tamper的說明''' retVal = payload # 此處是用於修改payload的代碼 # 返回修改后的payload return retVal
下面是一個示例,該示例的目標是Mysql,假定大於號、空格和開頭的SELECT是被禁止的:
python sqlmap.py -u "http://192.168.56.101:8080/ScorePrj/?id=1" \ --tamper tamper/between.py,tamper/randomcase.py,tamper/space2comment.py -v 3
該示例部分輸出如下:
[12:55:52] [DEBUG] cleaning up configuration parameters [12:55:52] [INFO] loading tamper script 'between' [12:55:52] [INFO] loading tamper script 'randomcase' [12:55:52] [INFO] loading tamper script 'space2comment' [...] [12:55:53] [INFO] testing for SQL injection on GET parameter 'id' [12:55:53] [INFO] testing 'AND boolean-based blind - WHERE or HAVING clause' [12:55:53] [PAYLOAD] 1 [12:55:53] [PAYLOAD] 1)/**/aNd/**/8083=4737/**/aNd/**/(4754/**/BetwEen/**/4754/**/aNd/**/4754 [12:55:53] [PAYLOAD] 1)/**/anD/**/4962=4962/**/anD/**/(2361/**/BeTweEN/**/2361/**/anD/**/2361 [12:55:53] [PAYLOAD] 1/**/aNd/**/9754/**/BETwEEn/**/1206/**/aNd/**/1206 [12:55:53] [PAYLOAD] 1/**/AnD/**/4962/**/beTweEn/**/4962/**/AnD/**/4962 [12:55:53] [PAYLOAD] 1/**/aND/**/2741/**/BetWeEn/**/9323/**/aND/**/9323--/**/Ihsa [12:55:53] [PAYLOAD] 1/**/anD/**/4962/**/BetweEN/**/4962/**/anD/**/4962--/**/wVUI [12:55:53] [PAYLOAD] 1')/**/anD/**/1694=6061/**/anD/**/('zLwu'='zLwu [12:55:53] [PAYLOAD] 1')/**/ANd/**/4962=4962/**/ANd/**/('Dsfw'='Dsfw [12:55:53] [PAYLOAD] 1'/**/aND/**/6307=8901/**/aND/**/'fKLn'='fKLn [12:55:53] [PAYLOAD] 1'/**/aNd/**/4962=4962/**/aNd/**/'YFsp'='YFsp [12:55:53] [PAYLOAD] 1%'/**/anD/**/3549=6854/**/anD/**/'%'=' [12:55:53] [PAYLOAD] 1%'/**/aND/**/4962=4962/**/aND/**/'%'=' [...] [12:55:54] [PAYLOAD] 1)/**/uNIoN/**/alL/**/Select/**/nuLl--/**/NRtq [12:55:54] [PAYLOAD] 1)/**/UnIOn/**/alL/**/sElEcT/**/nuLL,nuLL--/**/jalk [12:55:54] [PAYLOAD] 1)/**/Union/**/