%00截断的原理
0x00是十六进制表示方法,是ascii码为0的字符,在有些函数处理时,会把这个字符当做结束符。 系统在对文件名的读取时,如果遇到0x00,就会认为读取已结束。
限制条件
在PHP5.3之后的版本中完全修复了00截断。并且00截断受限GPC,addslashes函数
注意: %00截断的使用对PHP有条件限制
1.php的版本小于5.3.4
2.php的magic_quotes_gpc为关闭状态
GET型%00截断
GET型提交的内容会被自动进行URL解码。 注意:一定要关闭GPC,否则无法成功。
POST型%00截断
在POST请求中,%00不会被自动解码,需要在16进制模式中将其手动修改为00
实战运用
各位i读者大大可以参考以下链接中的Pass-11和Pass-12
手把手教你玩转upload-labs靶场(1--20关超详细保姆级)
以下是上面链接中有关%00截断的段落节选:
实战演练:"战况升级---白名单来袭"
Pass-11(白名单验证---GET型%00截断)
到了这一关局势完全逆转了,查看源码发现这次使用了白名单,它只允许上传给定的后缀名,但是我们同样有绕过的手段
先用BP抓包试试水:
那么我们可以试试%00截断,直接BP抓包修改
首先上传一个.png文件开始抓包,之后用BP在save_path这里修改
Pass-12(白名单验证---POST型%00截断)
这一关的原理和Pass-11一样,不过save_path是使用POST方式进行传参的,那么在添加%00时需要进行编码(具体原因各位读者大大可以移步--->>%00截断在文件上传漏洞中的妙用)
还是先上传一个.png文件后抓包修改内容,选中%00进行编码: