[web安全-文件上传漏洞解析,及常见绕过方式]简单易懂超友好

2023-10-29

    

目录

        一、了解文件上传漏洞是什么

        二、漏洞利用方法

        三、了解并接触常见的webshell管理工具,以及下载

        四、一句话木马

        五、文件上传的风险存在地方

        六、文件上传绕过

        七、靶场练习,巩固知识

纸上得来终觉浅,绝知此事要躬行

-----陆游


一、了解文件上传漏洞是什么

由于程序员在对用户文件上传功能实现代码没有严格限制用户上传的文件后缀以及文件类型或者处理缺陷,而导致的用户可以越过其本身权限向服务器上上传可执行的动态脚本文件。

二、利用方法

如果程序里面存在这种漏洞,那么恶意攻击者可以直接向你的服务器上传一个 webshell( 又称 ASP 木马、PHP 木马、JAVA木马等即利用服务器端的文件操作语句写成的动态网页,可以用来编辑你服务器上的文件 ),从而控制你的网站。

流程:判断存在漏洞,再判断网站的开发语言,尝试上传文件绕过waf,进行尝试链接,利用前端或者抓包方式查看返回的路径(如果绝对路径直接访问,相对路径按经验进行URl地址拼接)。

WebShell , 简称网页后门。简单来说它是运行在Web应用之上的远程控制程序

三、了解并接触常见的webshell管理工具

当上传木马文件后,可用使用webshell管理工具进行连接,执行想要的操作命令。

我自己使用的是中国蚁剑,可能用的比较舒服,下载的话,在csdn上面搜下载流程就可以啦。

中国蚁剑    中国菜刀    冰蝎

四、一句话木马

木马就是我们需要想办法上传到对方服务器并运行的恶意代码,不理解可以继续往下看   

php的一句话木马:

<?php @eval($_POST['pass']);?>

asp的一句话是:  

 <%eval request ("pass")%>

aspx的一句话是:

<%@ Page Language="Jscript"%> <%eval(Request.Item["pass"],"unsafe");%>

还有好多木马,可以自己查找收集哦

上面的标红的pass是你链接你这个木马的密码,也可以设置成自己想要的密码。

一句话木马+webshell工具通常是一起使用的,先上传让服务器解析你的恶意代码,然后用webshell连接即可。

五、文件上传的风险存在地方

  1. 上传图片的地方,比如说头像,博客
  2. 评价订单的时候
  3. 能够上传文件的地方

要有时常判断的眼光进行判断

六、文件上传绕过

文件上传通常会被审查判断是否为恶意文件,我们可以利用各种绕过方式来进行,绕过审查,进行上传我们的文件木马。

常见的绕过方式

  1. 前端js检测

可以通过,burp进行截取中间段数据改数据包后缀,然后进行绕过。

  1. 后端mime校验

也可以通过前端js检测的方法进行绕过

3.命名规则绕过

对于php文件尾过滤,可以采用phtml,php3,php5,phps等等,也可以采用大小写绕过,对于文件尾过滤过于严谨的可以尝试上传.htaccess文件

4末尾空格绕过

对于windows来讲会自动去除文件尾后边的空格,但是对于服务器来讲如果没有trim($file_ext); 首尾去空的函数,则可以在文件尾后面添加一个空格,比如对’.php’过滤,则不会匹配’.php '结尾的文件,服务器仍然会正常解析

末尾.绕过

对于windows来讲会自动去除文件末尾后面的.,但是对于服务器来讲如果没有deldot($file_name);删除文件名末尾的点函数,则可以在文件名后面添加一个.,对于’.php’过滤,则不会过滤掉’.php.'文件

末尾大小写绕过

如果在检测中没有 strtolower()函数,说明不存在大小写过滤,因此可以考虑大小写绕过

文件末尾添加::$DATA绕过

在window的时候如果文件名+"::$DATA"会把::$DATA之后的数据当成文件流处理,不会检测后缀名,且保持::$DATA之前的文件名,他的目的就是不检查后缀名

例如:"phpinfo.php::$DATA"Windows会自动去掉末尾的::$DATA变成"phpinfo.php"

双写绕过

有些正则表达式会过滤一些字符,但是只会过滤一次,所以我们写两次,等他过滤完,即可剩下一个后缀名,来成功绕过。

或者某些函数去除.和空格只去除一次,可以进行多写几个空格和点.绕过

如.pphphp,从左往右匹配到第一个php时去掉变为.php,达到了绕过的目的

.htaccess绕过

htaccess是apache的特有文件,负责相关目录下的网页配置。可以改变文件解析规则,比如将图片文件解析成php文件 而上传一张携带webshell的图片文件,就可以成功链接。

但需要先上传.htaccess文件,然后再上传webshell文件。

apache解析漏洞

六、文件上传绕过阿帕奇一般都是从右向左,先解析最后的后缀,然后再往前面进行识别。

上传图片马:1.jpg

抓包工具修改马名称为:1.php.1616asda

先看1616asda,绕过,然后才会解析到php

%00截断

%00绕过主要是针对于白名绕过

原理:白名单过滤肯定是从后往前读取后缀,所以读取到.jpg在白名单里就放通了。

但是在调用文件的时候读取文件名是从前往后读,所以看到.php后面的终止符的时候就停止读取了,最终读取的文件名的后缀就是.php

%00是URl编码,只针对get传参,所以不适用与post传输文件地址

图片内容属性检测绕过

对于一些查看文件属性的机制,我们可以制作图片马进行绕过

图片马本质是在正常图片后缀加上敏感木马,进行执行。

copy 1.png/b+2.php 3.png   (windos可以利用这个命令制作图片马,正常图片+一句话木马)

ps:图片马一般不会自动执行,需要配合文件包含漏洞进行利用

文件包含漏洞我后面会进行更新,感兴趣可以去我主页了解哦

图片二次渲染绕过

有时候服务器会对上传上去的图片进行二次渲染,生成一张新的图片,从而过滤掉webshell脚本,这时只需要将渲染后的图片与渲染前的图片进行对比,查看二者相同的地方,也就是渲染未改动的地方,在此处插入webshell脚本即可,网上推荐用gif图片

条件竞争

条件竞争实际上就是服务器会校验你上传的文件是否合法,不合法将其进行删除,但是服务器对文件处理速度有限,只要上传速度大于他删除速度,那我们就可以读取到我们的木马文件并且执行。

我们需要一边用python进行请求读取你的恶意文件(需要判断你文件生成的地址)

一遍需要用burp来进行不断的上传文件,直到python读取到了恶意文件存在服务器上,即可利用webshell进行链接。

ps:上传的文件不能直接是木马,是一个能生成木马的文件

之前写的竞争文件的python脚本可以参考

import requests
def main():
    i=0
    while 1:
        try:
            print(i,end='\r')
            a=requests.get("http://172.20.10.3:88/upload/jinzhen.php")

            if "c4ca4238a0b923820dcc509a6f75849b" in a.text:
                print("OK")
                break
        except Exception as e:
            pass
        i+=1

if __name__=='__main__':
    main()            

当时用的恶意文件也可以参考

七、靶场练习,巩固知识

纸上得来终觉浅,绝知此事要躬行

-----陆游

我们到现在以及有了文件上传漏洞的基本的概念以及绕过方式的了解,但这个时候一定要多多练习巩固知识,我们可以利用靶场来进行练习积累经验

小吴这里推荐文件上传靶场:upload-labs(下面附带靶场下载链接,可以搜索别的博主下载教程哦)

靶场下载地址:GitHub - c0ny1/upload-labs: 一个想帮你总结所有类型的上传漏洞的靶场

有不懂的知识可以评论私信交流

感谢您看到这里,希望这篇文章对您在网络安全这条道路上有所帮助,再次感谢。

                                                         小吴

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[web安全-文件上传漏洞解析,及常见绕过方式]简单易懂超友好 的相关文章

  • PHP:检测USB设备

    我正在尝试使用 PHP 将用户名和密码存储到 USB 拇指驱动器上的文本文件中 因此 当用户返回使用 USB 密钥登录时 应该会打开一个弹出窗口 并提示输入用户名和密码 所以我的问题是如何使用 PHP 检测 USB 拇指驱动器 所以客户端或
  • 使用 PHP 比较两个字符串的相似度

    嘿伙计们 我想寻求一些解决方案 现在我有字典了单词 txt 这里有一些例子 happy laugh sad 我有俚语字符串 hppy 我想要搜索和匹配那个俚语字符串我的字典这意味着它将返回 happy 因为这些字符串参考 快乐 in 字典
  • 如何测试“If-Modified-Since”HTTP 标头支持

    使用 PHP 如何准确测试远程网站supports If Modified Since HTTP 标头 据我所知 如果您获取的远程文件自标头请求中指定的日期以来已被修改 它应该返回 200 OK 状态 如果尚未修改 则应返回 304 Not
  • 尝试在本地主机上测试我的 php 文件,但只出现一个空白页面,没有错误消息

    我正在运行 Apache 和 mySQL 因为我检查了所有日志 似乎没有任何错误 我的目标是每当有新的表单条目时就向特定地址发送电子邮件 我对后端和 PHP 缺乏经验 所以我不太确定哪里出了问题 任何帮助将不胜感激
  • 如何使用 php 创建谷歌双因素身份验证?

    我想在我的 PHP 项目中使用 Google 2FA 用户登录时需要输入6位2fa代码 您可以画出一些关于该朝哪个方向走的提示吗 步骤 1 创建长度为 16 个字符的唯一密码 PHPGangsta 为 Google Authenticato
  • Mysqli 准备好的语句从数组动态构建 INSERT 查询

    我正在尝试用 PHP 而不是 OOP 开发我的函数 以创建 CRUD 目标是对任何表使用相同的函数 但我已经陷入了第一个表中 不知道该怎么做 我现在拥有的 function to avoid injections function vali
  • html 下钻下拉所选值未插入 MYSQL

    我有两个下拉列表 首先从数据库下拉填充 根据第一个下拉列表的选定值从数据库填充第二个下拉列表 document ready function c change function var c1 c selected text if c1 aj
  • php字符串是值类型吗?

    为什么php的string是值类型 每次将参数传递给函数时 每次进行赋值时 每次连接都会导致字符串被复制时 它都会被复制到各处 我的 NET 经验告诉我 它似乎效率低下 迫使我几乎在任何地方都使用引用 考虑以下替代方案 替代方案1 This
  • 使用 PHP 查询更改表,列名未显示在 phpMyAdmin 中

    这是我的第一篇文章 这里有一篇类似的文章 phpMyAdmin 不显示添加的列 代码日志 https stackoverflow com questions 12960302 phpmyadmin doesnt show added col
  • 在另一列中查找重复值时,如何将列数据存储为逗号分隔值? [复制]

    这个问题在这里已经有答案了 如果任何公司的产品都相同 我必须组合或内爆子数组值 预期输出应该类似于 0 gt array company gt 1 6 product gt 5 我的数组是 array 0 gt array company
  • 如何记录 Doxygen 中不存在的变量?

    例如 我在配置文件中定义了 theme 全局变量 Doxygen 不处理该变量 但我想记录下来 我尝试这样做 var theme brief Active theme 但没有成功 您可以创建一个 doxygen 特定文件来记录变量 例如 配
  • PHP 在 IIS7 上未报告任何错误

    我正在使用我们的 XAMPP 设置作为测试服务器来开发 PHP 应用程序 一旦应用程序准备好部署 我必须将其上传到客户端的服务器 问题是客户端的服务器正在运行 IIS 7 每次出现 PHP 错误时 它只会显示一个空白页面 现在 我的应用程序
  • Codeigniter 处理大文件时允许的内存大小耗尽

    我发布此内容是为了防止其他人正在寻找相同的解决方案 因为我刚刚在这个废话上浪费了两天时间 我有一个 cron 作业 每天使用一个非常大的文件更新数据库一次 使用以下代码 if handle fopen dirname FILE uncomp
  • Mailgun 内联图像,它是如何工作的?

    我正在使用 mailgun 并希望将图像添加到我的时事通讯中 现在我这样做了 mg gt sendMessage domain array from gt email protected cdn cgi l email protection
  • method_存在于父类php中

    我正在尝试使用 php 函数 method exists 但我需要检查该方法是否存在于对象的父类中 so class Parent public function myFunction class Child extends Parent
  • 严格标准:资源 ID#73 用作偏移量,转换为整数

    我使用这个 PHP 函数获取 MySql 结果 function fetcharray query id if query id query id this gt query res if query id this gt q array
  • 附加之前检查数据库中是否存在 ID

    我通过选择一个带有类别的数组json decode并将它们附加到文章中 public static function setArticleCategory Request request article Article where id r
  • PHP UTF-8 配置

    我正在使用 PHP 5 3 5 配置 Apache 2 2 17 服务器 我的目标是创建一个默认为内容类型的干净配置UTF 8 php ini default charset UTF 8 default mimetype applicati
  • 精简 PHP 和 GET 参数

    我使用 Slim PHP 作为 RESTful API 的框架 如何在 Slim PHP 中从 URL 获取 GET 参数 例如 如果我想使用以下内容 http api example com dataset schools zip 999
  • Google Analytics PHP(发送信息)

    大意 我正在开发一个项目 我需要使用 Google Analytics 服务器端 我不需要检索信息 但我需要发送信息 我最终可以发送 js 脚本客户端 但在这种情况下它不是一个选项 以下大多数链接都非常旧 2012年 检索 不是我需要的 我

随机推荐

  • 普中51单片机独立按键原理及源代码

    由于按键是机械弹性按键 具有弹性 在毫秒级别的时间下 按键后有短暂的抖动 转载自江科大自协化51单片机入门教程 如果按键一次用力较轻 按键里的小金属片可能会多次抖动 使得LED闪烁多次 即轻微按一次 小概率出现多次LED闪烁 消除毫秒级别下
  • 设计模式 -- 享元模式(Flyweight Pattern)

    使用共享对象可以有效的支持大量的细粒度对象 应用场景 主要目的是实现对象的共享 即共享池 当系统中对象多的时候可以减少内存的开销 通常与工厂模式一起使用 例如 缓存 对象池 Android中 Message obtain通过重用Messag
  • 如何在ubuntu系统下安装jdk

    由于换了系统 要从新配置下环境 下面说明下如何在ubuntu系统下安装jdk 首先安装eclipse 我是在ubuntu软件中心安装的 3 8版本 比较老 但图省事也就先这样了 然后要从网上下载jdk1 7 3 8版本最多支持到jkd1 7
  • Android 获取屏幕宽高的正确姿势

    前言 在开发时 我们经常需要根据屏幕的宽高来进行对view的适配 无论是自定义view还是andorid自带的一些控件 比如说需要占当前屏幕高度的30 就需要获取到屏幕的宽高 但在获取宽高时我遇到了一些坑 总结如下 获取高度 下面两种方法都
  • C语言:文件读取

    C语言 文件读取 在C语言中 我们可以使用标准库中的文件操作函数来读取和写入文件 本文将介绍如何使用C语言读取文件 首先 我们需要打开一个文件 可以使用fopen 函数来打开文件 该函数需要两个参数 第一个参数为文件名 第二个参数为打开方式
  • 栈的初始化、销毁、出入栈、取栈顶元素

    一 初始化 void SeqStackInit SeqStack stack if stack NULL return stack gt size 0 stack gt capacity 1000 yuan shi da xiaostack
  • csdn 首发最轻松安装教程:关于centos7 centos8 centos9如何安装erlang和对应版本的rabbitmq

    1 前言 最近做毕业设计 自己装了个虚拟机 但通过各种rpm下载包的方式安装erlang和rabbitmq 总是无法启动或启动失败 琢磨了一番 是erlang相关的包依赖没有自动安装 起码得几十个 由于过于麻烦 下面请看图 所以我写了一个r
  • idea远程调试

    目录 1 背景 2 代码 3 idea配置 4 服务端远程开启debug服务 5 远程调试 5 1 服务端 5 2 本地启动 6 注意 1 背景 线上出了问题 我们一般是通过日志来定位问题 在没有日志的情况下 往往定位问题是比较困难的 这时
  • Java基础教程2-安装和配置Eclipse IDE环境

    前面文章介绍了如何安装JDK和设置环境变量 这篇介绍如何安装eclipse IDE IDE是集成开发环境的意思 你应该听说过eclipse是一个开发人员常用的IDE工具 可以这么说 几乎所有的开发人员都会用这个IDE工具来开发 当然市场上有
  • SpringMVC+Spring+Mybatis +Annotation实现方法,按钮级别的细粒度权限控制

    本文转载自 http blog csdn net ycyk 168 article details 18456631 随着企业信息化的不断深入 各种各样的信息系统成为提高企业运营及管理效率的必备工具 越来越多的企业核心机密如销售机会 客户资
  • ajax同时返回list和字符串,我在页面的后台代码中写了个方法 getList() 返回的是个 string[] 类型的数组,要在javascript 中调用...

    AJAX tools ajax conn function ajaxSubmit url postStr action var ajax false try ajax new ActiveXObject Msxml2 XMLHTTP cat
  • Django与mysql(2)-jquery(2)

    作者 芝士小熊饼干 系列专栏 数据结构 蓝桥杯 算法 坚持天数 18天
  • docker 容器ping不通宿主机/外网问题

    docker 容器ping不通宿主机 外网问题 问题 docker 容器与数据库建立连接失败 宿主机ip在数据库的白名单中 宿主机连接数据库成功 那么问题就剩docker 容器的网络与数据库是否是通的 启动服务进入容器内部 ping数据库是
  • django得到Model的全部字段名(field)

    得到所有的field MyModel meta get fields 打印全部字段名称 print field name for field in OriginFlowModel meta get fields
  • Scala中的case类

    1 使用场景 1 1首先 在一个类前添加 case Scala会自动给这个类 创建伴生对象 并创建好 apply 工厂方法 和 unapply 方法 使得 实例化该类时 不需要用new 函数式编程写法就可 eg case class Peo
  • 解决ERROR (Errno::ENOENT): No such file or directory

    在windows上安装Ruby后 再通过gem install redis dump命令来安装RedisDump 在通过使用redis dump命令进行验证RedisDump是否安装成功时 提示错误如下 解决办法如下 查找Ruby的安装目录
  • qt中QOpenGLTexture纹理使用

    纹理类型的创建 include
  • sql 语句查询 按某字段去重 保留按某个字段排序top1

    例子 create table tablename id int identity 1 1 attachid int name varchar 10 insert into tablename values 23 sss insert in
  • centos7.6 切换中文后依旧无法输入中文解决方案

    我在下载安装时就选择了中文 所以在系统工具 设置 区域语言里面只有汉语 但是我发现终端 浏览器都无法输入中文 网上找了都是让你在区域语言里加汉语 再重启 右上角切换 可我本来就有啊 右上角显示为zn 解决 后面是把安装时选择的汉语删除 重新
  • [web安全-文件上传漏洞解析,及常见绕过方式]简单易懂超友好

    目录 一 了解文件上传漏洞是什么 二 漏洞利用方法 三 了解并接触常见的webshell管理工具 以及下载 四 一句话木马 五 文件上传的风险存在地方 六 文件上传绕过 七 靶场练习 巩固知识 纸上得来终觉浅 绝知此事要躬行 陆游 一 了解