SQL注入回顧篇(四)

前言

憶往昔,崢嶸歲月稠!大學已經到了大三了,打了很多比賽,回顧還是挺欣慰!此係列來由是想留一點東西,把所學知識整理一下,同時也是受github上Micro8分享的啓發,故想做一些工作,以留後人蔘考,歷時兩個星期,第一系列SQL注入回顧篇出爐!內容分四節發佈,其中SQL注入代碼審計爲兩節,WAF繞過總結爲1節,SQLMAP使用總結爲1節!此爲SQLMAP使用總結部分。歡迎各位斧正,交流!

簡介

SQL注入就是web應用程序對用戶輸入數據的合法性沒有判斷,前端傳入後端的參數是攻擊者可控的,並且參數帶入數據庫查詢攻擊者可以通過構造不同的sql語句來實現對數據庫的任意操作。

Sql注入的產生需要滿足以下兩個條件:

  1. 參數用戶可控:前端傳給後端的參數內容是用戶可以控制的。
  2. 參數帶入數據庫查詢:傳入的參數拼接到sql語句中,且帶入數據庫查詢。

當傳入的參數ID爲1’時,數據庫執行的代碼如下所示。

Select * from users where id=1

這個語句不符合數據庫語法規範,所以會報錯。當傳入的參數爲and 1=1時,執行的sql語句如下所示

Select * from users where id=1 and 1=1

因爲1=1爲真,且where語句中的id=1也爲真,所以頁面會返回與id=1相同的結果。當傳入的id參數爲and 1=2時,此時sql語句恆爲假,所以服務器會返回與id=1不同的結果

在實際環境中,sql注入會導致數據庫的數據泄露,在安全配置不當的情況下還可能會被攻擊者拿到系統權限,進行文件的讀寫操作等。

普通的注入審計,可以通過$_GET,$_POST等傳參追蹤數據庫操作,也可以通過select , delete , update,insert 數據庫操作語句反追蹤傳參。

Mysql注入相關知識點

  1. 在Mysql 5.0版本之後,Mysql默認在數據庫中存放一個”information_shcema”的數據庫,在該庫中,讀者需要記住三個表名,分別是SCHEMATA,TABLESCOLUMNS。分存儲該用戶創建的所有數據庫的庫名,庫名和表名,庫名和表名,字段名。

  2. Limit的用法:使用格式爲limit m,n,其中m是指記錄開始的位置,從0開始,表示第一條記錄:n是指取n條記錄。例如limit 0,1表示從第一條記錄開始,取一條記錄。

  3. 需要記住的幾個函數

    • database():當前網站使用的數據庫。
    • version():當前MYSQL的版本。
    • user():當前MySQL的用戶。
  4. 註釋符

    在MYSQL中,常見的註釋符的表達式爲:#--空格/**/

    ,//,-- , --+,,%00,--a

  5. 內聯註釋

    內聯註釋的形式:/*!code */。內聯註釋可以用於整個SQL語句中用來執行我們的SQL語句,

    舉個栗子:

    Index.php?id=-15 /*!UNION*/ /*!SELECT*/ 1,2,3
  6. MYSQL對大小寫不敏感,所以存在大小繞過。


SQLMAP使用與Tamper詳解

SQLmap是一款用來檢測與利用SQL注入漏洞的免費開源工具,有一個非常棒的特性,即對檢測與利用的自動化處理(數據庫指紋、訪問底層文件系統、執行命令)

sqlmap支持五種不同的注入模式:

  1. 基於布爾的盲注,即可以根據返回頁面判斷條件真假的注入。
  2. 基於時間的盲注,即不能根據頁面返回內容判斷任何信息,用條件語句查看時間延遲語句是否執行(即頁面返回時間是否增加)來判斷。
  3. 基於報錯注入,即頁面會返回錯誤信息,或者把注入的語句的結果直接返回在頁面中。
  4. 聯合查詢注入,可以使用union的情況下的注入。
  5. 堆查詢注入,可以同時執行多條語句的執行時的注入
常規注入過程
  • 注出數據庫
sqlmap -u"http://192.168.23.164/sqli/example1.php?name=root" –dbs

在這裏插入圖片描述

  • 注出指定數據庫的表
sqlmap -u "http://192.168.23.164/sqli/example1.php?name=root" -D exercises –tables

在這裏插入圖片描述

  • 注出表中的相關字段
sqlmap -u "http://192.168.23.164/sqli/example1.php?name=root" -D exercises -T users –columns

在這裏插入圖片描述

  • 注出字段值
sqlmap -u "http://192.168.23.164/sqli/example1.php?name=root" -D exercises -T users –dump

在這裏插入圖片描述

權限常用參數
  • -b, --banner 檢索數據庫管理系統的標識
  • –current-user 檢索數據庫管理系統當前用戶
  • –current-db 檢索數據庫管理系統當前數據庫
  • –is-dba 檢測DBMS當前用戶是否DBA
  • –users 枚舉數據庫管理系統用戶
  • –passwords 枚舉數據庫管理系統用戶密碼哈希
  • –privileges 枚舉數據庫管理系統用戶的權限
  • –roles 枚舉數據庫管理系統用戶的角色
  • –dbs 枚舉數據庫管理系統數據庫
  • –tables 枚舉的DBMS數據庫中的表
  • –columns 枚舉DBMS數據庫表列
  • –dump 轉儲數據庫管理系統的數據庫中的表項
  • –dump-all 轉儲所有的DBMS數據庫表中的條目
  • –search 搜索列(S),表(S)和/或數據庫名稱(S)
Cookie注入

當程序有防get注入的時候,可以使用cookie注入

sqlmap -u “url” –cookie “id=11” –level 2(只有level達到2纔會檢測cookie)
從post數據包中注入

可以使用burpsuite或者temperdata等工具來抓取post包

sqlmap -r “c:\tools\request.txt” -p “username” –dbms mysql  指定username參數
從數據庫中搜索字段
sqlmap -r “c:\tools\request.txt” –dbms mysql -D dedecms –search -C admin,password 

在dedecms數據庫中搜索字段admin或者password

user-agent注入
*指定參數 -r *.txt --user-agent "" --technique BEUST --dbms mysql --batch --threads 10
防屏蔽
-safe-freq 3 //一個斜槓

sqlmap詳細命令:
  • -is-dba 當前用戶權限(是否爲root權限)
  • -dbs 所有數據庫
  • -current-db 網站當前數據庫
  • -users 所有數據庫用戶
  • -current-user 當前數據庫用戶
  • -random-agent 構造隨機user-agent
  • -passwords 數據庫密碼
  • -proxy http://local:8080 –threads 10 (可以自定義線程加速) 代理
  • -time-sec=TIMESEC DBMS響應的延遲時間(默認爲5秒)

Options(選項):

  • -version 顯示程序的版本號並退出
  • -h, –help 顯示此幫助消息並退出
  • -v VERBOSE 詳細級別:0-6(默認爲1)

Target(目標):

以下至少需要設置其中一個選項,設置目標URL。

  • -d DIRECT 直接連接到數據庫。
  • -u URL, –url=URL 目標URL。
  • -l LIST 從Burp或WebScarab代理的日誌中解析目標。
  • -r REQUESTFILE 從一個文件中載入HTTP請求。
  • -g GOOGLEDORK 處理Google dork的結果作爲目標URL。
  • -c CONFIGFILE 從INI配置文件中加載選項。

Request(請求):

這些選項可以用來指定如何連接到目標URL。

  • -data=DATA 通過POST發送的數據字符串
  • -cookie=COOKIE HTTP Cookie頭
  • -cookie-urlencode URL 編碼生成的cookie注入
  • -drop-set-cookie 忽略響應的Set – Cookie頭信息
  • -user-agent=AGENT 指定 HTTP User – Agent頭
  • -random-agent 使用隨機選定的HTTP User – Agent頭
  • -referer=REFERER 指定 HTTP Referer頭
  • -headers=HEADERS 換行分開,加入其他的HTTP頭
  • -auth-type=ATYPE HTTP身份驗證類型(基本,摘要或NTLM)(Basic, Digest or NTLM)
  • -auth-cred=ACRED HTTP身份驗證憑據(用戶名:密碼)
  • -auth-cert=ACERT HTTP認證證書(key_file,cert_file)
  • -proxy=PROXY 使用HTTP代理連接到目標URL
  • -proxy-cred=PCRED HTTP代理身份驗證憑據(用戶名:密碼)
  • -ignore-proxy 忽略系統默認的HTTP代理
  • -delay=DELAY 在每個HTTP請求之間的延遲時間,單位爲秒
  • -timeout=TIMEOUT 等待連接超時的時間(默認爲30秒)
  • -retries=RETRIES 連接超時後重新連接的時間(默認3)
  • -scope=SCOPE 從所提供的代理日誌中過濾器目標的正則表達式
  • -safe-url=SAFURL 在測試過程中經常訪問的url地址
  • -safe-freq=SAFREQ 兩次訪問之間測試請求,給出安全的URL

Enumeration(枚舉):

這些選項可以用來列舉後端數據庫管理系統的信息、表中的結構和數據。此外,您還可以運行您自己的SQL語句。

  • -b, –banner 檢索數據庫管理系統的標識
  • -current-user 檢索數據庫管理系統當前用戶
  • -current-db 檢索數據庫管理系統當前數據庫
  • -is-dba 檢測DBMS當前用戶是否DBA
  • -users 枚舉數據庫管理系統用戶
  • -passwords 枚舉數據庫管理系統用戶密碼哈希
  • -privileges 枚舉數據庫管理系統用戶的權限
  • -roles 枚舉數據庫管理系統用戶的角色
  • -dbs 枚舉數據庫管理系統數據庫
  • -D DBname 要進行枚舉的指定數據庫名
  • -T TBLname 要進行枚舉的指定數據庫表(如:-T tablename –columns)
  • -tables 枚舉的DBMS數據庫中的表
  • -columns 枚舉DBMS數據庫表列
  • -dump 轉儲數據庫管理系統的數據庫中的表項
  • -dump-all 轉儲所有的DBMS數據庫表中的條目
  • -search 搜索列(S),表(S)和/或數據庫名稱(S)
  • -C COL 要進行枚舉的數據庫列
  • -U USER 用來進行枚舉的數據庫用戶
  • -exclude-sysdbs 枚舉表時排除系統數據庫
  • -start=LIMITSTART 第一個查詢輸出進入檢索
  • -stop=LIMITSTOP 最後查詢的輸出進入檢索
  • -first=FIRSTCHAR 第一個查詢輸出字的字符檢索
  • -last=LASTCHAR 最後查詢的輸出字字符檢索
  • -sql-query=QUERY 要執行的SQL語句
  • -sql-shell 提示交互式SQL的shell

Optimization(優化):

這些選項可用於優化SqlMap的性能。

  • -o 開啓所有優化開關
  • –predict-output 預測常見的查詢輸出
  • –keep-alive 使用持久的HTTP(S)連接
  • –null-connection 從沒有實際的HTTP響應體中檢索頁面長度
  • –threads=THREADS 最大的HTTP(S)請求併發量(默認爲1)

Injection(注入):

這些選項可以用來指定測試哪些參數, 提供自定義的注入payloads和可選篡改腳本。

  • -p TESTPARAMETER 可測試的參數(S)
  • –dbms=DBMS 強制後端的DBMS爲此值
  • –os=OS 強制後端的DBMS操作系統爲這個值
  • –prefix=PREFIX 注入payload字符串前綴
  • –suffix=SUFFIX 注入payload字符串後綴
  • –tamper=TAMPER 使用給定的腳本(S)篡改注入數據

Detection(檢測):

這些選項可以用來指定在SQL盲注時如何解析和比較HTTP響應頁面的內容。

  • –level=LEVEL 執行測試的等級(1-5,默認爲1)
  • –risk=RISK 執行測試的風險(0-3,默認爲1)
  • –string=STRING 查詢時有效時在頁面匹配字符串
  • –regexp=REGEXP 查詢時有效時在頁面匹配正則表達式
  • –text-only 僅基於在文本內容比較網頁

Techniques(技巧):

這些選項可用於調整具體的SQL注入測試。

  • –technique=TECH SQL注入技術測試(默認BEUST)
  • –time-sec=TIMESEC DBMS響應的延遲時間(默認爲5秒)
  • –union-cols=UCOLS 定列範圍用於測試UNION查詢注入
  • –union-char=UCHAR 用於暴力猜解列數的字符

Fingerprint(指紋):

  • -f, –fingerprint 執行檢查廣泛的DBMS版本指紋

Brute force(蠻力):

這些選項可以被用來運行蠻力檢查。

  • –common-tables 檢查存在共同表
  • –common-columns 檢查存在共同列

User-defined function injection(用戶自定義函數注入):

這些選項可以用來創建用戶自定義函數。

–udf-inject 注入用戶自定義函數

–shared-lib=SHLIB 共享庫的本地路徑

File system access(訪問文件系統):

這些選項可以被用來訪問後端數據庫管理系統的底層文件系統。

  • –file-read=RFILE 從後端的數據庫管理系統文件系統讀取文件
  • –file-write=WFILE 編輯後端的數據庫管理系統文件系統上的本地文件
  • –file-dest=DFILE 後端的數據庫管理系統寫入文件的絕對路徑

Operating system access(操作系統訪問):

這些選項可以用於訪問後端數據庫管理系統的底層操作系統。

  • –os-cmd=OSCMD 執行操作系統命令
  • –os-shell 交互式的操作系統的shell
  • –os-pwn 獲取一個OOB shell,meterpreter或VNC
  • –os-smbrelay 一鍵獲取一個OOB shell,meterpreter或VNC
  • –os-bof 存儲過程緩衝區溢出利用
  • –priv-esc 數據庫進程用戶權限提升
  • –msf-path=MSFPATH Metasploit Framework本地的安裝路徑
  • –tmp-path=TMPPATH 遠程臨時文件目錄的絕對路徑

Windows註冊表訪問:

這些選項可以被用來訪問後端數據庫管理系統Windows註冊表。

  • –reg-read 讀一個Windows註冊表項值
  • –reg-add 寫一個Windows註冊表項值數據
  • –reg-del 刪除Windows註冊表鍵值
  • –reg-key=REGKEY Windows註冊表鍵
  • –reg-value=REGVAL Windows註冊表項值
  • –reg-data=REGDATA Windows註冊表鍵值數據
  • –reg-type=REGTYPE Windows註冊表項值類型
  • 這些選項可以用來設置一些一般的工作參數。
  • -t TRAFFICFILE 記錄所有HTTP流量到一個文本文件中
  • -s SESSIONFILE 保存和恢復檢索會話文件的所有數據
  • –flush-session 刷新當前目標的會話文件
  • –fresh-queries 忽略在會話文件中存儲的查詢結果
  • –eta 顯示每個輸出的預計到達時間
  • –update 更新SqlMap
  • –save file保存選項到INI配置文件
  • –batch 從不詢問用戶輸入,使用所有默認配置。

Miscellaneous(雜項):

  • –beep 發現SQL注入時提醒

  • –check-payload IDS對注入payloads的檢測測試

  • –cleanup SqlMap具體的UDF和表清理DBMS

  • –forms 對目標URL的解析和測試形式

  • –gpage=GOOGLEPAGE 從指定的頁碼使用谷歌dork結果

  • –page-rank Google dork結果顯示網頁排名(PR)

  • –parse-errors 從響應頁面解析數據庫管理系統的錯誤消息

  • –replicate 複製轉儲的數據到一個sqlite3數據庫

  • –tor 使用默認的Tor(Vidalia/ Privoxy/ Polipo)代理地址

  • –wizard 給初級用戶的簡單向導界面


Tamper詳解

當原始注入遇到困難時,可嘗試加載相應腳本,進行繞過,說不定會有意外驚喜。在sqlmap的原命令中加入以下代碼,即可使用腳本,進行更加強有力的滲透

--tamper“腳本名稱”(可使用多個tamper)

sqlmap版本當前爲1.2.7.20,共有57個tamper腳本

序號 腳本名稱 註釋
1 0x2char 將每個編碼後的字符轉換爲等價表達
2 apostrophemask 單引號替換爲Utf8字符,用於過濾單引號
3 apostrophenullencode 替換雙引號爲%00%27
4 appendnullbyte 有效代碼後添加%00
5 base64encode 使用base64編碼
6 between 比較符替換爲between
7 bluecoat 空格替換爲隨機空白字符,等號替換爲like
8 chardoubleencode 雙url編碼
9 charencode 將url編碼(不處理已經編碼的字符)
10 charunicodeencode 使用unicode編碼
11 charunicodeescape 以指定的payload反向編碼未編碼的字符
12 commalesslimit 改變limit語句的寫法
13 commalessmid 改變mid語句的寫法
14 commentbeforeparentheses 在括號前加內聯註釋
15 concat2concatws 替換CONCAT爲CONCAT_WS
16 equaltolike 等號替換爲like
17 escapequotes 雙引號替換爲\\
18 greatest 大於號替換爲greatest,繞過對>的過濾
19 halfversionedmorekeywords 在每個關鍵字前加註釋
20 htmlencode html編碼所有非字母和數字的字符
21 ifnull2casewhenisnull 改變ifnull語句的寫法
22 ifnull2ifisnull 替換ifnull爲if(isnull(A))
23 informationschemacomment 標示符後添加註釋
24 least 替換大於號爲least
25 lowercase 全部替換爲小寫值
26 modsecurityversioned 空格替換爲查詢版本的註釋
27 modsecurityzeroversioned 添加完整的查詢版本的註釋
28 multiplespaces 添加多個空格
29 nonrecursivereplacement 替換預定義的關鍵字
30 overlongutf8 將所有字符轉義爲utf8
31 overlongutf8more 以指定的payload轉換所有字符
32 percentage 每個字符前添加%
33 plus2concat 將加號替換爲concat函數
34 plus2fnconcat 將加號替換爲ODBC函數{fn CONCAT()}
35 randomcase 字符大小寫隨機替換
36 randomcomments /**/分割關鍵字
37 securesphere 添加某字符串
38 sp_password 追加sp_password字符串
39 space2comment 空格替換爲/**/
40 space2dash 空格替換爲–加隨機字符
41 space2hash 空格替換爲#加隨機字符
42 space2morecomment 空格替換爲/_/
43 space2morehash 空格替換爲#加隨機字符及換行符
44 space2mssqlblank 空格替換爲其他空符號
45 space2mssqlhash 空格替換爲%23%0A
46 space2mysqlblank 空格替換爲其他空白符號
47 space2mysqldash 空格替換爲–%0A
48 space2plus 空格替換爲加號
49 space2randomblank 空格替換爲備選字符集中的隨機字符
50 symboliclogical AND和OR替換爲&&和||
51 unionalltounion union all select替換爲union select
52 unmagicquotes 寬字符繞過GPC
53 uppercase 全部替換爲大寫值
54 varnish 添加HTTP頭
55 versionedkeywords 用註釋封裝每個非函數的關鍵字
56 versionedmorekeywords 使用註釋繞過
57 xforwardedfor 添加僞造的HTTP頭

下面以數據庫爲區分,給出每種數據庫可供選擇的tamper。若同一腳本適用不同數據庫,則在每個數據庫中都指出

【MySQL】

版本 可用tamper編號 腳本名稱
4/5.0/5.5 1 0x2char
6 between
9 charencode
16 concat2concatws
18 greatest
24 least
25 lowercase
35 randomcase
39 space2comment
49 space2randomblank
53 uppercase
5.1 7 bluecoat
46 space2mysqlblank
5.0/5.5 12 commalesslimit
13 commalessmid
21 ifnull2casewhenisnull
22 ifnull2ifisnull
42 space2morecomment
5.0 15 concat2concatws
26 modsecurityversioned
27 modsecurityzeroversioned
4.0/5.0 41 space2hash
5.1.56 10 charunicodeencode
5.1.56/5.5.11 32 percentage
56 versionedmorekeywords
4.0.18/5.0.22 19 halfversionedmorekeywords
4.0.18/5.1.56/5.5.11 55 versionedkeywords
5.1.41 43 space2morehash
未指定版本 14 commentbeforeparentheses
40 space2dash
45 space2mssqlhash
47 space2mysqldash

【SQLServer】

版本 可用tamper編號 腳本名稱
2005/2000 10 charunicodeencode
32 percentage
44 space2mssqlblank
2005 6 between
9 charencode
16 equaltolike
25 lowercase
35 randomcase
39 space2comment
49 space2randomblank
53 uppercase
2002+ 33 plus2concat
2008+ 34 plus2fnconcat
未指定 14 commentbeforeparentheses

Access

版本 可用tamper編號 腳本名稱
未指定 4 appendnullbyte

Oracle

版本 可用tamper編號 腳本名稱
10g 6 between
9 charencode
14 commentbeforeparentheses
18 greatest
24 least
25 lowercase
35 randomcase
39 space2comment
49 space2randomblank
53 uppercase

PostgreSQL

版本 可用tamper編號 腳本名稱
8.3/8.4/9.0 6 between
9 charencode
18 greatest
24 least
25 lowercase
39 space2comment
49 space2randomblank
53 uppercase
9.0 32 percentage
9.0.3 10 charunicodeencode
未指定 14 commentbeforeparentheses
35 randomcase

MSSQL

版本 可用tamper編號 腳本名稱
未指定 38 sp_password

SQLite

版本 可用tamper編號 腳本名稱
未指定 40 space2dash

未知適用範圍

若以上腳本未解決問題,可嘗試使用一下腳本。

版本 可用tamper編號 腳本名稱
2 apostrophemask
3 apostrophenullencode
5 base64encode
8 chardoubleencode
11 charunicodeescape
17 escapequotes
20 htmlencode
23 informationschemacomment
28 multiplespaces
29 nonrecursivereplacement
30 overlongutf8
31 overlongutf8more
36 randomcomments
37 securesphere
48 space2plus
50 symboliclogical
51 unionalltounion
52 unmagicquotes
54 varnish
57 xforwardedfor

結語

此次新更的內容爲SQLMAP使用,單獨拿出SQLMAP的原因是開源,經典,強大,兼容數據庫!Tamper作爲SQLMAP靈魂內容的存在,也希望大家掌握自己開發的能力,以後我也會附上自己的分享!
傳送門:
SQL注入回顧篇(一)
SQL注入回顧篇(二)
SQL注入回顧篇(三)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章