文件上传/下载 漏洞

冲冲冲,好好学习 2020.02.13

淦靶场之前,先来点知识铺垫铺垫。



文件上传漏洞

  1. 前端Js绕过。
  2. MIME类型绕过
  3. 后缀名大写写绕过 / php4 、php5
  4. 00截断
  5. 覆盖 .htaccess
  6. windows文件流特性绕过
  7. 双写文件名绕过
  8. 条件竞争

任意文件下载漏洞

如何查找任意文件下载漏洞:

1.查找传入文件名的参数:

--> 导入文件等参数,要是直接输入文件名,就有可能存在注入点。

2.注意如下几参数名:

--> RealPath,FilePath,filepath,Path,path,inputFile,url,urls,Lang,dis,data,readfile,filep

--> src,menu,META-INF,WEB-INF

3.代码中如何查找漏洞:

PHP为例,有如下等代码,就有可能存在任意文件下载漏洞

--> readfile

--> fopen

--> file_get_contents

Windows敏感文件路径

--> C:\boot.ini //查看系统版

--> C:\Windows\System32\inetsrv\MetaBase.xml //IIS配置文

--> C:\Windows\repair\sam //存储系统初次安装的密码

--> C:\Program Files\mysql\my.ini //Mysql配置

--> C:\Program Files\mysql\data\mysql\user.MYD //Mysql

--> rootC:\Windows\php.ini //php配置信息

--> C:\Windows\my.ini //Mysql配置信息

Linux敏感文件路径

--> /root/.ssh/authorized_keys

--> /root/.ssh/id_rsa

--> /root/.ssh/id_ras.keystore

--> /root/.ssh/known_hosts

--> /etc/passwd

--> /etc/shadow

--> /etc/my.cnf

--> /etc/httpd/conf/httpd.conf

--> /root/.bash_history

--> /root/.mysql_history

--> /proc/self/fd/fd[0-9]*(文件标识符)

--> /proc/mounts /porc/config.gz

上靶场 upload-lab

第一题:



发现上传,发现了个弹窗,打算抓包来看看是个怎么回事,但是并没有发现相关的数据包,因为这不是服务器返回的信息,而是来自网页的前端校验(可以查看源码看看代码),并不没有发送数据到服务器,这样做是为了提高用户体验,节省时间,马上报错。

我们看下源码,是常规的前端JavaScript判断后缀,但是后缀过不去。

解决办法1. 先把一句话木马的后缀改成允许通过的后缀形式,如:.jpg

然后打开burp suite ,浏览器点击上传,在bp里抓取到的数据包把后缀名改回 .php

jpg改成php 再forward



上传成功,按一下



再访问一下这个URL看是不是 404 ,如果不是的话,就拿URL上菜刀。

解决办法2.应为是js的代码,可以在网页按F12查看源码,把checkFile()函数删掉,或者改一下代码,让return true 。简单粗暴解决js校验。

插播一个知识点:

先介绍下:Content-Type 的常见几种类型

text/plain          文本类型

text/css           css类型

text/html           html类型

application/x-javascript    js类型

application/json      json类型

image/png jpg gif       image/*

(/.+\.(png|jpg|gif)$/.test(pathname)) 匹配到图片

第二题:

看了下源码,没有发现前端js校验,那就是后台的了,开bp抓包。

选择了个 一句话木马 webshell.php 点击上传,抓包,改包

先把包send to repeater ,再把Content-Type:application/octet-stream改成 image/png jpg gif (根据题目要求),题目说要上传图片的。

发现上传成功,并发现了保存位置 ../upload/webshell.php 在当前位置的上一级目录的upload下。URL访问,无404返回就上菜刀(用完记得清空缓存)。

第三题:

当题目说不让上传 提示:不允许上传.asp,.aspx,.php,.jsp后缀文件!

这几个后缀名的文件时,就用下面的替代被禁止的那些。

ASP: asa/cer/cdx

ASPX: ashx/asmx/ascx

PHP: php4/php5/phtml

JSP: jspx/jspf

就用对应的后缀名替代前面的那些。

不一定行,都试试吧。下图是apache的配置文件,它是可以识别phtml后缀名的文件当作是php的来执行。但是这被注释掉了,没开,所以用不了,同理,其他的后缀不知道行不行。

抓包改包,用php4 后缀试了下,发现成功上传了,URL访问试试,没有404,再上菜刀,



看到一句话木马原样输出了,说明 .php4 后缀名的文件它不解析,那就换一个后缀名再试试,用 phtml再试试



其实右击也是可以看到保存文件录路径的。

这里再回想以下,代码能否解析取决于 配置文件里如何设置。



在这里后面加上其他格式的后缀名也行,如 .txt 的。

插播,什么是 .htaccess 文件

0x00前言

.htaccess文件是用于apache服务器下的控制文件访问的配置文件,因此Nginx下是不会生效的。

.htaccess可以控制错误重定向,初始页面设置,文件夹的访问权限,文件的跳转等。

Nginx如果直接访问,可以下载该文件。如果是apache的话,正常情况下该文件是不可被访问的,但是可以通过php的include之类的文件包含函数进行内容访问。

其实最好不要用.htaccess文件,因为目录多了后,每个目录都有个.htaccess很难管理。

0x02设置文件访问权限

我们可以在.htaccess中使用以下代码拒绝1.php被访问





如果要允许访问,那么把deny from all 改为allow from all即可,那么如果要禁止某个ip访问该文件





0x03错误重定向&重定向





特别注意:.htaccess文件在windows下没法直接命名,Linux下是可以的

那怎办呢,找到apache原有的那个 .htaccess文件 复制一个过来,再修改里面的内容即可。

第四题:

这题就是利用这个文件的设置,其实效果跟上一题的 改配置文件 是一样的。



这样的话, 03.jpg 文件就会被当做php代码来编译。就把一句话木马文件名改成 03.jpg 就ok了。再上菜刀 。

第四题有点离谱哈,把第三题的方法禁止了,各种可能的文件后缀名都禁止掉了。

$deny_ext = array(".php",".php5",".php4",".php3",".php2",".php1",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".pHp1",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf")

那,这种题型的绕过怎么防御呢? 因为apache只认 这个文件名.htaccess



先看看第三题,他的源码里有这么一行代码:



就是把上传的图片文件重命名,在前面加个随机数,就会是这个样子



那这个.htaccess文件就没用了,apache不认它。

第五题:

先看下源码,嗯哼?



一波骚操作把 .htaccess 也给你禁掉。那就禁吧...



再看一眼,发现,这些后缀名只是过滤了一部分,大小写的换一下就能绕过来了,

比如: .Php、.PHp、等没有过滤,就能用啦。

怎么防御?我们不建议用黑名单过滤,建议的是用白名单,只允许白名单中规定的几种后缀名的文件上传。

第六题:

这题的源码,没有为文件名后缀去空格功能。

利用win的特性(linux 没有的)。文件的后缀名的后面加空格是没有效果的,系统会自动删掉。后面的空格没了。在bp中改包

选好文件,打开抓包,点击上传,bp改包,ok ,路径知道了,就访问看有无404,上菜刀。

第七题:

跟第六题差不多,在win下文件名后缀末尾加上 . (点号) 也是可以的绕过后台校验。第七题源码没有删除末尾的 .

做法跟第六题一模一样。跳过不讲了。

第八题:

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



上传成功。上菜刀。

第九题:

用个投机的方法把这题解决掉。先去看源码:



这里对文件名:执行了一次去空格trim() ,再去点 deldot()

对后缀名:一次截取后缀名 strrchr() ,一次转换为小写 ,再一次去::$DATA,最后去空。

假如输入的后缀名是 .php. . (点与点之间有个空格) ,经过deldot之后剩下 .php. (末尾有个空格),最后一步去空格,剩下就是.php.这就能成功绕过了。

这个思路挺猥琐的,钻空子。

第十题:

先回想一下,在SQL注入的时候,当union被过滤一次的时候,怎么办?

那就用 uniunionon 嘛,当union被过滤后,剩下的就拼成了一个union 。同理的过滤多次的话就多拼几个嘛。

这题也是类似的。源码里的函数,把所有的后缀名都被吃掉了 一次 ,注意这个次数很关键,如果是循环的一直吃先去就很尴尬了。

上传,开bp 抓包,改后名。 pphphp ,注意这种情况:phphpp 但这也是:phphpp

所以删完第一个php就剩下 hpp 了,这不对。有了URL,看看404没,再上菜刀。



第11题:

思路是 00截断。先抓包看看是个什么情况。



很神奇的看到了个GET类型的 save_path = ../upload/ 的参数,一看名字就知道是文件保存路径,那就试试这个路径是不是可控的,手动改变一下看看会怎样,把 /upload/删掉。

发现上传成功了,证明路径真的是可控的,自己能手动改变。那有能怎样呢?

开脑洞:把路径改为 ../upload/666.php ,直接在目录里创建一个php文件,命名为 666.php ,然后再把文件上传进去看会发生什么,

提示上传出错了,

那就加个%00 来截断,这样的话,上传的文件就会被写入了路径后面创建的11.php文件里。



%00截断有局限性,不一定能用 。得看php版本。

第12题:

抓包开始, 发现了个 POST型的参数其实跟第11题是差不多的。



按照上一题的思路,却发现失败了。



因为,在POST型参数里加%00是会被理解为 字符串的 %00 ,而不是十六进制的空格,所以换种方式加,先在 php后面放个 + 号(十六进制是:2b),文件名 改为 jpg再在后面到Hex加个空格。



找到 2b 把它改成 00



然后ok发送

插播 常用文件头:(利用文件头判断文件类型)

(1).JPEG; .JPE;.JPG, “JPGG raphic File"

(2).gif, "GIF 89A”

(3).zip, “Zip Compressed"

(4).doc; .xls; .xlt; .ppt; .apr , "MS Compound Document v1 or Lotus Approach APRfi1e"

JPEG (jpg), 文件头: FFD8FF

PNG (png), 文件头: 89504E47

GIF (gif), 文件头: 47494638

TIFF (tif), 文件头: 49492A00

Windows Bitmap (bmp), 文件头: 424D

CAD (dwg), 文件头: 41433130

Adobe Photoshop (psd), 文件头: 38425053

Rich Text Format (rtf), 文件头: 7B5C727466

XML (xml), 文件头: 3C3F786D6C

HTML (html), 文件头: 68746D6C3E

Email [thorough on ly] (eml), 文件头: 44656C6966572792D646174653A

Outlook Exp ress (dbx), 文件头: CFAD12FEC5FD746F

Outlook (pst), 文件头: 2142444E

MS Word/Excel (xls.or.doc), 文件头: D0CF11E0

MS Access (mdb), 文件头: 5374616E64617264204A

WordPerfect (wpd), 文件头: FF575043

Adobe Acrobat (pdf ), 文件头: 255044462D312E

Quicken (qdf), 文件头: AC9EBD8F

Windows Password (pwl) , 文件头: E3828596

ZIP Archive (zip), 文件头: 504B0304

RAR Archive (rar), 文件头: 52617221

Wave (wav), 文件头: 57415645

AVI (avi), 文件头: 41564920

Real Audio (ram) , 文件头: 2E7261FD

Real Media (rm), 文件头: 2E524D46

MPEG (mpg), 文件头: 000001BA

MPEG (mpg), 文件头: 000001B3

Quicktime (mov), 文件头: 6D6F6F76

Windows Media (asf ), 文件头: 3026B2758E66CF11

MIDI (mid) , 文件头: 4D546864

第13题:

法1:图片码绕过,直接计入文件头

法2: 用图片和一句话木马拼接起来。百度有教程怎么做。





先来看看上传个webshell.php试试,抓包

题目说只允许图片类型的文件上传,并且根据文件头识别是不是图片类型,那伪造一个文件头吧,手动加入 GIF 89A ,上传成功。



拿着路径去测试,发现成功了,只显示了GIF 89A,而PHP代码成功解析了 。上菜刀。

第14题:

跟13题做法一样,略了。14的代码跟13 有细微不同,具体可以去研究一下。

第15题:

同上,区别在代码的实现方式。等有空再去做一下代码审计,对比一下这几道题的异同。在这题,要打开php exif拓展 ,附方法,放在文档末尾。



上传完用文件包含来检查一下,看到最后的一句话木马已经被解析了。上菜刀。

?file=./upload/9120200218014542.png

第16题:二次渲染

这题跟前面所有的题都不同。先研究一下源码。

这题会吧上传的图片文件“加工”,加工后就把文件改了,前后文件发生变化,但也是有不发生变化的部分。先上传一张没有木马的图片,上传成功后,另保存成功后的图片,用软件 winhex 查看图片二进制信息,对比两个图片二进制上的差别,在第一张图里不变的地方,插入一句话木马。再把带马的图传上去,



再去包含里测试下,然后菜刀。

第17、18题:

条件竞争,笔记还没放上来,在另一个脚本专题

第19题:%00 截断

上传,抓包,



----> ->去hex改

完成,下面步骤略。

第20题:先抓包试试看。



先把 Content-Type 改成 image/jpeg

在后面介绍几个上边经常出现的PHP函数:

  1. trim() 函数移除字符串两侧的空白字符或其他预定义字符。

    还有相关的两个函数:

    ltrim() - 移除字符串左侧的空白字符或其他预定义字符。

    rtrim() - 移除字符串右侧的空白字符或其他预定义字符。

语法:trim(string,charlist)

string: 必须 规定要检查的字符串。

charlist:可选。规定从字符串中删除哪些字符。如果省略该参数,则移除下列所有字符:

"\0" - NULL

"\t" - 制表符

"\n" - 换行

"\x0B" - 垂直制表符

"\r" - 回车

" " - 空格

例子:删除“ Hedy!”

2.strrchr() 函数查找字符串在另一个字符串中最后一次出现的位置开始,并返回从该位置到字符串结尾的所有字符。找不到则返回 FALSE 。

语法:strrchr(string,char)

string : 必须参数。规定被检索的字符串。

char :必须参数。规定要查找的字符串,若是数字的话就按ASCII码对应的字符来。

3.str_ireplace() 函数替换字符串中的一些字符(不区分大小写)。

语法:str_ireplace(find,replace,string,count)

find 必需。规定要查找的值。

replace 必需。规定替换 find 中的值的值。

string 必需。规定被搜索的字符串。

count 可选。一个变量,对替换数进行计数。

例子:$file_name = str_ireplace($deny_ext,"", $file_name); 在文件名$file_name中查找有没有$deny_ext中包含的值,有的话就替换成 "" 空。


PHP exif扩展方法开启详解

本节主要介绍了如何开启PHP exif扩展方法,主要在于对php.ini文件的修改

服务器配置说明:

1.在php.ini文件中找到;extension=php_exif.dll,去掉前面的分号

2.在php.ini文件中找到;extension=php_mbstring.dll,去掉前面的分号,并将此行移动到extension=php_exif.dll之前,使之首先加载*。

3.找到[exif]段,把下面语句的分号去掉。

;exif.encode_unicode = ISO-8859-15

;exif.decode_unicode_motorola = UCS-2BE

;exif.decode_unicode_intel = UCS-2LE

;exif.encode_jis =

;exif.decode_jis_motorola = JIS

;exif.decode_jis_intel = JIS


这部分算是完结了 2020.2.18 Bitores 漏洞修复的知识后面再补充。等等看什么时候有空专题研究 top10的漏洞修复

upload-lab 靶场实战的更多相关文章

  1. 渗透测试初学者的靶场实战 1--墨者学院SQL注入—布尔盲注

    前言 大家好,我是一个渗透测试的爱好者和初学者,从事网络安全相关工作,由于爱好网上和朋友处找了好多关于渗透的视频.工具等资料,然后自己找了一个靶场,想把自己练习的体会和过程分享出来,希望能对其他渗透爱 ...

  2. 渗透测试初学者的靶场实战 3--墨者学院SQL注入—宽字节盲注

    墨者SQL注入-MYSQL数据库实战环境 实践步骤 1. 决断注入点 输入单引号,提示错误信息: 输入and 1=1 返回页面正常: 输入 and 1=2 返回正常 输入-1,返回异常: 2. 带入s ...

  3. 渗透测试初学者的靶场实战 2--墨者学院SQL注入—报错盲注

    墨者SQL注入-MYSQL数据库实战环境 实践步骤 1. 决断注入点 输入单引号,提示错误信息: 输入and 1=1 返回页面正常: 输入 and 1=2 返回正常 输入-1,返回异常: 2. 带入s ...

  4. CFS三层网络环境靶场实战

    一.环境搭建: ①根据作者公开的靶机信息整理 共有三个targets,目标是拿下三台主机权限,且是三层的网络环境,内网网段有192.168.22.0/24和192.168.33.0/24,添加两张仅主 ...

  5. [靶场实战]:SQL注入-显错注入

    SQL注入的本质:就是将用户输入的数据当作代码带入执行. 注入条件: 1.用户能控制输入 2.能够将程序原本执行的代码,拼接上用户输入的数据进行执行 首先检查是否存在注入点 Rank1: 构造语句 ? ...

  6. VulnStack靶场实战(未完成)

    环境搭建 https://www.cnblogs.com/HKCZ/p/11760213.html 信息收集 目录爆破 这里发现有phpmyadmin目录,这里可以直接获取webshell 参照: h ...

  7. SQL注入靶场实战-小白入门

    目录 SQL注入 数字型 1.测试有无测试点 2.order by 语句判断字段长,查出字段为3 3.猜出字段位(必须与内部字段数一致)(用union联合查询查看回显点为2,3) 4.猜数据库名,用户 ...

  8. [红日安全]Web安全Day8 - XXE实战攻防

    本文由红日安全成员: ruanruan 编写,如有不当,还望斧正. 大家好,我们是红日安全-Web安全攻防小组.此项目是关于Web安全的系列文章分享,还包含一个HTB靶场供大家练习,我们给这个项目起了 ...

  9. [红日安全]Web安全Day1 - SQL注入实战攻防

    本文由红日安全成员: Aixic 编写,如有不当,还望斧正. 大家好,我们是红日安全-Web安全攻防小组.此项目是关于Web安全的系列文章分享,还包含一个HTB靶场供大家练习,我们给这个项目起了一个名 ...

随机推荐

  1. dev下拉框选择不同值显示不同控件

    单列的ASPxFormLayout直接前台控制就可以了,多列的前台控制后会出现空白 <dx:LayoutItem Caption="内容类型" Height="40 ...

  2. Pytest学习笔记7-skip和skipif的使用

    前言 在实际的测试中,我们经常会遇到需要跳过某些测试用例的情况,pytest提供了skip和ifskip来跳过测试 下面我们就来通过一些例子看看skip和ifskip具体如何使用吧 skip的用法 使 ...

  3. Redis的数据类型以及应用场景

    1. Redis的作用 1.1 Redis可以做什么 1.缓存:缓存机制几乎在所有的大型网站都有使用,合理地使用缓存不仅可以加快数据的访问速度,而且能够有效地降低后端数据源的压力.Redis提供了键值 ...

  4. Nexus安装配置和使用

    Nexus安装配置和使用 第一步安装jdk yum install java-1.8.0-openjdk-devel 第二步下载nexus-3.12.1-01-unix.tar.gzjdk 下载地址: ...

  5. 20、checkconfig

    chkconfig控制的原理(/etc/init.d/里面设置脚本,在/etc/rc.d/rc..d中设置软连接,通过chkconfig进行管理,同时也加入到了service服务,chkconfig设 ...

  6. hdu 6092 Rikka with Subset 01背包 思维

    dp[i][j]表示前i个元素,子集和为j的个数.d[i][j] = d[i][j] + d[i-1][j-k] (第i个元素的值为k).这里可以优化成一维数组 比如序列为 1 2 3,每一步的dp值 ...

  7. ClouderaManager安装kafka报错

    是因为默认的java heap size是50M,将broker_max_heap_size参数设置为512M后,重启kafka服务即可

  8. 2shell中处理字符串,字符串的截取、替换

    0.字符串的小知识点 1.字符串的截取 1.1从指定位置开始截取 1.2 从指定字符(子字符串)开始截取 1.3字符串截取的总结 1.4 按指定要求截取 2.字符串的拼接 3.字符串的替换 0.字符串 ...

  9. buu signin

    一.拖入ida,来静态分析F5大法好 要注意的点: 1._gmz_init_set_str() 这个函数,也是看师傅的wp,学到的,以后还是得多google, 本质上是这个函数: int mpz_in ...

  10. Android Binder 进程间通讯机制梳理

    什么是 Binder ? Binder是Android系统中进程间通讯(IPC)的一种方式,也是Android系统中最重要的特性之一.Binder的设计采用了面向对象的思想,在Binder通信模型的四 ...