SQL註入之SQLmap入門
http://www.freebuf.com/articles/web/29942.html
簡介
許多現實中對於網站的攻擊往往是由於網站沒有及時更新或者對於用戶的輸入沒有進行檢查。從緩沖區溢出說起,這樣一種針對系統脆弱性的威脅,最根本的問題還是在於對於用戶的輸入沒有進行檢查。作為主要威脅之一的SQL註入帶來了人們對於其應用和數據庫的擔憂。這個問題的出現有十年的時間了,但是現在仍舊在許多網站中出現。SQL註入就像許多當前主要的的web應用安全攻擊問題也被劃歸在了對於用戶輸入的檢查上。
正文
許多web開發者並不知道SQL語句能夠被自定義(handle)並且假定SQL語句是一個讓人信任的命令。這就讓SQL語句能夠繞過訪問控制機制(access control),因此跳過標準的授權和認證檢查。甚至有些時候SQL語句能夠允許使用服務器操作系統上的命令行的權限。
直接的SQL註入命令是一種方法,它被攻擊者構造或者是修改現成的SQL命令來暴露出隱藏的數據或者是覆蓋掉有價值的數據,甚至在服務器上執行危險地系統指令
入門
結構化的語言是數據庫的標準聲明語言。這讓(語言)變的更加簡潔並且更易於使用。SQL起源於70年代的IBM實驗室。SQL被用來讓應用程序與數據庫之間進行通信。
SQL使用如下的4種語言來對數據庫進行操作
SELECT -從數據庫中獲得一條記錄
INSERT-向數據庫中插入一條記錄
DELETE-從數據庫中刪除一條記錄
UPDATE-從數據庫中更新或者改變當前記錄
當用戶提交的語句被用作數據庫的查詢語句時SQL就能夠發生。比如當用戶被網站認證授權,用戶發送一個帶有"用戶名"和"密碼"的信息,用戶名/密碼就與存放在數據庫中的內容進行核對。如果相同的話用戶就被允許登錄,否則用戶登錄失敗。以下是一個在後臺進行登錄的例子。
代碼
SELECT * FROM user WHERE username=‘$username‘ AND password=‘$password‘
這個語句簡單地指明了從user的表中查詢用戶名和username相等的,並且密碼和password相等的。所以,如果用戶發送用戶名為"admin",並且密碼為"12345",那麽SQL語句被創建如下:
SELECT * FROM user WHERE username=‘admin‘ AND password =‘12345‘
註入
那麽,如果用戶輸入‘ or ‘1‘=‘1,第一個引號會終止輸入的字符串,剩下的會被當做SQL語句,並且在SQL語句中1=1恒為真,這就能夠讓我們繞過註冊機制
SELECT * FROM user WHERE username=‘admin‘ AND password =‘‘or ‘1‘=‘1‘ -TRUE
上述是一個SQL註入的簡單地例子,然而在實際過程中,SQL註入比這要復雜的多。在我們的滲透測試中,大多數時候我們有一個非常緊湊的計劃表,所以這個時候我們需要一個自動化的攻擊來為我們進行註入攻擊。
SQLMAP就是一能夠利用(系統)脆弱性的工具。它是開源的,並經常被用來在Python寫的脆弱的DBMS上進行入侵的滲透測試。它能夠檢測並利用SQL上的漏洞,讓我們舉例在操作系統和數據庫上使用sqlmap.py。
一步一步
我將盡可能地以最簡潔的方式展示出來。
最常見的檢測SQL註入的方法是通過在輸入處添加一個單引號(')並且期待(系統)返回一個錯誤,有些應用程序並不會返回錯誤。這個時候我們就會利用true/false語句來檢查是否這個應用程序會受到SQL註入的攻擊。
為了隨機的找到還有SQL註入的脆弱性的網站,你能夠使用如下格式的語句利用google dork:inurl:news.php id =1?將會出現一堆google dork的數據並且為你過濾你搜索得到的結果提供了可能。那麽讓那個我們開始吧。
首先在backtrack上進入目錄:
cd /pentest/database/sqlmap
我們不會立即開始,查看sqlmap.py的菜單使用命令:
./sqlmap.py -h
讓我們運行sqlmap.py, 參數是[ --dbs],來發現DBMS中的所有數據庫
或者是使用參數 –current-db來發現當前目標使用的數據庫
參數-D表示目標的數據庫,–table顯示表列
我們將會檢查在信息中是否包含感興趣的內容(admin_users),並把它們按列顯示出來,參數是-columns
在你列出表格之前每次指定目標數據庫(使用-D參數)是很重要的,因為如果沒有-D參數,程序將列出數據庫中所有的表格
-T =目標參數
-C=目標列(可以指定超過一列,如:用戶名(列),密碼(列))
–dump=獲得,提取數據
使用–proxy參數來使用代理
例如:./sqlmap.py –url "http://testphp.vulnweb.com/listproducts.php?cat=1" –dbs –proxy=http://183.223.10.108:80
我認為以上是對於初學者的基礎的命令。sqlmap同樣提供許多有趣的功能,我建議使用–prefix=PREFIX,–postfix=POSTFIX和takeover選項。更多關於該工具的使用可以訪問官方網站。
–dump是用來提取網站上的數據,調用時必須選中列,並且你必須明確從列中具體提取什麽內容,這裏我提取列中保存的登錄和密碼信息。
通常,DBMS的"password"字段是加密的。通常使用的加密算法是SHA-1,MD5,這些算法在使用時並沒有加入"salt"(指根據用戶的輸入直接進行算法計算),這就使得破解更加容易。那麽(拿到加密的數據後)我們就需要對其進行解密,我們能夠使用許多在線解密網站如:
http://www.md5decrypt.org,
https://crackstation.net/,
http://www.onlinehashcrack.com/
或者嘗試手工暴力破解和彩虹表。此外你還能夠使用你的GPU來加快(破解)的過程,這就不是本文所要主要討論的內容了。
進階
幸運的是,sqlmap有一些非常好的腳本,在如下的地址中你能夠發現它們。使用svn檢查
https://svn.sqlmap.org/sqlmap/trunk/sqlmap sqlmap-dev
事實上,腳本的作用是修改我們發出的請求來防止其被WAF(網絡應用防火墻)攔截。在某些情況你可能需要把一些腳本合並到一起才能過WAF。腳本的完整列表訪問如下:
https://svn.sqlmap.org/sqlmap/trunk/sqlmap/tamper/
許多企業經常忽視當前(DBMS)的脆弱性而依賴於網絡防火墻。不幸的是,經過簡單地代碼編碼就能繞過大部分防火墻。所以先生們,我想展示一下如何利用一些新功能來繞過WAF/IDF(入侵檢測系統)。
我將展示一些重要的腳本如charencode.py和charcodeencode.py來與MySQL進行操作,這些腳本能夠在backtrack5的
/pentest/web/scanners/sqlmap下面找到。
Hands-on:在你使用這些腳本的時候,使用–tamper參數後面跟腳本名字,在截圖中我們使用了charencode命令
charencode.py總結
簡單的說,這個腳本能夠繞過一些比較簡單的網絡防火墻(WAF).. 其它的比較有趣的功能是(WAF)在匹配它們的規則之前會對url進行解碼。
例:
另一個好的腳本是charunicodeencode.py,在我的實際滲透測試過程中,它幫助我繞過了許多防火墻的限制。
嘿,我只是展示了一小部分腳本,我強烈建議你將每個都使用一遍,因為它們往往適用於不同的環境。
註意:這並不是腳本小子的做法,負責地,熟練地掌握這樣一個強大的工具是非常重要的
匿名
我將想你展示怎麽樣使用sqlmap和Onion路由器來保護你的IP,DNS等等,在linux中,在終端命令符為$時使用
sudo apt-get install tor tor-geoip
進入sqlmap的目錄後:./sqlmap.py -u "http://www.targetvuln.com/index/php?cata_id=1" -b -a -tor –check-tor–user-agent="Mozilla/5.0(compatible;Googlebot/2.1;+http://www.google.com/bot.html)"
參數–tor使用Tor,–check-tor會檢查Tor是否被正確地使用,如果沒有正確被使用,終端會提示錯誤信息。用戶代理是googlebot,所有你的請求會被看起來像是Googlebot發出的一樣。
利用sqlmap的Tor我們能夠設置你的TOR代理來隱藏實際請求產生的地址
-tor-port,-tor-type:這兩個參數能夠幫你手動設置TOR代理,–check-tor參數會檢查你的代理是否被正確地安裝並正常的工作。
結語
當SQL註入在幾年前被發現時,許多目標都存在這樣的缺陷,註入的格式就是其中最難的部分。滲透測試者往往需要自己構造這樣的SQL語句。
接下來的發展就產生了自動註入的工具。當前最知名的工具可能就是sqlmap.py。SQLMAP是用python寫的開源的測試框架,支持MySQL,Oracle,PostgreSQL,Microsoft SQL Server,Microsoft Access,IBM DB2,SQLite,Firebird,Sybase,SAP,MAXDB並支持6中SQL註入手段。
解決方案
1.定期檢查SQL服務器(的處理請求)
2.限制動態SQL語句
3.避免從用戶直接獲得數據
4.將數據庫的權限信息單獨存放在另外一個文件中
5.使用最小權限原則
6.使用預先準備好的(SQL)語句
在此非常感謝我的哥哥Rafay Baloch和RHA的同仁們。
SQL註入之SQLmap入門