GitHub - c0ny1/upload-labs: 一个想帮你总结所有类型的上传漏洞的靶场
目录
案例6:Weblogic 任意文件上传漏洞(CVE-2018-2894)
初识
什么是文件上传漏洞?
有文件上传的地方,就可能有文件上传漏洞。换句话说有文件上传的地方就可以测试也没有文件上传漏洞。是否存在漏洞取决于对方代码写的够不够完备,一旦疏忽某方面的检测,就可能有空子可钻。
文件上传漏洞有哪些危害?如果有上传文件漏洞,想上传什么可能都可以,可以上传webshell/网站后门,危害就是直接获得当前网站权限,属于高危漏洞。sql注入可能只是对数据库、对数据进行初步的摸索,文件上传漏洞则是直冲着获取网站权限去的,获得权限后可以做很多事情,比如服务器提权获取内网权限、比如对数据进行进一步操作。
文件上传漏洞如何查找及判断?黑盒查找
对方源码、网站情况(CMS等)提前都不知道,需要通过扫描敏感文件先进行信息收集,某些扫描字典内含一些常见的上传地址,可以通过扫描获取上传地址;
也可以通过一些常见的功能进行测试上传点,比如会员中心肯定有上传图像功能;
也可以先获取后台权限去看有没有上传文件的地方;(后台权限是后台权限,还没有到网站权限,有一个操作是从后台拉webshell获取网站权限,这个操作经常利用的是文件上传)
白盒分析
拿到了对方源码和相关信息,通过分析代码看有没有某个地方涉及文件上传操作。
大部分文件上传漏洞的查找方式都是通过扫描,加上自己去尝试网站上的一些功能应用,去寻找上传点。
判断是否存在上传漏洞、存在什么样的漏洞就需要进行文件上传配合抓包,进行测试。
文件上传漏洞有哪些需要注意的地方?拿到一个文件上传漏洞点后要对类型进行区分,属于编辑器文件上传?属于第三方应用文件上传?先判断属于什么类型,然后对症下药进行后续测试;比如直接搜:xxx编辑器文件上传漏洞如何利用。利用现成的漏洞。
关于文件上传漏洞在实际应用中的说明?没啥别的就上面说的这些。
案例1:常规文件上传地址的获取(如何查找?)
首先随便百度一搜 inurl:upload.php 或者搜 site:xxx.com upload 随便点开一个网页看看,实战中这些 /upload.php 可能是你目录扫描,扫出来的。
只要能上传文件就可以测试是否存在上传漏洞。
- 目录扫描扫不扫得出来类似upload.php这样的地址
- 网站有没有可以上传文件的应用
案例2:不同格式文件类型后门测试
如果把一个php格式的后门代码写好了,但是以jpg格式上传到网站上了,再怎么访问这个图片都不可能执行后门的 😂 不要妄想其他格式可以把你的后门执行成功。
案例3:配合解析漏洞下的文件类型后门测试
以 Vulhub - Nginx 解析漏洞为例:Vulhub - Docker-Compose file for vulnerability environment
(base) buzz@MacBook-Air-3 ~ % cd vulhub (base) buzz@MacBook-Air-3 vulhub % cd nginx (base) buzz@MacBook-Air-3 nginx % cd nginx_parsing_vulnerability (base) buzz@MacBook-Air-3 nginx_parsing_vulnerability % docker compose up -d Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? (base) buzz@MacBook-Air-3 nginx_parsing_vulnerability % docker compose up -d [+] Running 18/18 ✔ php 10 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿] 0B/0B Pulled 1065.0s ✔ 31ce7ceb6d44 Pull complete 17.9s ✔ 74a1d4347681 Pull complete 17.9s ✔ 381c9f838d23 Pull complete 1023.9s ✔ acb23c56d5c2 Pull complete 1024.0s ✔ 5fd6e66a5987 Pull complete 1024.1s ✔ dc2875c5efdf Pull complete 1024.1s ✔ 75d888475340 Pull complete 1024.5s ✔ 2dd7dd611ab5 Pull complete 1024.5s ✔ c062b3c8884f Pull complete 1024.5s ✔ 5e83361431a9 Pull complete 1024.6s ✔ nginx 6 layers [⣿⣿⣿⣿⣿⣿] 0B/0B Pulled 19.6s ✔ 927a35006d93 Pull complete 2.9s ✔ fc3910c70f9c Pull complete 3.2s ✔ e11bfbf9fd54 Pull complete 3.2s ✔ fbb8b547daa2 Pull complete 3.2s ✔ 0f1992aeebd8 Pull complete 3.3s ✔ f929dacee378 Pull complete 3.3s [+] Running 3/3 ✔ Network nginx_parsing_vulnerability_default Created 0.0s ✔ Container nginx_parsing_vulnerability-php-1 Started 0.8s ✔ Container nginx_parsing_vulnerability-nginx-1 Started 0.9s (base) buzz@MacBook-Air-3 nginx_parsing_vulnerability % docker compose up config no such service: config (base) buzz@MacBook-Air-3 nginx_parsing_vulnerability % docker compose up -config unknown shorthand flag: 'c' in -config (base) buzz@MacBook-Air-3 nginx_parsing_vulnerability % docker compose config name: nginx_parsing_vulnerability services: nginx: depends_on: php: condition: service_started image: nginx:1 networks: default: null ports: - mode: ingress target: 80 published: "80" protocol: tcp - mode: ingress target: 443 published: "443" protocol: tcp volumes: - type: bind source: /Users/buzz/vulhub/nginx/nginx_parsing_vulnerability/www target: /usr/share/nginx/html bind: create_host_path: true - type: bind source: /Users/buzz/vulhub/nginx/nginx_parsing_vulnerability/nginx/default.conf target: /etc/nginx/conf.d/default.conf bind: create_host_path: true php: command: - /bin/sh - /var/www/start.sh image: php:fpm networks: default: null volumes: - type: bind source: /Users/buzz/vulhub/nginx/nginx_parsing_vulnerability/start.sh target: /var/www/start.sh bind: create_host_path: true - type: bind source: /Users/buzz/vulhub/nginx/nginx_parsing_vulnerability/www target: /var/www/html bind: create_host_path: true - type: bind source: /Users/buzz/vulhub/nginx/nginx_parsing_vulnerability/php-fpm/www-2.conf target: /usr/local/etc/php-fpm.d/www-2.conf bind: create_host_path: true networks: default: name: nginx_parsing_vulnerability_default
把图片以notepad打开,在末尾随便写点php代码然后上传这个图片,比如:
<?php phpinfo(); ?> <?php phpinfo(); ?> <?php phpinfo(); ?>
访问这个图像,正常显示:
再访问http://127.0.0.1/uploadfiles/3c40dc2ce0e127c10ae8dbf7ae2e503c.png/1.php
拉到乱码下面发现php被执行了,出现了phpinfo()代码执行之后的页面。
nginx解析漏洞:把图片解析成脚本格式,把php代码执行成功,必须访问上传的文件地址后再加上/xxx.php。直接访问上传的文件(比如png)是正常显示的。
解析漏洞分为:Apache、IIS6/7.x、Nginx,现成的搭建平台解析漏洞网上都可以搜到
拓展一下(思维导图中的验证/绕过)
凡是网页上传文件的地方,99%都不允许上传脚本格式的文件。因为如果可以上传脚本,你写个后门上传,访问执行就能拿到网站权限了,属于高危行为。大部分允许上传的格式大部分就是压缩文件、图片、音频……可不可以绕过网站的验证(验证上传文件的格式是否合规)上传脚本?(思维导图:验证/绕过)思路是一步一步来的:
- 比如先信息收集获知对方网站搭建工具是Nginx。
- 然后搜索获知Nginx存在文件上传解析漏洞。
- 然后尝试上传写入了后门php代码的图片文件。
- 然后尝试访问xxx.png/1.php查看是否执行成功。
漏洞利用思路可以参考思路那张思维导图,常规类操作碰壁了,就想想是不是属于其他类(比如平台/第三方应用等)。
案例4:本地漏洞环境搭建及测试(思维导图中的验证/绕过)
https://github.com/c0ny1/upload-labs
upload-labs/pass-01:只许上传jpg/png/gif类型文件时如何上传php的webshell
涉及到:本地/前端验证,右键查看源代码:只需删除掉代码中部分过滤即可,
代码分析:首先作者定义了一个file变量,用来获取name标签为’upload_file’数组的第一个元素的值,然后判断该变量如果为空则返回一个提示框。
又定义了一个用来获取上传文件类型的变量,它的值是文件名截取从点开始往后的字符串,也就相当于截取了后缀名。然后如果检索值等于-1(也就相当于上传了未定义的后缀名,没有检索到对应的字符串),那么将会报错,也就是实现了对上传文件的后缀名进行验证
<script type="text/javascript"> function checkFile() { var file = document.getElementsByName('upload_file')[0].value; if (file == null || file == "") { alert("请选择要上传的文件!"); return false; } //定义允许上传的文件类型 var allow_ext = ".jpg|.png|.gif"; //提取上传文件的类型 var ext_name = file.substring(file.lastIndexOf(".")); //判断上传文件类型是否允许上传 if (allow_ext.indexOf(ext_name) == -1) { var errMsg = "该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:" + ext_name; alert(errMsg); return false; } } </script>
html是前端的网页静态服务器的代码,php是动态服务器的代码
前端大多由html、javascript编写,如果过滤规则是写在前端的,前端的脚本就是在用户浏览器上,后端就是在服务器执行后结果给用户(前端JS和html在浏览器上执行,后端PHP在服务器上执行返回到浏览器)
Pass-01的验证是在浏览器进行的,过滤由Javascript编写,浏览器里的设置【禁用Javascript脚本】就可以把访问页面中的JS脚本禁掉,过滤代码就会被禁掉,过滤就不会被执行。所以前端验证很不安全,有这样的问题(前端先验证再发给后端和发过去给后端验证的区别,大部分都是后端验证)
所以Pass-01怎么做:
- 要么禁用JS脚本(不推荐,因为还有别的JS脚本可能要起作用,会被影响)
- 要么删除网页前端源代码中的文件格式过滤部分。
- 要么Burp一抓,修改后缀为.php再发送(如果上传流程全由JS实现,全由JS对网站信息进行截取、对文件进行保存,就抓不到数据包了,因为JS/html在本地运行不会发送到对方服务器,抓得到数据包取决于有没有东西往对方服务器发。实战中有时候抓不到数据包也可能是因为这个。Pass-01抓得到数据包因为index.php有一个提交的流程,属于是JS和php的混编实现)
<?php include '../config.php'; include '../head.php'; include '../menu.php'; $is_upload = false; $msg = null; if (isset($_POST['submit'])) { if (file_exists(UPLOAD_PATH)) { $temp_file = $_FILES['upload_file']['tmp_name']; $img_path = UPLOAD_PATH . '/' . $_FILES['upload_file']['name']; if (move_uploaded_file($temp_file, $img_path)){ $is_upload = true; } else { $msg = '上传出错!'; } } else { $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!'; } } ?>
具体操作:
- 把网页源代码保存本地为html格式。
- 删除代码中的过滤规则。
- 找到代码中的action处,修改其指向地址为真实网站地址(通过真实网页查看network在尝试上传时数据包的Request URL)。action="http://127.0.0.1:8080/uploadlabs/Pass-01/index.php"
- 然后本地执行html文件,成功绕过过滤规则,向真实网站上传php格式的webshell。
案例5:某CMS文件上传漏洞测试
用小迪自己搭建的FineCMS网站示例:径直来到会员中心-上传头像部分进行测试
先按常规操作来:上传一个图片并抓包。抓不到,很明显上传操作由JS执行,没有经过PHP,直接在浏览器内执行了。
然后点击上传,发现抓得到数据包,但是修改后缀为php之后怎么弄都上传失败报错,而且也不回显上传之后的文件地址。其实这时查看网页根目录一层一层去找发现这个php文件是上传成功了的,只不过因为报错+无文件地址回显,这条路走不通了。
然后尝试其他办法,注意到:【FineCMS】回忆之前讲的信息收集,直接去搜FineCMS文件上传漏洞。finecms前台任意文件上传漏洞 | CN-SEC 中文网
依葫芦画瓢,抓包修改后缀后发送,然后访 uploadfile/member/uid/0x0.php 即可,把uid换成自己的uid就可以了。
再次强调:思路很重要,不要没头苍蝇
案例6:Weblogic 任意文件上传漏洞(CVE-2018-2894)
Vulhub - Docker-Compose file for vulnerability environment
现成的、第三方的漏洞,实战中知道用了WebLogic的话可以依葫芦画瓢进行尝试