日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

文件上传绕过之00截断

發(fā)布時(shí)間:2023/12/20 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 文件上传绕过之00截断 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

00截?cái)嗍俏募蟼鲿r(shí)的bypass手段之一,很多人知道這種繞過方法,但卻知其然不知其所以然,對(duì)于其原理以及什么場(chǎng)合下適用并沒有很好的了解,本文就來(lái)談一談00截?cái)嗍窃趺垂ぷ鞯?#xff0c;在什么場(chǎng)合下適合使用它

1. 【00截?cái)嘣怼?/h3>
  • 談到00截?cái)辔覀兌紩?huì)想到,有什么0x00截?cái)?#xff0c;%00截?cái)?#xff0c;也有人對(duì)兩個(gè)東西分析一大堆,那么它倆有什么區(qū)別呢,什么場(chǎng)合適用哪一個(gè)呢?這就要從00截?cái)嗟脑碚f(shuō)起:
    其實(shí)截?cái)嗟脑硪埠芎?jiǎn)單,無(wú)論0x00還是%00,最終被解析后都是一個(gè)東西:chr(0)
    chr()是一個(gè)函數(shù),這個(gè)函數(shù)是用來(lái)返回參數(shù)所對(duì)應(yīng)的字符的,也就是說(shuō),參數(shù)是一個(gè)ASCII碼,返回的值是一個(gè)字符,類型為string。
    那么chr(0)就很好理解了,對(duì)照ASCII碼表可以知道,ASCII碼為0-127的數(shù)字,每個(gè)數(shù)字對(duì)應(yīng)一個(gè)字符,而0對(duì)應(yīng)的就是NUT字符(NULL),也就是空字符,而截?cái)嗟年P(guān)鍵就是這個(gè)空字符,當(dāng)一個(gè)字符串中存在空字符的時(shí)候,在被解析的時(shí)候會(huì)導(dǎo)致空字符后面的字符被丟棄
  • 這種情況常出現(xiàn)在ASP程序中,PHP 版本<5.3.4時(shí)也會(huì)有這個(gè)情況,JSP中也會(huì)出現(xiàn)。
    那么就可以知道00截?cái)嗟脑砹?#xff0c;在后綴中插入一個(gè)空字符(不是空格),會(huì)導(dǎo)致之后的部分被丟棄,而導(dǎo)致繞過的發(fā)生。如:在文件1.php.jpg中插入空字符變成:1.php.0x00.jpg中,解析后就會(huì)只剩下1.php,而空字符怎么插入的呢?通常我們會(huì)用Burp抓包后,在文件名插入一個(gè)空格,然后再HEX中找到空格對(duì)應(yīng)的16進(jìn)制編碼“20”,把它改成00(即16進(jìn)制ASCII碼00,對(duì)應(yīng)十進(jìn)制的0),就可以插入空字符了。PS:這里的空格純粹只是一個(gè)標(biāo)記符號(hào),便于我們找到位置,其實(shí)這里是什么字符都無(wú)所謂,只不過空格比較有特異性,方便在HEX中查找位置

2.如何利用00截?cái)?/h4>
  • 知道了基本原理之后,我們還要分析它怎么起作用,如果按照上述的做法來(lái)做,則00繞過只能繞過前端驗(yàn)證,因?yàn)槿绻呛蠖蓑?yàn)證,那么即使后綴被截?cái)嗔?#xff0c;處理之后為.php,還是會(huì)被后端驗(yàn)證攔截,所以不是什么情況下00截?cái)喽加杏玫?#xff0c;不過這里至少可以確定,在繞過前端驗(yàn)證可以用。在文件名中插入空字符進(jìn)行00截?cái)?#xff0c;只適合前端繞過,后端繞過無(wú)效。
    那么如果我們想在后端繞過也用00截?cái)嗄?#xff0c;這里就不能對(duì)文件名進(jìn)行截?cái)嗔?#xff0c;比如文件后綴檢測(cè)代碼如下時(shí)

  • 如果在Burp中直接改filename,根本無(wú)法起作用,因?yàn)榻財(cái)嗟闹皇呛缶Y名,只能繞過簡(jiǎn)單的前端驗(yàn)證,到后端碰到上圖的代碼,在提取上傳文件后綴的時(shí)候后綴還是.php,肯定會(huì)被攔,也就是說(shuō)這里00截?cái)鄾]有發(fā)揮任何“繞過”后端驗(yàn)證的作用。
    這里想繞過,必須要知道文件上傳的條件:

1.后綴檢測(cè),合格則進(jìn)行上傳路徑拼接
2.拼接路徑和文件名,組成文件上傳路徑

  • 這里決定文件上傳后被保存在文件夾中的真實(shí)后綴名的是文件上傳路徑,因?yàn)樯厦嬉淮蠖汛a只不過是對(duì)后綴名進(jìn)行各種處理和驗(yàn)證,這里相當(dāng)于一個(gè)過安檢的過程,最后決定文件到底是什么名字,什么后綴名,要看**“文件上傳路徑”**
    在我的一篇博客“文件上傳漏洞靶場(chǎng)關(guān)鍵源碼分析”中提到過這個(gè)問題,決定最后上傳文件的真實(shí)后綴名的是拼接路徑的方法,而不是那個(gè)校驗(yàn)了半天的后綴最后被處理成了個(gè)什么東西,這只是一個(gè)單純的安檢過程,不一定是最后final的后綴名,比如下圖

  • 這個(gè)源碼中的文件路徑是上傳路徑和文件名拼接的,也就是說(shuō)也許上面的后綴被處理了半天能通過安檢了,但是最后上傳后的文件后綴卻不一定這個(gè)被處理了半天的“后綴”,不明白的可以去看看我的上一篇博客。這里拼接的是$file_name這個(gè)變量,它和后綴名變量
    $file_ext是不同的, $file_name沒有經(jīng)歷那一堆安檢處理,只是從它身上截取出了一個(gè)
    $file_ext變量拿去安檢,因此這里用 $file_name來(lái)拼接路徑的話,還是有可能蒙混過關(guān)的,比如這里就可以構(gòu)造
    xxx.php.空格. 來(lái)進(jìn)行繞過。 扯遠(yuǎn)了,回到00截?cái)?#xff0c;說(shuō)了這么多,也就是說(shuō)想使用00截?cái)嗬@過后端驗(yàn)證,除非兩個(gè)條件之一:
  • 1.路徑拼接像上圖的代碼一樣,直接使用的 $file_name這個(gè)文件名,而不是 $file_ext和其他什么東西來(lái)拼成一個(gè)文件名字,這時(shí)文件名中還是包含截?cái)嘧址?#xff0c;路徑拼好之后可以被截?cái)喑上胍?php。
  • 2.文件路徑可控,比如我可以修改路徑拼接的path時(shí),比如抓到的包中存在path: uploads/,就可以直接把路徑構(gòu)造成uploads/xxx.php%00,先構(gòu)造一個(gè)存在截?cái)嘧址暮缶Y“等著”真正的文件名,或者后綴名,因?yàn)椴还芩巧?#xff0c;都會(huì)被截?cái)喽鴣G棄,因?yàn)檫@里已經(jīng)到了“最后階段”,不會(huì)再有安檢過程了,這里截?cái)嘀蟮慕Y(jié)果就是最終上傳的結(jié)果,比如下圖中,抓到的包里發(fā)現(xiàn)了路徑,那么使用上面的方法直接改它,就可以成功上傳aa.php文件,不管被處理后的文件名是什么,在這里被截?cái)嗖攀钦嬲摹敖財(cái)唷?#xff0c;因?yàn)檫@是在安檢(后綴名校驗(yàn))之后進(jìn)行的截?cái)?#xff0c;直接決定真實(shí)的文件后綴名。

3.【0x00h和%00】

  • 它們最終的結(jié)果都是一樣的,都代表著chr(0),即空字符,只不過使用的位置不同,0x00代表16進(jìn)制的空字符00,需要在HEX中改為00,進(jìn)行截?cái)?#xff0c;而%00是URL解碼之前的字符,它被解碼成16進(jìn)制ASCII碼之后實(shí)際上也是0x00,所以它們最終都對(duì)應(yīng)的是空字符,這里%00可以用在URL中如xx.php?filename=test.php%00.txt,也可以直接插在Burp包中的路徑中,如path=shell.jsp%00.txt

總結(jié)

以上是生活随笔為你收集整理的文件上传绕过之00截断的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。