文件上传绕过之00截断
生活随笔
收集整理的這篇文章主要介紹了
文件上传绕过之00截断
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
00截斷是文件上傳時的bypass手段之一,很多人知道這種繞過方法,但卻知其然不知其所以然,對于其原理以及什么場合下適用并沒有很好的了解,本文就來談一談00截斷是怎么工作的,在什么場合下適合使用它
1. 【00截斷原理】
- 談到00截斷我們都會想到,有什么0x00截斷,%00截斷,也有人對兩個東西分析一大堆,那么它倆有什么區別呢,什么場合適用哪一個呢?這就要從00截斷的原理說起:
其實截斷的原理也很簡單,無論0x00還是%00,最終被解析后都是一個東西:chr(0)
chr()是一個函數,這個函數是用來返回參數所對應的字符的,也就是說,參數是一個ASCII碼,返回的值是一個字符,類型為string。
那么chr(0)就很好理解了,對照ASCII碼表可以知道,ASCII碼為0-127的數字,每個數字對應一個字符,而0對應的就是NUT字符(NULL),也就是空字符,而截斷的關鍵就是這個空字符,當一個字符串中存在空字符的時候,在被解析的時候會導致空字符后面的字符被丟棄。 - 這種情況常出現在ASP程序中,PHP 版本<5.3.4時也會有這個情況,JSP中也會出現。
那么就可以知道00截斷的原理了,在后綴中插入一個空字符(不是空格),會導致之后的部分被丟棄,而導致繞過的發生。如:在文件1.php.jpg中插入空字符變成:1.php.0x00.jpg中,解析后就會只剩下1.php,而空字符怎么插入的呢?通常我們會用Burp抓包后,在文件名插入一個空格,然后再HEX中找到空格對應的16進制編碼“20”,把它改成00(即16進制ASCII碼00,對應十進制的0),就可以插入空字符了。PS:這里的空格純粹只是一個標記符號,便于我們找到位置,其實這里是什么字符都無所謂,只不過空格比較有特異性,方便在HEX中查找位置
2.如何利用00截斷
- 知道了基本原理之后,我們還要分析它怎么起作用,如果按照上述的做法來做,則00繞過只能繞過前端驗證,因為如果是后端驗證,那么即使后綴被截斷了,處理之后為.php,還是會被后端驗證攔截,所以不是什么情況下00截斷都有用的,不過這里至少可以確定,在繞過前端驗證可以用。在文件名中插入空字符進行00截斷,只適合前端繞過,后端繞過無效。
那么如果我們想在后端繞過也用00截斷呢,這里就不能對文件名進行截斷了,比如文件后綴檢測代碼如下時
- 如果在Burp中直接改filename,根本無法起作用,因為截斷的只是后綴名,只能繞過簡單的前端驗證,到后端碰到上圖的代碼,在提取上傳文件后綴的時候后綴還是.php,肯定會被攔,也就是說這里00截斷沒有發揮任何“繞過”后端驗證的作用。
這里想繞過,必須要知道文件上傳的條件:
1.后綴檢測,合格則進行上傳路徑拼接
2.拼接路徑和文件名,組成文件上傳路徑
- 這里決定文件上傳后被保存在文件夾中的真實后綴名的是文件上傳路徑,因為上面一大堆代碼只不過是對后綴名進行各種處理和驗證,這里相當于一個過安檢的過程,最后決定文件到底是什么名字,什么后綴名,要看**“文件上傳路徑”**
在我的一篇博客“文件上傳漏洞靶場關鍵源碼分析”中提到過這個問題,決定最后上傳文件的真實后綴名的是拼接路徑的方法,而不是那個校驗了半天的后綴最后被處理成了個什么東西,這只是一個單純的安檢過程,不一定是最后final的后綴名,比如下圖
- 這個源碼中的文件路徑是上傳路徑和文件名拼接的,也就是說也許上面的后綴被處理了半天能通過安檢了,但是最后上傳后的文件后綴卻不一定這個被處理了半天的“后綴”,不明白的可以去看看我的上一篇博客。這里拼接的是$file_name這個變量,它和后綴名變量
$file_ext是不同的, $file_name沒有經歷那一堆安檢處理,只是從它身上截取出了一個
$file_ext變量拿去安檢,因此這里用 $file_name來拼接路徑的話,還是有可能蒙混過關的,比如這里就可以構造
xxx.php.空格. 來進行繞過。 扯遠了,回到00截斷,說了這么多,也就是說想使用00截斷繞過后端驗證,除非兩個條件之一: - 1.路徑拼接像上圖的代碼一樣,直接使用的 $file_name這個文件名,而不是 $file_ext和其他什么東西來拼成一個文件名字,這時文件名中還是包含截斷字符的,路徑拼好之后可以被截斷成想要的.php。
- 2.文件路徑可控,比如我可以修改路徑拼接的path時,比如抓到的包中存在path: uploads/,就可以直接把路徑構造成uploads/xxx.php%00,先構造一個存在截斷字符的后綴“等著”真正的文件名,或者后綴名,因為不管它是啥,都會被截斷而丟棄,因為這里已經到了“最后階段”,不會再有安檢過程了,這里截斷之后的結果就是最終上傳的結果,比如下圖中,抓到的包里發現了路徑,那么使用上面的方法直接改它,就可以成功上傳aa.php文件,不管被處理后的文件名是什么,在這里被截斷才是真正的“截斷”,因為這是在安檢(后綴名校驗)之后進行的截斷,直接決定真實的文件后綴名。
3.【0x00h和%00】
- 它們最終的結果都是一樣的,都代表著chr(0),即空字符,只不過使用的位置不同,0x00代表16進制的空字符00,需要在HEX中改為00,進行截斷,而%00是URL解碼之前的字符,它被解碼成16進制ASCII碼之后實際上也是0x00,所以它們最終都對應的是空字符,這里%00可以用在URL中如xx.php?filename=test.php%00.txt,也可以直接插在Burp包中的路徑中,如path=shell.jsp%00.txt
總結
以上是生活随笔為你收集整理的文件上传绕过之00截断的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 部分Android机子人民币符号¥只显示
- 下一篇: 智能指针手表_智能手表如何检测体内的药物