Se7en's Blog|Learn and live

00截断之追本溯源

字数统计: 993阅读时长: 3 min
2019/02/20 Share

1

0x00,%00,/00 之类的截断,本质都是一样的,只是不同表现方式而已。

00截断在我写这篇文章之前,一直是很模糊的概念。看到别人利用成功,等到真要使用时又手足无措。用了一些时间学习了一下原理,本文引用比较多,仅仅是为了再次梳理一遍,不作为任何商业用途。

截断原理

截断漏洞出现的核心就是chr(0),这个字符不为空 (Null),也不是空字符 (“”),更不是空格。当程序在输出含有 chr(0)变量时,chr(0)后面的数据会被停止,换句话说,就是误把它当成结束符,后面的数据直接忽略,这就导致了漏洞产生。

00截断

00截断的限制条件

1
PHP<5.3.29,magic_quotes_gpc为OFF状态

00截断的利用方法

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
$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

1
2
3
4
<?php  
$temp = $_REQUEST['action'].".php";
include $temp; // include造成了LFI和php的%00截断
?>

和想要包含的文件 Password

1
2
3
<?php  
phpinfo();
?>

利用:

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变成字符串结束符号。

参考:

AdminTony’s Blog

红黑联盟

安恒网络空间安全讲武堂

CATALOG
  1. 1. 截断原理
  2. 2. 00截断
    1. 2.1. 00截断的限制条件
    2. 2.2. 00截断的利用方法
      1. 2.2.1. 示例代码
      2. 2.2.2. 漏洞原理和利用
        1. 2.2.2.1. 文件上传
        2. 2.2.2.2. 文件包含
      3. 2.2.3. 常见使用误区
  3. 3. %00和%00(urldecode)
    1. 3.1. 直接使用%00
    2. 3.2. 使用%00(urldecode)