关于00截断

00截断是文件上传时的bypass手段之一

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
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

韩大侠~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值