http://www.freebuf.com/articles/web/29942.htmlphp
簡介html
許多現實中對於網站的攻擊每每是因爲網站沒有及時更新或者對於用戶的輸入沒有進行檢查。從緩衝區溢出提及,這樣一種針對系統脆弱性的威脅,最根本的問題仍是在於對於用戶的輸入沒有進行檢查。做爲主要威脅之一的SQL注入帶來了人們對於其應用和數據庫的擔心。這個問題的出現有十年的時間了,可是如今仍舊在許多網站中出現。SQL注入就像許多當前主要的的web應用安全攻擊問題也被劃歸在了對於用戶輸入的檢查上。python
許多web開發者並不知道SQL語句可以被自定義(handle)而且假定SQL語句是一個讓人信任的命令。這就讓SQL語句可以繞過訪問控制機制(access control),所以跳過標準的受權和認證檢查。甚至有些時候SQL語句可以容許使用服務器操做系統上的命令行的權限。linux
直接的SQL注入命令是一種方法,它被攻擊者構造或者是修改現成的SQL命令來暴露出隱藏的數據或者是覆蓋掉有價值的數據,甚至在服務器上執行危險地系統指令web
結構化的語言是數據庫的標準聲明語言。這讓(語言)變的更加簡潔而且更易於使用。SQL起源於70年代的IBM實驗室。SQL被用來讓應用程序與數據庫之間進行通訊。算法
SQL使用以下的4種語言來對數據庫進行操做sql
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的同仁們。