前言:
總算進入了自己喜歡的行業. 要時刻記得當初自己說過的話, 不忘初心. Come on!
資料:
感謝超哥分享的干貨.. sqlmap干貨點擊直達
學習環境:
本次學習使用的是kali集成的sqlmap,包括后續的burp suite 不牽扯安裝.此步略過.
sqlmap簡介:
- sqlmap是一款開源免費的漏洞檢查、利用工具.
- 可以檢測頁面中get,post參數,cookie,http頭等.
- 可以實現數據榨取
- 可以實現文件系統的訪問
- 可以實現操作命令的執行
- 還可以對xss漏洞進行檢測
基本上可以說 安全從業人員必備的一款神器之軟件.也是邁入安全圈的必要條件.
支持檢測類型
sqlmap 支持5種漏洞檢測類型:
- 基於布爾的盲注檢測 (如果一個url的地址為xxxx.php?id=1,那么我們可以嘗試下的加上 and 1=1(和沒加and1=1結果保持一致) 和 and 1=2(和不加and1=2結果不一致),則我們基本可以確定是存在布爾注入的. )
- 基於時間的盲注檢測(和基於布爾的檢測有些類似.通過mysql的 sleep(int)) 來觀察瀏覽器的響應是否等待了你設定的那個值 如果等待了,則表示執行了sleep,則基本確定是存在sql注入的
- 基於錯誤的檢測 (組合查詢語句,看是否報錯(在服務器沒有抑制報錯信息的前提下),如果報錯 則證明我們組合的查詢語句特定的字符被應用了,如果不報錯,則我們輸入的特殊字符很可能被服務器給過濾掉(也可能是抑制了錯誤輸出.))
- 基於union聯合查詢的檢測(適用於如果某個web項目對查詢結果只展示一條而我們需要多條的時候 則使用union聯合查詢搭配concat還進行獲取更多的信息)
- 基於堆疊查詢的檢測(首先看服務器支不支持多語句查詢,一般服務器sql語句都是寫死的,某些特定的地方用占位符來接受用戶輸入的變量,這樣即使我們加and 也只能執行select(也不一定select,主要看應用場景,總之就是服務端寫了什么,你就能執行什么)查詢語句,如果能插入分號;則我們后面可以自己組合update,insert,delete等語句來進行進一步操作)
支持的數據庫管理系統
已知的有mysql,sql server,oracle,sqlite.............. 基本上全部支持了,如果某些小眾的不支持,放心,我們一般也接觸不到,目前還是以mysql為主流(個人見解,歡迎糾正)
其他特征
這些好像都要版本>= 0.8之后才可以使用, 我本次使用的是1.0
-d 如果你知道了對方數據庫賬號,密碼,端口等一些信息,則可以通過sqlmap直接連接 不需要再裝客戶端管理軟件 例 :Navicat
可以與burp suite ,google搜索引擎,結合使用.
get,post,cookie,referer,user-agent 都可以指定和隨機產生. (cookie過期后自動更新cookie)
並發,延遲等修改.(比如設置間隔請求時間(避免被服務器發現),並發大一點,以達到追求速度的效果,)
支持Basic,Digest,NTLM,CA等身份認證(但個人感覺還是web應用層的身份證多一點)
包含密碼破解模塊..
等.....
參數介紹
因為參數太多,我這里分項學習做筆記
options類:
sqlmap --version 查看sqlmap版本信息.
-h 查看功能參數(常用的)
-hh 查看所有的參數 (如果有中文包 就最好了)
-v 顯示更詳細的信息 一共7級, 從0-6.默認為1, 數值越大,信息顯示越詳細.
Target(指定目標):
-d 直接連接數據庫偵聽端口,類似於把自己當一個客戶端來連接.
-u 指定url掃描,但url必須存在查詢參數. 例: xxx.php?id=1
-l 指定logfile文件進行掃描,可以結合burp 把訪問的記錄保存成一個log文件, sqlmap可以直接加載burp保存到log文件進行掃描
-x 以xml的形式提交一個站點地圖給sqlmap(表示不理解..)
-m 如果有多個url地址,可以把多個url保存成一個文本文件 -m可以加載文本文件逐個掃描
-r 把http的請求頭,body保存成一個文件 統一提交給sqlmap,sqlmap會讀取內容進行拼接請求體
-g 利用谷歌搜索引擎搭配正則來過濾你想要的
-c 加載配置文件,配置文件可以指定掃描目標,掃描方式,掃描內容等等.加載了配置文件sqlmap就會根據文件內容進行特定的掃描
實踐
get掃描
掃描目標是我本機對象Mutillidae,
username | password 隨便鍵入值,
得到url :http://192.168.21.134/mutillidae/index.php?page=user-info.php&username=1&password=1&user-info-php-submit-button=View+Account+Details
我們知道 在這段url中,有用的信息只有username & password 所以我們就可以對這兩個變量進行注入測試
sqlmap :
-u 指定一個帶參數的url地址進行掃描.
-p 只對特定的參數進行掃描(我們知道,page等是用不到的,在這串url中,只有password和username是有價值的信息,所以我們只對username進行掃描)
由於我kali python環境的問題, sqlmap的 字體和常規不一致..(常規綠色,),我也沒有着手解決, 很快,sqlmap就掃描到了結果,疑似發現注入,並且發現了我們后端使用的是mysql數據庫,問我們是否跳過數據庫類型的檢測,(總之就是這意思,原理我渣渣的英文讀寫能力...),既然已經知道數據庫了,我們就沒必要進行其他類型的檢測了,常規跳過就好,:..
之后又提示我們檢測的級別(level)和風險值(risk), 級別,風險越高,對web造成的傷害性也就越高,常規為默認.(試想下,你幫客戶做滲透,結果滲透沒做好,把人家web給掃描出問題了....,如果黑客出於攻擊行為來使用的話,肯定越高越好..個人理解..) 這里我們選擇默認..
接下來sqlmap就會運用之前說的5種掃描方式來對我們指定的url種的特定參數 ,進行一系列的全自動注入,
遺憾的是通過sqlmap一系列的掃描和我不斷的 嘗試,好像並沒有注入,但是sqlmap強烈建議我們提供掃描等級和風險等級...
那我們就提升下掃描等級和風險等級:
掃了一圈結果還是沒發現注入(我晚上在好好研究下.)...
post掃描
sqlmap 支持2種post 掃描. 1, 請求文件. 2,busp suite log文件.
請求文件:
首先需要設置瀏覽器代理.
打開抓包工具,這里以burp suite為例
把我們抓到的數據包 全部復制下來 保存為一個txt文件
接下來.. sqlmap啟動, sqlmap -r request.txt -f
還有一種方式 就是通過加載burp suite的日志文件進行掃描注入..
sqlmap -l xxx.txt -f --dbs ...
burp suite的日志文件生成方式為:
Request類參數
--data 提交的時候要攜帶的參數. (get,post通用,最簡單的post請求方式).
--users 獲取數據庫用戶
--dbs 獲取所以數據庫
--param-del 變量分隔符,默認為&,
--cookie 設置cookie頭
--user-agent 指定user-agent(防止對方服務器偵測到)
--random-agent 隨機agent
--host 指定host頭
--level 安全級別 (1-5, >=3,檢測anent,>=5,檢測host頭)
--referer 指定referer頭(level >=3才檢測)
--headers 指定額外的headers請求頭(多個必須使用換\n,首字母必須大寫)
--method 指定請求方式, 默認為get,get請求不成功嘗試post
--auth-type 身份認證類型 (Basic,Digest,NTLM) ,
--auth-cred 身份認證賬號密碼 "username:password" , 完整demo: http://xxx.php?id=1 --auth-type Basic --auth-cred "u:p" (個人認為不常用)
--auth-cert / --auth-file 基於客戶端證書進行校驗,(個人感覺非常非常非常之不常用,略過...嘿嘿,放肆一把,就不學這個了)
--proxy 指定代理
--proxy-cred 指定代理的賬號密碼(代理需要賬號密碼的前提下)
--ignore-proxy 忽略系統代理(我們設置的代理都是通過瀏覽器進行設置的,通常用於掃描本地系統)
--delay 每次請求的延遲時間,單位秒,默認無延遲.
--timeout 請求超時時間,默認30秒.
--retries 連接超時重試次數 ,默認3次
--randomize 長度,類型與原始值保持一致的情況下,指定每次請求隨機取值的參數名 例: xxx.php?id=100, --randomize=''id" 則id的值在100-999隨機出現
--scope 過濾日志內容,通過正則篩選掃描對象. 例: sqlmap -l burp.log --scope="(www)?\.aaa\.(com|net|org)" 則只會掃描以www開頭.aaa.com或者net或者org
--safe-url \ --safe-freq 掃描的時候回產生大量的url,服務器可能會銷毀session.每發送--safe-freq 次注入請求后 就發送一次正常請求.
--safr-url 需要掃描的url.
--safe-freq 出現錯誤(或者說帶sql注入請求)的次數
--skip-urlencode get請求會對url進行編碼. 某些web服務器不遵循標准編碼 此參數就是不對get請求的url進行編碼
--eval 每次請求前指定執行特定的python代碼.
sqlmap之cookie應用
對本機dvwa進行sql漏洞掃描. 首先這個網站是需要登錄的.
登錄過之后,在瀏覽器內獲取cookie信息.
復制cookie信息到sqlmap ,多個cookie之間用分號間隔分開
很快就直接把數據庫給爆了出來,證明此url存在sql注入漏洞且sqlmap帶入cookie成功.
optimization(優化參數)
-0 后續3個參數的集合(除--threads)
--predict-output 根據檢測方法,比對返回值和統計表(/sqlmap/common-outputs.txt)內容,不斷縮小檢測范圍,提高檢測效率.(比對信息包括但不限於版本名,用戶名,密碼,表名,列名..等,與--threads參數不兼容)
--keep-alive 使用http(s)長連接,新能好, 與--proxy參數不兼容.長連接避免重復簡歷連接的網絡開銷,但大量長連接會嚴重占用服務器資源
--null-connection 只獲取相應頁面的大小值,而非頁面具體內容.通常用於盲注判斷真/假,降低網絡帶寬消耗. 與--text-only(基於頁面內容的比較判斷)不兼容
--threads 最大並發線程,默認為1個線程,建議不要超過10個線程,否則可能影響站點可用性.與--predict-output參數不兼容
Injection(注射參數)
-p 掃描指定的參數,例 xxx.php?id=2&name=root -p id 只會掃描id變量的值 (可以指定多個變量名,多個變量名逗號隔開)
(在使用-p的時候會使--level失效,例如--level=3的時候才會掃描user-agent,但是我們使用手動指定了掃描參數user-agent 雖然沒有指定--level=3,但此時也會掃描)
--skip 排除指定的參數,例如--level=3 會掃描user-agent 但是我們不希望掃描useragent 可以使用--skip跳過此參數的掃描
--dbms 指定后端數據庫,在已知web應用的數據庫前提下,略去sqlmap掃描判斷后端數據庫過程,提高效率.例: --dbms="mysql"(<5.0>指定版本)
--os 指定目標操作系統
--invalid-bignum/ --invalid-logical 默認使用負值使參數失效,bignum使用最大參數值使參數失效,logical使用布爾判斷值使取值失效
--no-cast 榨取數據時,sqlmap將所有結果轉換為字符串,默認用空格替換null, 老版本可能不支持空格替換,使用--no-cast關閉替換
--no-escape 不逃逸,也就是說當payload中用丹壹號界定字符串時,sqlmap使用char()編碼逃逸的方法替換字符串,也就是說不然sqlmap對payload中 的單引號進行編碼
--prefix/ --suffix 前綴/后綴
--tamper 混淆腳本,用於繞過應用層過濾,IPS,WAF. 編寫好的腳本存放於(sqlmap/tamper/...)使用的時候直接寫出腳本名稱即可,sqlmap會 自動去對應文件夾加載對應的文件
Detection(檢測)
--level 檢測級別,默認1級. 可設定1-5.級別不同,檢測的細度不同./sqlmap/xml/payloads(檢測級別不同,發送的payloads不同,)
--risk 風險級別 1-4 默認1, 如果指數過高,可能會對數據造成傷害(如:更新,刪除等)
Techniques(檢測sql漏洞存在的技術類型)
就是之前提到的sqlmap的五種檢測類型, 默認是全部使用, 也可以手動指定.
--time-sec 基於時間的注入檢測相應延遲時間(默認5秒)
--union-cols 默認聯合查詢1--10列,隨着--level增加 最多檢查50列.可以手動指定.
--union-char 聯合查詢默認使用null,可能會出現失敗,此時可以手動指定數值. 例: union select null union select 1111
--dns-domain 如果攻擊了dns服務器,使用此功能可以提高數據榨取速度
Fingerprint(指紋信息)
-f(--fingerprint) 數據庫管理系統的指紋信息(數據庫類型,操作系統,架構,補丁等)
-b (--banner) banner信息
Enumeration(枚舉)
--current-user 查詢當前數據庫管理系統賬號
--current-db 查詢當前數據庫昵稱
--hostname 查詢當前主機名
--users 查詢數據庫系統中所有的賬號
--peivileges-U xxx -u 查詢指定賬號的權限 如果不跟指定用戶名 則查詢的是所有的用戶, -CU 查詢當前用戶
-D 指定數據庫
--table 查詢所有表
-T 指定表
--columns 查詢指定表的所有列
-C 指定某一列查詢
--exclude-sysdbs 忽略系統庫
--count 統計記錄
--batch 批處理,也就是系統默認選項(按照默認的選項 全自動執行)
dump數據
--dump 保存數據到本地(配合一系列的指令)
-C 指定columns 如果不指定,默認整表
-T 指定表名,
-D 指定數據庫
-start 數據起始位置 (按表的id進行取值)
-stop 數據結束位置
--dump-all 下載整表
--sql-query 指定sql語句
Brute Force(暴力破解)
在mysql <5.0的時候 ,是沒有information_schema庫的,這時候我們就不能根據數據源表進行一系列的操作
還有一種情況是mysql>=5.0的時候,但無權限讀取information_schema庫,這時候可能就需要用到暴力破解
在微軟access數據庫中,默認是無權讀取MSysObjects庫的
--common-tables 暴力破解表名(根據字典)
--common-columns(Access系統表無列信息) 暴力破解表字段
Udf Injection(UDF注射)
--udf-inject ,, --shared-lib
--file-read 讀取目標系統指定文件(值為具體文件的路徑)
--file-write 寫入的文件
--file-dest 寫入保存的路徑
--os-cmd 執行系統命令
--os-shell 得到系統shell
--sql-shell 得到sqlshell
Winwods RegisTory(windows注冊表相關)
--reg-read 讀取注冊表鍵值
--reg-add 向注冊表添加鍵值
--reg-del 刪除注冊表鍵值
--reg-key --reg-value --reg-data --reg-type 輔助參數, 上面三個操作的時候可以縮小范圍.
Genral(常規參數)
-s sqllite會話文件保存位置
-t 記錄流量文件保存位置
--charset 強制字符編碼
--crawl 從起始位置爬站深度
--csv-del dump下來的數據默認存於","分割的csv文件中,--csv-del用來指定其他分隔符
--dbms-cred 指定數據庫賬號
--flush-session 清空session
--force-ssl 針對https的網站..
--fresh-queries 忽略本地session 從新發送請求
--output-dir 指定一個輸出目錄
--parse-errors 分析和顯示數據庫中內建報錯信息
--save 將命令保存成配置文件
--check-waf 檢測waf.ips.ids
--hpp 繞過WAF,IPS,IDS 尤其對ASP,/IIS.ASP.NET/IIS
--identify-waf 更徹底的檢查waf
Miscellaneous(雜項)
--mobile 模擬只能手機設備(實現方式只是替換對應的user-agent)
--purge-output 清除output文件夾
--smart 當有大量檢測目標時, 只選擇基於錯誤的檢測結果
--wizard 向導模式.