<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    文件上傳繞過思路總結 建議收藏

    VSole2022-07-14 06:30:42

    才開始本來是項目碰到的,結果鬧了烏龍。剛好有其他的平臺,就總結一下用到的方法和思路。參考鏈接:https://xz.aliyun.com/t/10459

    繞waf的話,一般我的思路是硬懟,或者迂回打擊。先說說兩種思路

    一 硬懟

    硬懟的話,主要是從下面這些方法入手去操作。

    (1)fuzz后綴名

    看看有無漏網之魚(針對開發自定義的過濾可能有機會,針對waf基本不可能。更多的情況是php的站尋找文件包含或者解析漏洞乃至傳配置文件一類的,但是對于這種也大可不必fuzz后綴名了)

    (2)http頭變量改造

    首先要明確waf的檢測特征,一般是基于某種特定的情況下,去針對相應的攔截。幾個例子,文件上傳的時候,大多數Content-Type都是application/multipart-formdata這種,name對于waf來說,如果針對這種規則,對xxe ,sql注入,上傳,命令執行,內容等所有都去做一波掃描是及其浪費內存的,所以有可能針對不同的類型,做了不同的校驗規則。此時通過對Content-Type進行修改,可能會繞過waf。其他的http頭添加刪除等也是類似。

    (3)文件后綴構造

    這個和第一個有相似的就是都針對后綴名進行改造,不同的在于這里可能會利用waf的截取特征,比如回車換行繞過waf的檢測,但是對于后端來說接收了所有的傳入數據,導致了繞過waf。

    (4)其他方法

    這種就比較雜了,但是又不屬于迂回打擊的一類,比如重寫等方法。接下來就實戰來試試

    第一步,先來對waf的規則做一個簡單的判斷。這里我的習慣是從內容,后綴兩個方向進行判斷。簡單來說,基本分為這幾種情況

    (1)只判斷后綴(基本碰到的比較少了,因為很多時候白名單開發都可以完成)

    (2)只判斷內容(也比較少,因為一般的waf都會帶后綴的判斷)

    (3)內容后綴同時判斷(這種情況比較多,相對于來說會安全一點)

    (4)根據文件后綴來判斷內容是否需要檢測(較多)

    (5)根據Content-Type來判斷文件內容是否需要檢測

    暫時只想到這么多,以后碰到了再單獨記吧。

    有了思路,那么接下來就好說了。舉個例子我這里的情況

    (1)傳腳本后綴(被攔截,判斷了后綴)

    (2)傳腳本后綴加不免殺代碼(被攔截,可能后綴內容同時攔截)

    (3)傳非腳本名(可自己fuzz一個能過waf的任意后綴,里面加惡意內容,被攔截。也就是說同時會對內容和后綴進行判斷)

    說說我這里的情況,會對內容和后綴進行攔截。檢測到上傳jsp文件,任意內容都會被攔截。

    先來fuzz一波能利用的后綴名,這里可以包括中間件的一些配置文件。希望不大,一點都不出意外,全部被攔截了。

    既然我們需要對后綴名進行改造,就對后綴名后面加特殊符號做一個fuzz試試,測試了一下,在沒有惡意內容的情況下,只有'被過濾了。所以如果有機會,我們看看能不能試試系統特殊,比如;去做截斷。先記下來。因為最終還是需要免殺馬的,jsp免殺又不會,先不考慮這個,先考慮把waf繞過。(這里我對filename做了換行,然后去掉了引號,加了一個;做截斷繞過了waf,但是內容被查殺了,尷尬。)

    接下來對http頭部進行改造一下嘗試繞過

    一.filename改造

    (2) 名字特殊符號替換以及構造異常閉合(符號方法很多自己天馬星空,我這里就寫幾個就行了,但是要注意你改造了得讓后端識別到,亂改造識別不到等于白搭)

    filename='shell.jspx.jsp'

    filename=shell.jspx.jsp

    filename=shell.jspx.jsp'

    "filename"=shell.jspx;

    (3)重寫

    filename=shell.jpg;filename=shell.jspx;

    filename=shell.jspx;filename=shell.jpg;

    (4)大小寫變化

    FileName=shell.jspx.jsp'

    (5)參數污染

    FileName=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaashell.jspx.jsp'

    FileName =shell.jspx(加空格)

    filename===="shell.jspx.jsp1"(加等號)

    FileName =shell.jspx(前后加空格,中間也可以加特殊符號fuzz)

    (6)文件名字編碼(filename一般為后端接收參數,編碼了可能識別不到,這個就看情況)

    filename=\u0073\u0068\u0065\u006c\u006c\u002e\u006a\u0073\u0070

    (7)回車換行(有時候確實挺好用的,任意位置都可以試一下)

    1.FileName=shell.jspx.

    jsp

    2.File

    Name=shell.jspx.jsp'

    二 name改造

    name也可以任意改造,改造的方法和filename差不多,就不重復發了,主要是思路重要。

    其他的比如奇奇怪怪的正則需要用到的特殊字符都可以在文件名中fuzz一下,看看能否打斷waf規則,也就是把我們fuzz后綴的再跑一次,或者再找點其他的正則字母,這里就不重復寫了。

    http頭部格式上傳相關繞過

    有一些用畸形相關的,不太推薦一來就試,fuzz的可以帶一下,這種屬于天時地利人和占據才用,畢竟底層的規定好的合規變了就不能識別,但是也說不準fuzz出問題了呢。fuzz本來就是一個天馬行空的過程,好了,繼續來看。

    (1)Content-Disposition

    溢出繞過

    Content-Disposition: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa form-data; name="file"; filename=shell.jpg;filename=shell.jspx;

    回車換行繞過(注意不要把固定字段打散了,)

    Content-Disposition:

    form-data; name="file"; filename=shell.jpg;filename=shell.jspx;

    雙寫繞過(寫兩次)

    Content-Disposition: form-data; name="file"; filename=shell.jpg;filename=shell.jspx;

    Content-Disposition: form-data; name="file"; filename=shell.jpg;filename=shell.jspx.jpg;

    還有一些參數污染加減空格啥的,和上面filename類似,就不重復寫了。

    (2)boundary

    加減空格或者前面加惡意的參數

    boundary =---------------------------8472011224916008542288311250

    &boundary =---------------------------8472011224916008542288311250

    123& boundary =---------------------------8472011224916008542288311250

    多個污染(他是用來分割的,他變了下面的也要變一下)

    boundary =---------------------------8472011224916008542288311251

    boundary =---------------------------8472011224916008542288311252

    回車換行污染

    分割污染(簡單來說就是他自定義了一些分割部分,我們可以把我們的惡意參數提交到其他的分割部分)見下圖第一個,視情況而定。其他的常用方式和上面都可以重復的

    (3)Content-Type

    直接刪除

    修改類型為application/text或者 image/jpeg等等

    回車換行

    溢出

    參數污染

    重復傳入Content-Type

    大小寫變換

    設置charset

    Content-Type: multipart/form-data;charset=iso-8859-13

    列舉幾個

    ibm869

    ibm870

    ibm871

    ibm918

    iso-2022-cn

    iso-2022-jp

    iso-2022-jp-2

    iso-2022-kr

    iso-8859-1

    iso-8859-13

    iso-8859-15

    還有其他的方式,其實和上面的思路差不多

    http頭部其他繞過

    這一塊就比較多了,編碼,長度等等,都可以試一下,具體的方法和上面的差不多。這里就用參考鏈接pureqh老哥的幾個東西了。

    1.Accept-Encoding 改變編碼類型

    Accept-Encoding: gzip

    Accept-Encoding: compress

    Accept-Encoding: deflate

    Accept-Encoding: br

    Accept-Encoding: identity

    Accept-Encoding: *

    下面截取的圖片是我本次的,就不弄其他的了,長度那一塊,主要是說內容方面相關的。

    2.修改請求方式繞過

    post改為get put等其他的請求方式(這一塊主要是針對waf的攔截特性)

    3.host頭部繞過

    對host進行回車,換行

    修改host頭部

    host跟鏈接

    host改為127.0.0.1

    刪除host

    到這里就差不多了,再來回頭理一下我們的思路。借用露迅先生的一句話,你如果啥都不曉得就莽起整,一些都等求于零。所以我們總結一下我們的思路。

    waf的特性大多數是寫了很多的規則,基于截取的內容做規則匹配,匹配到了就不放行,未匹配到就認為是安全的放行,所以我們需要做的就是繞過waf對于規則的匹配。大概是這幾個方向

    (1)基于正則匹配的繞過(也就是參數污染,正則破壞等上面的方法,打亂waf的檢測)

    (2)基于正則匹配的缺失(類似于修改請求等,讓waf根本不去檢測這部分的內容)

    (3)基于操作系統的特性(類似于后綴名加特殊符號讓操作系統進行識別)

    我們做一切的前提都是既繞過了waf,也能讓后端識別,所以可以亂來,不要太亂。基本也就是污染,多寫,繞過,添加刪除幾個方向。

    二 迂回打擊

    說是迂回打擊,但是其實就是利用一些通用的手段,或者中間件的特性去繞過waf,甚至說尋找到了真實ip去直接繞過云waf等方法。這里我就簡單總結一些,不全面的話忘體諒。這一塊主要是內容相關的了。

    基于http的繞過

    這種屬于硬懟,方法如下:

    1.免殺馬

    這種是萬能的,只要能免殺就能如履平地,但是現在的waf規則更新太快了,熬了一夜去弄了個免殺,第二天踩了蜜罐上去就被抓,藍方產品支持加入規則,一點也不美滋滋,但是這也是一條YYDS的道路

    2.分塊傳輸

    說實話這玩意兒我從來沒有成功過,但是面試問的挺多的,有一次有個面試官還專門跟我提了這個所以我這里列舉一下。但是分塊參數+參數污染組合利用貌似效果還是不錯

    3.修改長度字段

    和分塊參數有點類似,作用是這樣,有些時候做參數大數據污染的時候,waf判斷數據過長直接丟棄,有些判斷長度和內容相差太多也直接丟棄。這時候可以把兩者結合起來使用,達到超長數據繞過waf的檢測,同時數據送到了后端

    4.修改傳輸編碼

    和分塊傳輸類似,自己手動去改,burp那個插件工具我是一次都沒成功過

    5.基于網站系統特性添加字段

    比如ASP專屬bypass-devcap-charset,添加這些字段去繞過waf的檢測(這也是我看到但是沒機會實戰,記錄一下)

    6.修改頭部+內容結合

    修改頭部為其他格式,再把內容頭加其他格式,例如圖片,中間插入惡意代碼,類似圖片馬

    7.增加多個boundary

    這樣子打亂了惡意內容,有點類似分開傳輸,欺騙waf的檢測,逃逸后面的代碼。

    8.文件名寫入文件

    windows下利用多個<<<<去寫入文件,詳情可以看參考鏈接。

    還有一些其他的方法,這一種也是類似于對waf欺騙,過著直接利用免殺硬過waf的。jsp免殺不會,就不獻丑免殺了。

    其他繞過

    這種繞過就是一般適用于云waf了。咋說呢,這種我碰到的不怎么多,因為一般碰到的云waf基本都很強,注入上傳類的繞過現在越來越難了,xss還好一點,但是不走釣魚的話xss也沒用太大的用處,畢竟可以一把梭最舒服。來看看吧,檢測全球ping就行。

    1.尋找真實ip

    這個方法網上太多了,說下我常用的

    (1)利用ssl證書尋找

    (2)利用子域名尋找

    (3)利用公司其他業務尋找(跑C端看運氣,和子域名一樣)

    (4)利用信息泄露尋找(github,google,目錄文件,js代碼等)

    (5)利用一些云網站或者專門查找cdn的網站,鏈接在家里電腦上,這電腦沒有,就自己去找吧

    (6)利用已知工具

    (7)搜索引擎(fofa,夸克等,看以前收集的業務)

    (8)利用http返回信息

    (9)找郵箱弱口令,然后你懂的

    (10)找朋友,你懂的。

    2.利用子域名去打

    有些網站,可能外面做了防護,子域名沒加waf,而子域名又在白名單,迂回去錘就行了。

    3.利用頭部繞過

    基本碰不到了,修改host為本地ip,現在已經絕跡了,突然想起來寫一下。

    4.找設備

    找一些vpn一類的設備碰碰運氣

    其他的就不說了吧,頭痛。總結下這個思路

    (1)直接尋找waf保護后的目標地址,進行親身擁抱(繞過waf去打)

    (2)尋找waf后目標的子女子孫親兒子(被waf加白的一些資產)去挑撥離間。

    免殺waf
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    前言提到webshell,方法無外乎對靜態特征的變形,編碼,或利用語言特性繞過。計算機中有很多符號,它們在編程語言中占據一席之地,這些符號作為運算符號,標識符號或起到特殊含義。本文以PHP為例介紹一些利用符號方法。WAF檢測通過對安全狗、護衛神、D盾等常見軟WAF的測試,發現WAF查殺主要依賴兩種檢測方法1.靜態檢測:通過匹配特征來查找webshell。如危險函數,文件特征碼等。例如 ${$my_var[8]}與${$my_var}[8]的區分${xxx} 括起來的要當成變量處理。
    對于很多大佬來說肯定是十分熟悉的,弟弟我只能簡單的介紹下其簡介: cs擁有多種協議主機上線方式,集成了提權,憑據導出,端口轉發,socket代理,office攻擊,文件捆綁,釣魚等功能。同時,cs還可以調用Mimikatz等其他知名工具。0x03 實踐說的再多也不如拿真實情況來說話,實踐主要對上述的六種工具做下簡單的使用,并利用線上沙箱進行簡單的查殺檢測。接下來主要以3.12為主。
    0x01 前言我們在滲透測試過程中時常會用到一些腳本,而現在大部分的WAF軟都會根據一些危險組件名、特定字符做為特征來查殺,只要找到其特征,我們可以使用簡單的混淆、拼接等方式來進行
    請勿利用文章內的相關技術從事非法測試,如因此產生的一切不良后果與文章作者和本公眾號無關。然后再去做針對性的和繞過測試,盡可能避免出現查殺和攔截提示,動靜大、易被發現
    此時通過對Content-Type進行修改,可能會繞過waf。其他的http頭添加刪除等也是類似。檢測到上傳jsp文件,任意內容都會被攔截。先來fuzz一波能利用的后綴名,這里可以包括中間件的一些配置文件。希望不大,一點都不出意外,全部被攔截了。因為最終還是需要馬的,jsp又不會,先不考慮這個,先考慮把waf繞過。fuzz本來就是一個天馬行空的過程,好了,繼續來看。
    此時通過對Content-Type進行修改,可能會繞過waf。其他的http頭添加刪除等也是類似。檢測到上傳jsp文件,任意內容都會被攔截。先來fuzz一波能利用的后綴名,這里可以包括中間件的一些配置文件。希望不大,一點都不出意外,全部被攔截了。因為最終還是需要馬的,jsp又不會,先不考慮這個,先考慮把waf繞過。fuzz本來就是一個天馬行空的過程,好了,繼續來看。
    webshell之傳參方式及特征繞過傳參方式 在這里解釋一下為什么,需要講述傳參方式,由于在很多情況下,以請求頭作為參數傳遞并非waf和人工排查的重中之重且非常誤導和隱藏
    傳統的php不用多說了 無非就是各種變形和外部參數獲取,對于一些先進的waf和防火墻來說,不論如何解析最終都會到達命令執行的地方,但是如果語法報錯的話,就可能導致解析失敗了,這里簡單說幾個利用php版本來進行語義出錯的php命令執行方式。
    傳統的php不用多說了,無非就是各種變形和外部參數獲取,對于一些先進的waf和防火墻來說,不論如何解析最終都會到達命令執行的地方,但是如果語法報錯的話,就可能導致解析失敗了,這里簡單說幾個利用php版本來進行語義出錯的php命令執行方式。
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类