0x00,%00,/00 之类的截断,本质都是一样的,只是不同表现方式而已。
00截断在我写这篇文章之前,一直是很模糊的概念。看到别人利用成功,等到真要使用时又手足无措。用了一些时间学习了一下原理,本文引用比较多,仅仅是为了再次梳理一遍,不作为任何商业用途。
截断原理
截断漏洞出现的核心就是chr(0),这个字符不为空 (Null),也不是空字符 (“”),更不是空格。当程序在输出含有 chr(0)变量时,chr(0)后面的数据会被停止,换句话说,就是误把它当成结束符,后面的数据直接忽略,这就导致了漏洞产生。
00截断
00截断的限制条件
1 |
PHP<5.3.29,magic_quotes_gpc为OFF状态 |
00截断的利用方法
示例代码
1 |
$uploaded_name = $_FILES[ 'file' ][ 'name' ]; |
漏洞原理和利用
文件上传
需要存在上传路径,比如数据包中存在path: uploads/
,那么攻击者可以通过修改path的值来构造paylod: uploads/aa.php%00
,如果程序中检测的是文件的后缀名合法性,而且通过拼接路径和文件名来保存上传的文件,那么攻击者修改了path以后的拼接结果为:uploads/aaa.php%00/2018051413370000.php
,移动文件的时候会将文件保存为uploads/aaa.php
,从而达到Getshell效果。
文件包含
假设存在漏洞文件 lfi.php
1 |
|
和想要包含的文件 Password
1 |
|
利用:
1 |
lfi.php?action=password%00 |
即可成功包含并执行(%00是被会url解码成0x00,所以导致截断)
※也就是说,如果没有截断条件,lfi.php就只能包含php扩展名的文件,有截断条件时,lfi.php可以包含任意文件的扩展名
这时把magic_quotes_gpc
打开,%00会被转义成了 \0 两个单体字符,且不再具有截断功能。原因是:当打开magic_quotes_gpc
时,所有的 ‘(单引号),”(双引号),\(反斜线)和 %00 都会被自动加上一个反斜线进行转义,且还有很多函数有类似的作用 如:addslashes()、mysql_escape_string()、mysql_real_escape_string() 等。
常见使用误区
很多人喜欢在文件名中加%00
进行截断,其实方式是不对的,为什么呢?比如攻击者构造文件名:a.php%00a.jpg
,在提取后缀名的时候遇到%00
则认为字符串结束了,那么他提取到的后缀名最终还是.php
,.php
后缀又不允许上传所以上传肯定失败了。
%00和%00(urldecode)
这是在burp中很常见的两种操作
直接使用%00
path可以存放在URL或者Cookie中,而在提交数据的时候,浏览器会对数据做一次urlencode的操作,而到服务端,会对数据进行一次urldecode的操作,因此如果path在 非enctype=multipart/form-data 的表单中或 URL or Cookie 中的时候,就可以直接写%00
不需要进行URLdecode操作,让服务端对%00
进行自动URL解码即可。
使用%00(urldecode)
当上传的表单中有一个enctype
的属性,并且需要enctype="multipart/form-data"
(将文件以二进制的形式上传,从而可以实现多种类型的文件上传,且不对表单中数据进行编码),path
大多数都是存放在表单中的,因此需要在数据包中进行urldecode操作使%00
变成字符串结束符号。
参考:
- source:se7ensec.cn
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论