upload-lab 靶场实战

文件上传/下载 漏洞

冲冲冲,好好学习 2020.02.13

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

文件上传漏洞

  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

第一题:

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

解决办法1. 先把一句话木马的后缀改成允许通过的后缀形式,如:.jpg
然后打开burp suite ,浏览器点击上传,在bp里抓取到的数据包把后缀名改回 .php
image

jpg改成php 再forward
image
上传成功,按一下
imageimage
再访问一下这个URL看是不是 404 ,如果不是的话,就拿URL上菜刀。

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

插播一个知识点:

先介绍下: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 点击上传,抓包,改包
image

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

发现上传成功,并发现了保存位置 ../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的来执行。但是这被注释掉了,没开,所以用不了,同理,其他的后缀不知道行不行。
image

抓包改包,用php4 后缀试了下,发现成功上传了,URL访问试试,没有404,再上菜刀,
image
看到一句话木马原样输出了,说明 .php4 后缀名的文件它不解析,那就换一个后缀名再试试,用 phtml再试试
image

image
其实右击也是可以看到保存文件录路径的。
这里再回想以下,代码能否解析取决于 配置文件里如何设置。
image
在这里后面加上其他格式的后缀名也行,如 .txt 的。

插播,什么是 .htaccess 文件

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

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

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

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

0x02设置文件访问权限
我们可以在.htaccess中使用以下代码拒绝1.php被访问
image
image
如果要允许访问,那么把deny from all 改为allow from all即可,那么如果要禁止某个ip访问该文件
image
image
0x03错误重定向&重定向
image
image
image

特别注意:.htaccess文件在windows下没法直接命名,Linux下是可以的
那怎办呢,找到apache原有的那个 .htaccess文件 复制一个过来,再修改里面的内容即可。

第四题:

这题就是利用这个文件的设置,其实效果跟上一题的 改配置文件 是一样的。
image
这样的话, 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
image
先看看第三题,他的源码里有这么一行代码:
image
就是把上传的图片文件重命名,在前面加个随机数,就会是这个样子
image
那这个.htaccess文件就没用了,apache不认它。

第五题:

先看下源码,嗯哼?
image
一波骚操作把 .htaccess 也给你禁掉。那就禁吧...
image
再看一眼,发现,这些后缀名只是过滤了一部分,大小写的换一下就能绕过来了,
比如: .Php、.PHp、等没有过滤,就能用啦。
怎么防御?我们不建议用黑名单过滤,建议的是用白名单,只允许白名单中规定的几种后缀名的文件上传。

第六题:

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

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

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

第七题:

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

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

第八题:

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

第九题:

用个投机的方法把这题解决掉。先去看源码:
image
这里对文件名:执行了一次去空格trim() ,再去点 deldot()
对后缀名:一次截取后缀名 strrchr() ,一次转换为小写 ,再一次去::$DATA,最后去空。
假如输入的后缀名是 .php. . (点与点之间有个空格) ,经过deldot之后剩下 .php. (末尾有个空格),最后一步去空格,剩下就是.php.这就能成功绕过了。
这个思路挺猥琐的,钻空子。

第十题:

先回想一下,在SQL注入的时候,当union被过滤一次的时候,怎么办?
那就用 uniunionon 嘛,当union被过滤后,剩下的就拼成了一个union 。同理的过滤多次的话就多拼几个嘛。
这题也是类似的。源码里的函数,把所有的后缀名都被吃掉了 一次 ,注意这个次数很关键,如果是循环的一直吃先去就很尴尬了
image

上传,开bp 抓包,改后名。 pphphp ,注意这种情况:phphpp 但这也是:phphpp
所以删完第一个php就剩下 hpp 了,这不对。有了URL,看看404没,再上菜刀。
image
image

第11题:

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

发现上传成功了,证明路径真的是可控的,自己能手动改变。那有能怎样呢?
开脑洞:把路径改为 ../upload/666.php ,直接在目录里创建一个php文件,命名为 666.php ,然后再把文件上传进去看会发生什么,
image

提示上传出错了,
那就加个%00 来截断,这样的话,上传的文件就会被写入了路径后面创建的11.php文件里。
image
%00截断有局限性,不一定能用 。得看php版本。

第12题:

抓包开始, 发现了个 POST型的参数其实跟第11题是差不多的。
image
按照上一题的思路,却发现失败了。
image
因为,在POST型参数里加%00是会被理解为 字符串的 %00 ,而不是十六进制的空格,所以换种方式加,先在 php后面放个 + 号(十六进制是:2b),文件名 改为 jpg再在后面到Hex加个空格。
image
找到 2b 把它改成 00
imageimage
然后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: 用图片和一句话木马拼接起来。百度有教程怎么做。
image
image
先来看看上传个webshell.php试试,抓包
题目说只允许图片类型的文件上传,并且根据文件头识别是不是图片类型,那伪造一个文件头吧,手动加入 GIF 89A ,上传成功。
image
拿着路径去测试,发现成功了,只显示了GIF 89A,而PHP代码成功解析了 。上菜刀。
image

第14题:

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

第15题:

同上,区别在代码的实现方式。等有空再去做一下代码审计,对比一下这几道题的异同。在这题,要打开php exif拓展 ,附方法,放在文档末尾。
imageimage
上传完用文件包含来检查一下,看到最后的一句话木马已经被解析了。上菜刀。
?file=./upload/9120200218014542.png
image

第16题:二次渲染

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

第17、18题:

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

第19题:%00 截断

上传,抓包,
image
---->image ->去hex改image image
完成,下面步骤略。

第20题:先抓包试试看。

image
先把 Content-Type 改成 image/jpeg
image

在后面介绍几个上边经常出现的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的漏洞修复

posted @ 2021-05-17 15:02  Bitores  阅读(1021)  评论(0编辑  收藏  举报