00截断之追本溯源

栏目: 编程工具 · 发布时间: 5年前

内容简介:0x00,%00,/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 变成字符串结束符号。

参考:

AdminTony’s Blog

红黑联盟

安恒网络空间安全讲武堂


以上所述就是小编给大家介绍的《00截断之追本溯源》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

机械设计实践

机械设计实践

村洋太郎(日) / 王启义/等 / 机械工业出版社 / 1998-08 / 36.00

本书记述了各种设计过程的思考方法和具体作法以及必要的知识和具 体数据。介绍了设计中要决定的内容和相应的制约条件。如功能、机构、 构造、形状、力和强度、尺寸加工工艺、工具、材料、机械要素等。最后 介绍了具体设计实例。本书的目的在于即使不看其他的书和参考书就能设 计出所需要的具体机械。 本书供从事机械设计的有关技术人员及大专院校相关专业的师生使 用。一起来看看 《机械设计实践》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码