内容简介:0x00,%00,/00 之类的截断,本质都是一样的,只是不同表现方式而已。00截断在我写这篇文章之前,一直是很模糊的概念。看到别人利用成功,等到真要使用时又手足无措。用了一些时间学习了一下原理,本文引用比较多,仅仅是为了再次梳理一遍,不作为任何商业用途。
0x00,%00,/00 之类的截断,本质都是一样的,只是不同表现方式而已。
00截断在我写这篇文章之前,一直是很模糊的概念。看到别人利用成功,等到真要使用时又手足无措。用了一些时间学习了一下原理,本文引用比较多,仅仅是为了再次梳理一遍,不作为任何商业用途。
截断原理
截断漏洞出现的核心就是chr(0),这个字符不为空 (Null),也不是空字符 (“”),更不是空格。当程序在输出含有 chr(0)变量时,chr(0)后面的数据会被停止,换句话说,就是误把它当成结束符,后面的数据直接忽略,这就导致了漏洞产生。
00截断
00截断的限制条件
PHP<5.3.29,magic_quotes_gpc为OFF状态
00截断的利用方法
示例代码
$uploaded_name = $_FILES[ 'file' ][ 'name' ]; $uploaded_ext = substr( $uploaded_name, strrpos( $uploaded_name, '.' ) + 1); // 提取上传文件后缀 $target_name = md5( uniqid() . $uploaded_name ) . '.' . $uploaded_ext; // 对上传文件进行重命名 if( ( strtolower( $uploaded_ext ) == "jpg" || strtolower( $uploaded_ext ) == "jpeg" || strtolower( $uploaded_ext ) == "png" )) { move_uploaded_file($_FILES["file"]["tmp_name"], $dir . $target_name); // 将临时文件移动到指定目录 $result = $dir . $target_name; echo "Stored in: $result"; } else{ echo "Invalid file"; }
漏洞原理和利用
文件上传
需要存在上传路径,比如数据包中存在 path: uploads/
,那么攻击者可以通过修改path的值来构造paylod: uploads/aa.php%00
,如果程序中检测的是文件的后缀名合法性,而且通过拼接路径和文件名来保存上传的文件,那么攻击者修改了path以后的拼接结果为: uploads/aaa.php%00/2018051413370000.php
,移动文件的时候会将文件保存为 uploads/aaa.php
,从而达到Getshell效果。
文件包含
假设存在漏洞文件 lfi.php
<?php $temp = $_REQUEST['action'].".php"; include $temp; // include造成了LFI和 php 的%00截断 ?>
和想要包含的文件 Password
<?php phpinfo(); ?>
利用:
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
变成字符串结束符号。
参考:
以上所述就是小编给大家介绍的《00截断之追本溯源》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- CSS 来实现多行文字截断
- perl – 截断stdin行长度?
- 技术问题分析-报文截断(11.20)
- 技术问题分析-报文截断02(11.21)
- 技术问题分析-报文截断03(11.22)
- linux curl请求时参数被截断
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Hacking Growth
Sean Ellis、Morgan Brown / Crown Business / 2017-4-25 / USD 29.00
The definitive playbook by the pioneers of Growth Hacking, one of the hottest business methodologies in Silicon Valley and beyond. It seems hard to believe today, but there was a time when Airbnb w......一起来看看 《Hacking Growth》 这本书的介绍吧!
在线进制转换器
各进制数互转换器
html转js在线工具
html转js在线工具