upload-lab 靶场实战
文件上传/下载 漏洞
冲冲冲,好好学习 2020.02.13
淦靶场之前,先来点知识铺垫铺垫。
文件上传漏洞
- 前端Js绕过。
- MIME类型绕过
- 后缀名大写写绕过 / php4 、php5
- 00截断
- 覆盖 .htaccess
- windows文件流特性绕过
- 双写文件名绕过
- 条件竞争
任意文件下载漏洞
如何查找任意文件下载漏洞:
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函数:
- 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--墨者学院SQL注入—布尔盲注
前言 大家好,我是一个渗透测试的爱好者和初学者,从事网络安全相关工作,由于爱好网上和朋友处找了好多关于渗透的视频.工具等资料,然后自己找了一个靶场,想把自己练习的体会和过程分享出来,希望能对其他渗透爱 ...
- 渗透测试初学者的靶场实战 3--墨者学院SQL注入—宽字节盲注
墨者SQL注入-MYSQL数据库实战环境 实践步骤 1. 决断注入点 输入单引号,提示错误信息: 输入and 1=1 返回页面正常: 输入 and 1=2 返回正常 输入-1,返回异常: 2. 带入s ...
- 渗透测试初学者的靶场实战 2--墨者学院SQL注入—报错盲注
墨者SQL注入-MYSQL数据库实战环境 实践步骤 1. 决断注入点 输入单引号,提示错误信息: 输入and 1=1 返回页面正常: 输入 and 1=2 返回正常 输入-1,返回异常: 2. 带入s ...
- CFS三层网络环境靶场实战
一.环境搭建: ①根据作者公开的靶机信息整理 共有三个targets,目标是拿下三台主机权限,且是三层的网络环境,内网网段有192.168.22.0/24和192.168.33.0/24,添加两张仅主 ...
- [靶场实战]:SQL注入-显错注入
SQL注入的本质:就是将用户输入的数据当作代码带入执行. 注入条件: 1.用户能控制输入 2.能够将程序原本执行的代码,拼接上用户输入的数据进行执行 首先检查是否存在注入点 Rank1: 构造语句 ? ...
- VulnStack靶场实战(未完成)
环境搭建 https://www.cnblogs.com/HKCZ/p/11760213.html 信息收集 目录爆破 这里发现有phpmyadmin目录,这里可以直接获取webshell 参照: h ...
- SQL注入靶场实战-小白入门
目录 SQL注入 数字型 1.测试有无测试点 2.order by 语句判断字段长,查出字段为3 3.猜出字段位(必须与内部字段数一致)(用union联合查询查看回显点为2,3) 4.猜数据库名,用户 ...
- [红日安全]Web安全Day8 - XXE实战攻防
本文由红日安全成员: ruanruan 编写,如有不当,还望斧正. 大家好,我们是红日安全-Web安全攻防小组.此项目是关于Web安全的系列文章分享,还包含一个HTB靶场供大家练习,我们给这个项目起了 ...
- [红日安全]Web安全Day1 - SQL注入实战攻防
本文由红日安全成员: Aixic 编写,如有不当,还望斧正. 大家好,我们是红日安全-Web安全攻防小组.此项目是关于Web安全的系列文章分享,还包含一个HTB靶场供大家练习,我们给这个项目起了一个名 ...
随机推荐
- dev下拉框选择不同值显示不同控件
单列的ASPxFormLayout直接前台控制就可以了,多列的前台控制后会出现空白 <dx:LayoutItem Caption="内容类型" Height="40 ...
- Pytest学习笔记7-skip和skipif的使用
前言 在实际的测试中,我们经常会遇到需要跳过某些测试用例的情况,pytest提供了skip和ifskip来跳过测试 下面我们就来通过一些例子看看skip和ifskip具体如何使用吧 skip的用法 使 ...
- Redis的数据类型以及应用场景
1. Redis的作用 1.1 Redis可以做什么 1.缓存:缓存机制几乎在所有的大型网站都有使用,合理地使用缓存不仅可以加快数据的访问速度,而且能够有效地降低后端数据源的压力.Redis提供了键值 ...
- Nexus安装配置和使用
Nexus安装配置和使用 第一步安装jdk yum install java-1.8.0-openjdk-devel 第二步下载nexus-3.12.1-01-unix.tar.gzjdk 下载地址: ...
- 20、checkconfig
chkconfig控制的原理(/etc/init.d/里面设置脚本,在/etc/rc.d/rc..d中设置软连接,通过chkconfig进行管理,同时也加入到了service服务,chkconfig设 ...
- 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值 ...
- ClouderaManager安装kafka报错
是因为默认的java heap size是50M,将broker_max_heap_size参数设置为512M后,重启kafka服务即可
- 2shell中处理字符串,字符串的截取、替换
0.字符串的小知识点 1.字符串的截取 1.1从指定位置开始截取 1.2 从指定字符(子字符串)开始截取 1.3字符串截取的总结 1.4 按指定要求截取 2.字符串的拼接 3.字符串的替换 0.字符串 ...
- buu signin
一.拖入ida,来静态分析F5大法好 要注意的点: 1._gmz_init_set_str() 这个函数,也是看师傅的wp,学到的,以后还是得多google, 本质上是这个函数: int mpz_in ...
- Android Binder 进程间通讯机制梳理
什么是 Binder ? Binder是Android系统中进程间通讯(IPC)的一种方式,也是Android系统中最重要的特性之一.Binder的设计采用了面向对象的思想,在Binder通信模型的四 ...