00截断
在文件上传漏洞的学习中,经常会用到00截断,所以探究一下00截断的具体原理
原理
Null
Null是ASCII码的第一个字符,一个不可见字符,其ASCII码值是0x00
作为字符串的结束标识符,能将后面内容进行截断
而操作系统是根据 c/汇编 编写的,所以这种截断是操作系统层的漏洞
%00
- 在url编码中,一个特殊字符常为%加两位字符的形式
例如:a 的url编码为%61
- 而%的后两位实际上是ASCII码16进制
只要是%xx的形式,webserver都会把他当做ASCII码16进制处理,然后解码成对应字符
字符null(空字符)在ASCII码中为0x00
所以url编码%00,会被识别为ASCII码十六进制00,然后翻译成NULL
00截断的使用
条件
- magic_quotes_gpc = off
如果魔术引号开启,NULL 字符会被自动加上一个反斜线进行转义,失去了截断的作用
- php版本 < 5.3.29
后续版本已修复
截断位置
- 00截断的使用不能在文件名上
若创建文件a.php%00f.jpg
虽然%00实现了截断,文件名已经变成了php后缀,不能绕过白名单
- 只能用在路径上
服务器对文件名检测,发现满足条件后,与路径拼接
这时在路径上的%00实现截断,完成了绕过
实践步骤
- 上传一个jpg文件的一句话木马
抓包,观察文件保存路径
- 若在url中,则在upload/后添加1.php%00 ,截断后文件名会变成1.php
- 若在post请求中,不会自动将%00转化为null
方法一:手动进行url解码
方法二:hex中改为00
- 文件上传成功,并改为php后缀,用蚁剑进行连接