File Upload

1. 题目

File Upload,即文件上传漏洞,通常是由于对上传文件的类型、内容没有进行严格的过滤、检查,使得攻击者可以通过上传木马获取服务器的webshell权限,因此文件上传漏洞带来的危害常常是毁灭性的,Apache、Tomcat、Nginx等都曝出过文件上传漏洞。

2. Low

a. 代码分析

<?php
if( isset( $_POST[ 'Upload' ] ) ) {
// 这段代码是有关文件上传之后的位置的。basename函数返回路径中的文件名部分。如果可选参数suffix为空,则返回的文件名包含后缀名,反之不包含后缀名。
$target_path = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
$target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] ); // 判断是否可以上传。move_uploaded_file函数将上传的文件移动到新位置。
if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) {
// 上传失败
echo '<pre>Your image was not uploaded.</pre>';
}
else {
// 上传成功,并返回文件路径
echo "<pre>{$target_path} succesfully uploaded!</pre>";
}
}
?>

代码中

basename(path,suffix)函数返回路径中的文件名部分。
path 必需。规定要检查的路径
suffix 可选。规定文件扩展名。如果文件有名有文件扩展名,将不会显示这个扩展名 move_uploaded_file(file,newloc)函数将上传的文件移动到新位置。若成功,则返回 true,否则返回 false。
file 必需。规定要移动的文件。
newloc 必需。规定文件的新位置。

服务器对上传文件的类型、内容没有做任何的检查、过滤,存在上传漏洞。上传文件后返回文件路径。

b. 漏洞利用

文件上传漏洞的利用是有限制条件的,首先当然是要能够成功上传木马文件,其次上传文件必须能够被执行,最后就是上传文件的路径必须可知。

这里直接上传一句话木马。

3. Medium

a. 代码分析

<?php
if( isset( $_POST[ 'Upload' ] ) ) {
// Where are we going to be writing to?
$target_path = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
$target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] ); // 上传文件的相关信息
$uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];
$uploaded_type = $_FILES[ 'uploaded' ][ 'type' ];
$uploaded_size = $_FILES[ 'uploaded' ][ 'size' ]; // 判断上传的文件是否是jpeg和png图片且大小小于100000字节
if( ( $uploaded_type == "image/jpeg" || $uploaded_type == "image/png" ) &&
( $uploaded_size < 100000 ) ) {
// 判断文件是否能够上传
if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) {
// No
echo '<pre>Your image was not uploaded.</pre>';
}
else {
// Yes!
echo "<pre>{$target_path} succesfully uploaded!</pre>";
}
}
else {
// 上传的文件不是图片,返回以下信息给用户
echo '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';
}
}
?>

代码限制了上传文件类型为jpeg或png,大小不能超过100000B。

$_FILES['image']['type']的值是从浏览器中发送的MIME值确定的,而浏览器发送的数据都有可能是不安全的。MIME可用通过修改数据包,进行篡改。

b. 漏洞利用

方法一:抓包修改文件类型

使用burpsuite,修改MIME。

修改为image/png,上传成功:

方法二:使用文件包含漏洞

或者借助Medium级别的文件包含漏洞,构造payload:http://[ip]/dvwa/vulnerabilities/fi/?page=hthttp://tp://[ip]/dvwa/hackable/uploads/backdoor.png

然后使用菜刀连接,得到webshell。

使用菜刀工具时,需要Cookie参数。

方法三:截断绕过(转自大佬)

新手指南:DVWA-1.9全级别教程之File Upload

在php版本小于5.3.4的服务器中,当Magic_quote_gpc选项为off时,可以在文件名中使用%00截断,所以可以把上传文件命名为backdoor.php%00.png

4. High

a. 代码分析

<?php
if( isset( $_POST[ 'Upload' ] ) ) {
// Where are we going to be writing to?
$target_path = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
$target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] ); // 文件信息。strrpos函数查找字符串在另一字符串中最后一次出现的位置(区分大小写);substr函数返回字符串的一部分。
$uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];
$uploaded_ext = substr( $uploaded_name, strrpos( $uploaded_name, '.' ) + 1);
$uploaded_size = $_FILES[ 'uploaded' ][ 'size' ];
$uploaded_tmp = $_FILES[ 'uploaded' ][ 'tmp_name' ]; // 判断是否是图片。strtolower函数将所有字符转换为小写;getimagesize函数用于获取图像的大小及相关信息。
if( ( strtolower( $uploaded_ext ) == "jpg" || strtolower( $uploaded_ext ) == "jpeg" || strtolower( $uploaded_ext ) == "png" ) &&
( $uploaded_size < 100000 ) &&
getimagesize( $uploaded_tmp ) ) { // Can we move the file to the upload folder?
if( !move_uploaded_file( $uploaded_tmp, $target_path ) ) {
// No
echo '<pre>Your image was not uploaded.</pre>';
}
else {
// Yes!
echo "<pre>{$target_path} succesfully uploaded!</pre>";
}
}
else {
// Invalid file
echo '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';
}
}
?>

代码获取文件后缀名:

strrpos(string,find,start)函数查找字符串在另一字符串中最后一次出现的位置。
参数 描述
string 必需。规定被搜索的字符串。
find 必需。规定要查找的字符。
start 可选。规定在何处开始搜索。

其实是防范iis 6.0文件解析漏洞的,有时我们为了绕过限制会提交这样形式的文件:

Xx.asp;.xx.jpg xx.jpg

而这句话的作用就是说它会验证文件的最后一个点之后的格式上面的例子来说就是不管你前面写了多少,我只验证最后的 .jpg

getimagesize() 函数用于获取图像大小及相关信息,成功返回一个数组,失败则返回 FALSE 并产生一条 E_WARNING 级的错误信息。

array getimagesize ( string $filename [, array &$imageinfo ] )

可以看到,High级别的代码读取文件名中最后一个”.”后的字符串,期望通过文件名来限制文件类型,因此要求上传文件名形式必须是.jpg.jpeg.png之一。同时,getimagesize函数更是限制了上传文件的文件头必须为图像类型。

b. 漏洞利用

制作图片马,上传后门。

将后门与图片进行结合。

上传成功:

借助High级别的文件包含漏洞,将图片当作php执行。

url为:http://[ip]/DVWA/vulnerabilities/fi/?page=file:///home/wwwroot/default/DVWA/hackable/uploads/hack.jpg

使用菜刀进行连接。

5. impossible

a.代码分析

<?php
if( isset( $_POST[ 'Upload' ] ) ) {
// Check Anti-CSRF token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
// File information
$uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];
$uploaded_ext = substr( $uploaded_name, strrpos( $uploaded_name, '.' ) + 1);
$uploaded_size = $_FILES[ 'uploaded' ][ 'size' ];
$uploaded_type = $_FILES[ 'uploaded' ][ 'type' ];
$uploaded_tmp = $_FILES[ 'uploaded' ][ 'tmp_name' ];
// Where are we going to be writing to?
$target_path = DVWA_WEB_PAGE_TO_ROOT . 'hackable/uploads/';
// 将上传的文件进行改名以及确定上传的目录位置。uniqid函数基于以微秒计的当前时间,生成一个唯一的 ID;ini_get函数用于获取一个配置选项的值。sys_get_temp_dir函数用于返回临时文件的目录。
$target_file = md5( uniqid() . $uploaded_name ) . '.' . $uploaded_ext;
$temp_file = ( ( ini_get( 'upload_tmp_dir' ) == '' ) ? ( sys_get_temp_dir() ) : ( ini_get( 'upload_tmp_dir' ) ) );
$temp_file .= DIRECTORY_SEPARATOR . md5( uniqid() . $uploaded_name ) . '.' . $uploaded_ext;
// Is it an image?
if( ( strtolower( $uploaded_ext ) == 'jpg' || strtolower( $uploaded_ext ) == 'jpeg' || strtolower( $uploaded_ext ) == 'png' ) &&
( $uploaded_size < 100000 ) &&
( $uploaded_type == 'image/jpeg' || $uploaded_type == 'image/png' ) &&
getimagesize( $uploaded_tmp ) ) { // 通过对图像重新编码来删除任何元数据(Note, using php-Imagick is recommended over php-GD)
if( $uploaded_type == 'image/jpeg' ) {
$img = imagecreatefromjpeg( $uploaded_tmp );
imagejpeg( $img, $temp_file, 100);
}
else {
$img = imagecreatefrompng( $uploaded_tmp );
imagepng( $img, $temp_file, 9);
}
imagedestroy( $img ); // Can we move the file to the web root from the temp folder?
if( rename( $temp_file, ( getcwd() . DIRECTORY_SEPARATOR . $target_path . $target_file ) ) ) {
// Yes!
echo "<pre><a href='${target_path}${target_file}'>${target_file}</a> succesfully uploaded!</pre>";
}
else {
// No
echo '<pre>Your image was not uploaded.</pre>';
}
// Delete any temp files
if( file_exists( $temp_file ) )
unlink( $temp_file );
}
else {
// Invalid file
echo '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';
}
}
// Generate Anti-CSRF token
generateSessionToken();
?>

ini_get ( string $varname ) 成功时返回配置选项的值。

imagecreatefromjpeg ( string $filename ) 由文件或 URL 创建一个新图象。

imagejpeg (resource $image, string $filename, int $quality)
从 image 图像以 filename 为文件名创建一个 JPEG 图像。
image 由图象创建函数(例如imagecreatetruecolor())返回的图象资源。
filename 文件保存的路径,如果未设置或为 NULL,将会直接输出原始图象流。
quality 可选项,范围从 0(最差质量,文件更小)到 100(最佳质量,文件最大)。默认为 IJG 默认的质量值(大约 75)。

imagedestroy ( resource $image ) 函数销毁图像资源

getcwd ( void ) 取得当前工作目录。

代码通过对上传文件进行了md5编码导致%00截断无法绕过过滤规则,加入Anti-CSRF token防护CSRF攻击,同时对文件的内容作了严格的检查,导致攻击者无法上传含有恶意脚本的文件。

DVWA学习记录 PartⅤ的更多相关文章

  1. DVWA学习记录 PartⅦ

    SQL Injection 1. 题目 SQL Injection,即SQL注入,是指攻击者通过注入恶意的SQL命令,破坏SQL查询语句的结构,从而达到执行恶意SQL语句的目的. 2. Low a. ...

  2. DVWA学习记录 PartⅣ

    File Inclusion 1. 题目 File Inclusion,意思是文件包含(漏洞),是指当服务器开启allow_url_include选项时,就可以通过php的某些特性函数(include ...

  3. DVWA学习记录 PartⅢ

    CSRF 1. 题目 CSRF,全称Cross-site request forgery,翻译过来就是跨站请求伪造,是指利用受害者尚未失效的身份认证信息(cookie.会话等),诱骗其点击恶意链接或者 ...

  4. DVWA学习记录 PartⅠ

    DVWA介绍 DVWA(Damn Vulnerable Web Application)是一个用来进行安全脆弱性鉴定的PHP/MySQL Web应用,旨在为安全专业人员测试自己的专业技能和工具提供合法 ...

  5. DVWA学习记录 PartⅨ

    XSS(DOM) 1. 题目 XSS,全称Cross Site Scripting,即跨站脚本攻击,某种意义上也是一种注入攻击,是指攻击者在页面中注入恶意的脚本代码,当受害者访问该页面时,恶意代码会在 ...

  6. DVWA学习记录 PartⅧ

    Weak Session IDs 1. 题目 用户访问服务器的时候,为了区别多个用户,服务器都会给每一个用户分配一个 session id .用户拿到 session id 后就会保存到 cookie ...

  7. DVWA学习记录 PartⅥ

    Insecure CAPTCHA 1. 题目 Insecure CAPTCHA(全自动区分计算机和人类的图灵测试),意思是不安全的验证码. 指在进行验证的过程中,出现了逻辑漏洞,导致验证码没有发挥其应 ...

  8. DVWA学习记录 PartⅡ

    Command Injection 1. 题目 Command Injection,即命令注入,是指通过提交恶意构造的参数破坏命令语句结构,从而达到执行恶意命令的目的. 2. Low a. 代码分析 ...

  9. Quartz 学习记录1

    原因 公司有一些批量定时任务可能需要在夜间执行,用的是quartz和spring batch两个框架.quartz是个定时任务框架,spring batch是个批处理框架. 虽然我自己的小玩意儿平时不 ...

随机推荐

  1. 小师妹学JavaIO之:NIO中那些奇怪的Buffer

    目录 简介 Buffer的分类 Big Endian 和 Little Endian aligned内存对齐 总结 简介 妖魔鬼怪快快显形,今天F师兄帮助小师妹来斩妖除魔啦,什么BufferB,Buf ...

  2. Ubuntu18.04美化MacOS(新更grub界面美化)

    写在前面的话: 在美化过程中大多数资源来自境外网站,下载时速度特别慢,写这篇博客一是为了给读者看,也是为了自己保存资源并记录ubuntu18.04的使用,避免你们或是自己以后再花费大量时间去百度方法和 ...

  3. 单页面应用下刷新当前iframe

    $('button.layui-btn-elastic-2').click(function(){ var srcIframe=$(".layui-side ul li dd"). ...

  4. 弹出框Alert

    selenium提供了三个处理alert的方法 注意:首先需要切换窗口到alert driver.switch_to.alert() (1)点击确定按钮 driver.switch_to.alert. ...

  5. C#数据结构与算法系列(五):常见单链表笔试

    1.求单链表中有效节点个数 public static int GetLength(HeroNode headNode) { int length = ; var cur = headNode.Nex ...

  6. cc21a -c++重载成员操作符*,->,代码示范

    cc21a重载成员操作符*,->, *,解引用操作符 ->箭头操作符,用于智能指针类 #include "pointer.h" //pointer.cpp #inclu ...

  7. Redis 的 5 种数据类型的基本使用

    Redis 中的 5 种数据类型 Redis 中 有 5 种数据结构,分别是 "字符串/string","列表/list","集合/set" ...

  8. Java内存溢出OutOfMemoryError的产生与排查

    在java的虚拟机异常中,有两个异常是大家比较关心的,一个是StackOverflowError,另一个是OutOfMemoryError.今天我们就来看看OutOfMemoryError是怎么产生的 ...

  9. powershell代码混淆绕过

    目前大多数攻击者已经将PowerShell 利用在了各种攻击场景中,如内网渗透,APT攻击甚至包括现在流行的勒索软件中.powershell的功能强大且调用方式十分灵活,灵活使用powershell可 ...

  10. Python数据可视化实战:实时更新海外疫情数据,实现数据可视化

    前言 我国的疫情已经得到了科学的控制,开始了全面的复工复产,但是国外的疫情却“停不下来”.国外现在可谓就是处于水深火热当中啊,病毒极强的传染性,导致了许多的人都“中招”了,我国已经全面复工复产了,人大 ...