前言
该靶场,是通过平台BUUCTF在线评测中的靶场进行的,基于linux
搭建的
当然若是想要该靶场,可以采用github
上的醒目,点击后面文字即可访问c0ny1/upload-labs: 一个想帮你总结所有类型的上传漏洞的靶场
或者本人分享在网盘中,可通过链接https://pan.quark.cn/s/fe695fdbcbfd
下载其中的upload-labs
upload-labs使用
pass-01
打开靶场,让我们上传图片,任务是让上传一个webshell
,因为靶场是PHP搭建,所以这里使用最简单的webshell
,一句话木马
![image-20240706192953310](https://i-blog.csdnimg.cn/img_convert/ae4e47ab41779a86c7b8791194ccfd5c.jpeg)
直接上传shell.php测试,发现有提示
查看html的form表单,是否只有前端验证,发现提交给一个函数,说明是前端验证的
在前端中搜索有无这个函数,发现有这个函数,那么就可以把浏览器设置成不加载js资源,使得这个函数失效
刷新页面,再次上传
![](https://i-blog.csdnimg.cn/img_convert/3a2ba66c5702c2f6d8395774e36ef045.jpeg)
![](https://i-blog.csdnimg.cn/img_convert/83965180e3511fdecd2c6908ac6880f7.jpeg)
这里就已经上传到服务器中,可以使用第三方工具进行连接,如蚁🗡
![](https://i-blog.csdnimg.cn/img_convert/ca0912a567ce13a7c984826892950371.jpeg)
可以查看文件等操作,到这里说明成功拿到网站的某个权限了
![](https://i-blog.csdnimg.cn/img_convert/a1217444e0fbec3f53484a2afec6707d.jpeg)
Pass-02
打开后直接上传shell.php测试,发现提示
![](https://i-blog.csdnimg.cn/img_convert/578a2f6218d20ba1f217cc8ae7410758.jpeg)
查看是否有前端js的影响,发现虽然有函数的影响,但是在这里直接搜索,已经搜索不到,验证不在浏览器的前端了,在后端的验证,产生数据包,使用burpsuit或者yakit进行抓取
![](https://i-blog.csdnimg.cn/img_convert/d2e7deffba36f514a046e12887cb8206.jpeg)
为什么上传不了呢,最后要上传的是脚本文件,也就是,以这里来说,上传的文件要是脚本文件才会被执行。如果是图片的话,数据包的形式是怎么样的,这里再抓取一个图片的数据包进行对比
![](https://i-blog.csdnimg.cn/img_convert/fb36ff97580c534f4e7c4d08952415cc.jpeg)
对比发现filename与content-type不一样,文件名这个肯定不一样,主要是就是content-type了,这个可以上网查,文件类型的不同,这个处理也会不一样的。那么这里抓取包的时候,把content-type修改,会不会被识别成图片,然后上传呢。这里只对content-type进行验证
![](https://i-blog.csdnimg.cn/img_convert/d4f82d880bc94afee6611b6aaa30d69e.jpeg)
转发修改的数据包后,脚本上传成功
![](https://i-blog.csdnimg.cn/img_convert/533fe02e00d2cfff931ede053026bae4.jpeg)
![](https://i-blog.csdnimg.cn/img_convert/2e1b07208b94b0c928cf683eb0356b20.jpeg)
这里就已经成功
Pass-03
直接上传php文件
![](https://i-blog.csdnimg.cn/img_convert/0ab03ac193c535daa3fe38504bc24531.jpeg)
抓取数据包进行修改content-type的值
![](https://i-blog.csdnimg.cn/img_convert/e22046d39fb717f6f11b96d24e7f0e1c.jpeg)
但是还是提示,不允许上传这几个脚本文件,说明设置了黑名单
![](https://i-blog.csdnimg.cn/img_convert/cd2b63a01bb47fd7609810df57192443.jpeg)
想到他设置黑名单,但是有的脚本语言有扩展名,不只只有本来的一种形式,这里如php
,有很多。但是这个需要服务器开启了对应的解析,不然这个也是没有作用,所以这里需要一个个试
以apache
服务器为例,需要把这个添加AddType application/x-httpd-php .php .phtml .phps .php5 .pht
那么才会解析这加的几种文件类型
![](https://i-blog.csdnimg.cn/img_convert/4b477b460eb121300c52090e0f486893.jpeg)
修改其中的一个扩展名,上传成功
![](https://i-blog.csdnimg.cn/img_convert/f399747cc23cd26fc9c122051e759796.jpeg)
并且,开链接后,也是以脚本文件去处理的,代码可执行
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
呢,因为在打开一个不存在的链接时,报出的错误
![](https://i-blog.csdnimg.cn/img_convert/26e8c4fda411e05a5333e7c26fcaa75c.jpeg)
然后这里需要注意,apache中间件的解析后缀,是从右往左,若是碰到不能解析的或不知道的,会继续往左,直到碰到apache可解析的,这时文件就确定了apache解析类型
如:1.jpg.php.ccccc apache从右解析,发现不知道ccccc是什么继续往左,碰到php,可以解析,于是最终apache解析的文件是1.jpg.php
这里有两种解法,不过这里先把脚本换成phpinfo(),这样不需要每次连接来确定是否解析了
1、修改后缀名
抓取数据包,把后缀名修改为apache不知道,这样,因为文件的特性,不能判断是php脚本文件,而且最终解析时,还会以php脚本处理
![](https://i-blog.csdnimg.cn/img_convert/2a29734ed2b0cab81423e7e9424e9b77.jpeg)
![](https://i-blog.csdnimg.cn/img_convert/e9268e4022cb6c372e6ad7b8ff0d21da.jpeg)
2、 利用.htaccess来把含有php语言的图片,能够作为脚本处理
创建带有脚本的图片,并创建.htaccess文件,并加入语句
<FilesMatch "phpinfo.jpg">
SetHandler application/x-httpd-php
</FilesMatch>
或者
AddType application/x-httpd-php .jpg
![](https://i-blog.csdnimg.cn/img_convert/11618e955ffe69eeeb39dd24c233c7b5.jpeg)
上传.htaccess文件
![](https://i-blog.csdnimg.cn/img_convert/e6a247f2b1a06c8fdfe5051b1e1746af.jpeg)
提示403,无权访问,但是上传成功
![](https://i-blog.csdnimg.cn/img_convert/64e0b68842ce14787832f9ff3794dad7.jpeg)
再次上传图片,可以看到文件依然是jpg格式,但是以脚本解析了。
![](https://i-blog.csdnimg.cn/img_convert/55826ea9cd08c46b15f1f6e75b3d3a58.jpeg)
Pass05
上传phpinfo文件后,以之前去在后缀名加ccc,上传成功,但是打开链接发现,这次是把php去除了,也就是进行了文件名中的字符匹配。
不知道过滤的严谨性,先把php大小写,试试能不能绕过,发现可以
![](https://i-blog.csdnimg.cn/img_convert/e269315da8dd0f3ebc67c89680470944.jpeg)
Pass06
空格绕过,在文件后缀名处,通过抓包加上空格,然后即可上传成功,不过因为上传是上传了,但是访问的时候没有,不知道什么原因
Pass07
通过抓包,在后缀名php后,加上.
即可绕过,因为这种不是正则表达式的过滤,是完整的名称,所以这种特殊字符可以绕过
![](https://i-blog.csdnimg.cn/img_convert/b590af16ee74aa22a7d79b2c805e171f.jpeg)
![](https://i-blog.csdnimg.cn/img_convert/bc1b3d6d4b607b4fca40d136c70afe0f.jpeg)
Pass08
这关其实是利用 windows系统一个命名特性,系统如果文件名+"::$DATA"会把之后的数据当成文件流处理,不会检测后缀名,且保持之前的文件名,他的目的就是不检查后缀名
上传文件名为:测试.php::$DATA系统会自动去掉末尾的变成"测试.php或者xxx.php"
所以这里注意是windows系统,我这里靶场是在linux,所以这个不行
Pass09
这关其实是代码的一个问题,看代码可以看出它只去掉一次空格和点,举个例:测试.php. . 最后代码执行完后变成 测试.php. 这个代码漏洞在之前的关卡大多少也是可以用到这个漏洞过关的,这个靶场本身就是学习用的所以还是每个关卡学习一个方法最好
![](https://i-blog.csdnimg.cn/img_convert/24e942dd60c37375b6467bb9943bba2f.jpeg)
![](https://i-blog.csdnimg.cn/img_convert/a283a7b9ec3c4b5950f985e2bab26100.jpeg)
Pass10
移除php等脚本后缀名称,如果这里他只进行了一次移除,那么就可以采用双写的方法绕过
![](https://i-blog.csdnimg.cn/img_convert/1d52833db1c54634b7633e3c9dbdd8e7.jpeg)
![](https://i-blog.csdnimg.cn/img_convert/edc404e166c15d0248ea26ddc8565fde.jpeg)
Pass11
这关就可以用 %00截断来绕过它是地址上的截断,但注意是get请求和版本 PHP版本得小于5.3版本才能用这个%00截断,如果版本没问题没成功可能是编码的问题 例如: hanniu8.com/up/r.php%00cesho.gif 遇到 后会将 %00后面的去掉,变成: hanniu8.com/up/r.php
![](https://i-blog.csdnimg.cn/img_convert/5bad740917d1a79f29d1ef3b2b7478a7.jpeg)
这里靶场问题,可能是php版本,无法进行
Pass12
与11一样,不过这里是在post里截断,条件与上面一样,php的版本问题
Pass13
首先要制造图片马
![](https://i-blog.csdnimg.cn/img_convert/a476bc5d834fe3af6b007d18efd4debc.jpeg)
然后直接上传即可,但是是jpg格式,无法以脚本运行
但是给了一个文件包含漏洞的文件
![](https://i-blog.csdnimg.cn/img_convert/c6af772433a44eaf2fe0bd5385c88fe8.jpeg)
点击后即可有php文件
![](https://i-blog.csdnimg.cn/img_convert/535adf116c60b18d42cf0b911ec792cb.jpeg)
利用这个文件,来使图片马生效
![](https://i-blog.csdnimg.cn/img_convert/f1bcb829630afb1f77ae6faa64663fc6.jpeg)
使用软件连接webshell
![](https://i-blog.csdnimg.cn/img_convert/0ff71e71367ab0849e29fcb972f3d1e2.jpeg)
Pass14
制造图片马,这种制造是以真实的图片结合起来的,所以可以通过大部分的文件头检测
![](https://i-blog.csdnimg.cn/img_convert/a476bc5d834fe3af6b007d18efd4debc.jpeg)
和13一样,直接上传,然后利用文件包含漏洞即可
Pass15
与上面一样,先生成
Pass16
首先上传图片,经测试,只有gif文件可以上传成功,从代码审计的话,也能看出来。
然后制造gif的图片马,直接上传,但是上传后的图片,却不能从文件包含漏洞那里连接第三方软件了,猜测图片二次渲染时,可能把代码去掉了,把上传的图片下载,然后与原始图片进行十六进制的比较,在两个图片同样的地方,插入脚本语言,进行测试
![](https://i-blog.csdnimg.cn/img_convert/8ad9c36825b274b75601a1be69f4c24e.jpeg)
相同的地方,插入<?php phpinfo();?>
,重新上传,然后就可以看到
![](https://i-blog.csdnimg.cn/img_convert/29e40e1ae7628386310f0ac0d27e4e3a.jpeg)
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的版本,因环境,我这里不行
![](https://i-blog.csdnimg.cn/img_convert/f5a34bbd8456c0b96d54554396ebb595.jpeg)
![](https://i-blog.csdnimg.cn/img_convert/d7ec2708dadf947e5c1e97a469f90d57.jpeg)
move_uploaded_file()函数会忽略掉文件末尾的/. 所以上传文件名为webshell.php/.
即可绕过
![](https://i-blog.csdnimg.cn/img_convert/8f3879227d7a72ca6c6a1699e6544ebf.jpeg)
Apache文件解析漏洞同样可以利用,参考Pass-19
![](https://i-blog.csdnimg.cn/img_convert/ecb549cf121a8bdf56cef094decbf353.jpeg)
.空格同样可以绕过,参考Pass-05
![](https://i-blog.csdnimg.cn/img_convert/c7d89605df2d90e71f204a934e608e71.jpeg)
pass20
数组绕过,参考链接Upload-labs Pass-20 数组绕过_uploadlabs baynk-CSDN博客
保存名称可自己设定,但是一定要与下面一致
![](https://i-blog.csdnimg.cn/img_convert/745f497c6378a579ba6f95937c4e70c0.jpeg)
原数据包
![](https://i-blog.csdnimg.cn/img_convert/76cdeaa15817b1a67a383b993864bd4f.jpeg)
修改后的,可以上传成功的
![](https://i-blog.csdnimg.cn/img_convert/06442b90ac34bef3ebfb69361c6ff7e3.jpeg)
结果,这里的链接是后来的图,正常上面成功的话,就是/upload/20.php.
![](https://i-blog.csdnimg.cn/img_convert/3b80f5e908dcb32a4d6e0da986eccd9f.jpeg)