前言
该靶场,是通过平台BUUCTF在线评测中的靶场进行的,基于linux
搭建的
当然若是想要该靶场,可以采用github
上的醒目,点击后面文字即可访问c0ny1/upload-labs: 一个想帮你总结所有类型的上传漏洞的靶场
或者本人分享在网盘中,可通过链接https://pan.quark.cn/s/fe695fdbcbfd
下载其中的upload-labs
upload-labs使用
pass-01
打开靶场,让我们上传图片,任务是让上传一个webshell
,因为靶场是PHP搭建,所以这里使用最简单的webshell
,一句话木马
直接上传shell.php测试,发现有提示
查看html的form表单,是否只有前端验证,发现提交给一个函数,说明是前端验证的
在前端中搜索有无这个函数,发现有这个函数,那么就可以把浏览器设置成不加载js资源,使得这个函数失效
刷新页面,再次上传
这里就已经上传到服务器中,可以使用第三方工具进行连接,如蚁🗡
可以查看文件等操作,到这里说明成功拿到网站的某个权限了
Pass-02
打开后直接上传shell.php测试,发现提示
查看是否有前端js的影响,发现虽然有函数的影响,但是在这里直接搜索,已经搜索不到,验证不在浏览器的前端了,在后端的验证,产生数据包,使用burpsuit或者yakit进行抓取
为什么上传不了呢,最后要上传的是脚本文件,也就是,以这里来说,上传的文件要是脚本文件才会被执行。如果是图片的话,数据包的形式是怎么样的,这里再抓取一个图片的数据包进行对比
对比发现filename与content-type不一样,文件名这个肯定不一样,主要是就是content-type了,这个可以上网查,文件类型的不同,这个处理也会不一样的。那么这里抓取包的时候,把content-type修改,会不会被识别成图片,然后上传呢。这里只对content-type进行验证
转发修改的数据包后,脚本上传成功
这里就已经成功
Pass-03
直接上传php文件
抓取数据包进行修改content-type的值
但是还是提示,不允许上传这几个脚本文件,说明设置了黑名单
想到他设置黑名单,但是有的脚本语言有扩展名,不只只有本来的一种形式,这里如php
,有很多。但是这个需要服务器开启了对应的解析,不然这个也是没有作用,所以这里需要一个个试
以apache
服务器为例,需要把这个添加AddType application/x-httpd-php .php .phtml .phps .php5 .pht
那么才会解析这加的几种文件类型
修改其中的一个扩展名,上传成功
并且,开链接后,也是以脚本文件去处理的,代码可执行
Pass04
这里用到.htaccess
文件,这里因为发现基本上所有的脚本文件都被拉黑了,所以这个文件若没有,则可以上传这个文件,来让上传的图片作为脚本执行。
.htaccess
文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过.htaccess
文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。
.htaccess
文件(或者”分布式配置文件”)提供了针对每个目录改变配置的方法,即在一个特定的目录中放置一个包含指令的文件,其中的指令作用于此目录及其所有子目录但是很重要的、需要注意的是,其上级目录也可能会有.htaccess
文件,而指令是按查找顺序依次生效的,所以一个特定目录下的.htaccess
文件中的指令可能会覆盖其上级目录中的.htaccess
文件中的指令,即子目录中的指令会覆盖父目录或者主配置文件中的指令。
文件所在的目录及其所有子目录,若要启动配置文件,我们需要在服务器的主配置文件将 AllowOverride 设置为 All
AllowOverride All #启动.htaccess文件的使用
在.htaccss文件添加下面的语句即可解析
<FilesMatch "创建的含有脚本文件的图片">
SetHandler application/x-httpd-php
</FilesMatch>
如:
<FilesMatch "1.jpg">
SetHandler application/x-httpd-php
</FilesMatch>
或者添加,是把.jpg映射成脚本文件
AddType application/x-httpd-php .jpg
为什么确定是apache,然后使用.htaccess
呢,因为在打开一个不存在的链接时,报出的错误
然后这里需要注意,apache中间件的解析后缀,是从右往左,若是碰到不能解析的或不知道的,会继续往左,直到碰到apache可解析的,这时文件就确定了apache解析类型
如:1.jpg.php.ccccc apache从右解析,发现不知道ccccc是什么继续往左,碰到php,可以解析,于是最终apache解析的文件是1.jpg.php
这里有两种解法,不过这里先把脚本换成phpinfo(),这样不需要每次连接来确定是否解析了
1、修改后缀名
抓取数据包,把后缀名修改为apache不知道,这样,因为文件的特性,不能判断是php脚本文件,而且最终解析时,还会以php脚本处理
2、 利用.htaccess来把含有php语言的图片,能够作为脚本处理
创建带有脚本的图片,并创建.htaccess文件,并加入语句
<FilesMatch "phpinfo.jpg">
SetHandler application/x-httpd-php
</FilesMatch>
或者
AddType application/x-httpd-php .jpg
上传.htaccess文件
提示403,无权访问,但是上传成功
再次上传图片,可以看到文件依然是jpg格式,但是以脚本解析了。
Pass05
上传phpinfo文件后,以之前去在后缀名加ccc,上传成功,但是打开链接发现,这次是把php去除了,也就是进行了文件名中的字符匹配。
不知道过滤的严谨性,先把php大小写,试试能不能绕过,发现可以
Pass06
空格绕过,在文件后缀名处,通过抓包加上空格,然后即可上传成功,不过因为上传是上传了,但是访问的时候没有,不知道什么原因
Pass07
通过抓包,在后缀名php后,加上.
即可绕过,因为这种不是正则表达式的过滤,是完整的名称,所以这种特殊字符可以绕过
Pass08
这关其实是利用 windows系统一个命名特性,系统如果文件名+"::$DATA"会把之后的数据当成文件流处理,不会检测后缀名,且保持之前的文件名,他的目的就是不检查后缀名
上传文件名为:测试.php::$DATA系统会自动去掉末尾的变成"测试.php或者xxx.php"
所以这里注意是windows系统,我这里靶场是在linux,所以这个不行
Pass09
这关其实是代码的一个问题,看代码可以看出它只去掉一次空格和点,举个例:测试.php. . 最后代码执行完后变成 测试.php. 这个代码漏洞在之前的关卡大多少也是可以用到这个漏洞过关的,这个靶场本身就是学习用的所以还是每个关卡学习一个方法最好
Pass10
移除php等脚本后缀名称,如果这里他只进行了一次移除,那么就可以采用双写的方法绕过
Pass11
这关就可以用 %00截断来绕过它是地址上的截断,但注意是get请求和版本 PHP版本得小于5.3版本才能用这个%00截断,如果版本没问题没成功可能是编码的问题 例如: hanniu8.com/up/r.php%00cesho.gif 遇到 后会将 %00后面的去掉,变成: hanniu8.com/up/r.php
这里靶场问题,可能是php版本,无法进行
Pass12
与11一样,不过这里是在post里截断,条件与上面一样,php的版本问题
Pass13
首先要制造图片马
然后直接上传即可,但是是jpg格式,无法以脚本运行
但是给了一个文件包含漏洞的文件
点击后即可有php文件
利用这个文件,来使图片马生效
使用软件连接webshell
Pass14
制造图片马,这种制造是以真实的图片结合起来的,所以可以通过大部分的文件头检测
和13一样,直接上传,然后利用文件包含漏洞即可
Pass15
与上面一样,先生成
Pass16
首先上传图片,经测试,只有gif文件可以上传成功,从代码审计的话,也能看出来。
然后制造gif的图片马,直接上传,但是上传后的图片,却不能从文件包含漏洞那里连接第三方软件了,猜测图片二次渲染时,可能把代码去掉了,把上传的图片下载,然后与原始图片进行十六进制的比较,在两个图片同样的地方,插入脚本语言,进行测试
相同的地方,插入<?php phpinfo();?>
,重新上传,然后就可以看到
Pass17
move_uploaded_file()函数将上传文件临时保存,再进行判断,如果不在白名单里则unlink()删除,在的话就rename()重命名,所以这里存在条件竞争。由此也就产生了漏洞,会有一个短暂的时间将我们上传的webshell存储在目录下,但是这个时间相当相当短暂,以至于,你打开上传目录,点击上传文件,你连影子都看不到就已经没了,所以这个时候我们先抓包,然后发送到intruder模块。进行无限制的请求,总会有一个可以。
一个intruder模块中的请求用于发送php文件到服务器中,另一个intruder模块用于请求上传之后的php文件地址
if(move_uploaded_file($temp_file, $upload_file)){
if(in_array($file_ext,$ext_arr)){
$img_path = UPLOAD_PATH . '/'. rand(10, 99).date("YmdHis").".".$file_ext;
rename($upload_file, $img_path);
$is_upload = true;
}else{
$msg = "只允许上传.jpg|.png|.gif类型文件!";
unlink($upload_file);
}
}else{
$msg = '上传出错!';
}
}
Pass18
基本上和17一样,都是条件竞争
是利用Apache的解析漏洞,不管最后后缀为什么,只要是.php.*结尾,就会被Apache服务器解析成php文件 提交类似webshell.php.7z的文件,配合条件竞争上传,同17
Pass19
可以使用%00截断,不过和前面一样,php的版本,因环境,我这里不行
move_uploaded_file()函数会忽略掉文件末尾的/. 所以上传文件名为webshell.php/.
即可绕过
Apache文件解析漏洞同样可以利用,参考Pass-19
.空格同样可以绕过,参考Pass-05
pass20
数组绕过,参考链接Upload-labs Pass-20 数组绕过_uploadlabs baynk-CSDN博客
保存名称可自己设定,但是一定要与下面一致
原数据包
修改后的,可以上传成功的
结果,这里的链接是后来的图,正常上面成功的话,就是/upload/20.php.