About WEB Security
00截断与%00截断
在文件上传的时候,经常会遇到对上传文件的后缀名做限制的,有时候用00截断,有时候用%00截断,一直比较懵逼,就在这里做下解释。
%00截断
%00的使用是在路径上!
%00的使用是在路径上!
%00的使用是在路径上!
重要的话说三遍。如果在文件名上使用,就无法正常截断了。如:
aaa.php%00bbb.jpg
由于%00做了截断,所以最后服务器接收到的文件名依然还是aaa.php,因为会在接收的时候,就直接对url编码进行解码,然后再去接收文件,这时候的文件名就已然变成了aaa.php,已经把后面的bbb.jpg给截断掉了。
所以,%00只能用在路径上,这个路径可能在post数据包中,也可能在url中,所以在这些地方使用%00进行截断处理,这样服务器在对文件名进行检测之后,就会把路径跟文件名拼接在一起,这时候%00就开始发挥真正的威力了。
%00(urldecode)
在burp接收到POST数据包的时候,会将POST数据包中的内容,直接进行url解码了。
首先解释为什么要进行urldecode操作呢?其原因在于上传的表单中有一个enctype的属性,并且需要enctype=”multipart/form-data” (不对表单中数据进行编码),path大多数都是存放在表单中的,因此需要在数据包中进行urldecode操作使%00变成字符串结束符号。
%00
网上也有好多是直接添加%00,但是burp未解码的,这就用到了上面所说的,burp接收到POST的数据包时,会对数据包进行url解码,但是如果%00或者说是路径不在post的数据包内呢,比如说path路径在cookie内或者是url中,就不会出现这样的问题了。
00截断
00截断的原理,就是利用0x00是字符串的结束标识符,攻击者可以利用手动添加字符串标识符的方式来将后面的内容进行截断,而后面的内容又可以帮助我们绕过检测。
需要注意的是,0x00截断是16进制的截断,需要修改16进制的数据头,如果使用burp,就要在Hex中对数据进行改写。
00截断的限制条件是PHP<5.3.29,且GPC关闭。
小结
对于00截断与%00截断,其在本质上,在原理上都是一样的。
url中的%00(只要是这种%xx)的形式,webserver会把它当作十六进制处理,然后把16进制的hex自动翻译成ascii码值“NULL”,实现了截断burpsuite中16进制编辑器将空格20改成了00。本质上来说,都是利用0x00是字符串的结束标识符,进行截断处理。
致谢:
关于上传中的00截断分析