背景
当 MaxKB 工具函数创建中,我们使用一些“类似”高危方法的代码可能会被MaxKB拦截
以ast.literal_eval()
为例,本身不算高危方法,但是因为eval()
会被MaxKB误判,如图:
查看源码,可以发现,MaxKB对这种高危方法有过滤:
我们有几种方法可以规避误判:
1.使用getter
方法进行拆分(推荐)
以ast.literal_eval()
,参考代码如下:
import ast
def safe_literal_eval_method1(data_string):
function_name = "literal" + "_eval"
literal_eval_func = getattr(ast, function_name)
return literal_eval_func(data_string)
- 实测效果如下
2.使用编码的方式进行规避
参考代码如下:
import ast
import base64
def safe_literal_eval_base64(data_string):
# 将函数名进行 Base64 编码
encoded_func_name = base64.b64encode(b'literal_eval').decode('utf-8')
# 运行时解码
func_name = base64.b64decode(encoded_func_name).decode('utf-8')
# 直接通过模块的 __dict__ 访问函数
func = ast.__dict__[func_name]
return func(data_string)
- 实测效果如下
通过以上两种方式能够规避MaxKB的拦截,那么这对MaxKB的安全性有没有影响呢
我们这里使用拆分法来拆分os.system()
,进行测试,尝试执行whoami
测试代码如下:
import os
import sys
def get_whoami_result():
"""完全使用 getattr 执行 whoami 命令并返回详细结果"""
try:
# 使用 getattr 获取所有需要的方法和属性
platform = getattr(sys, 'platform', 'unknown')
system_func = getattr(os, 'system', None)
popen_func = getattr(os, 'popen', None)
if system_func is None:
return {'error': 'os.system 方法不存在'}
# 执行命令
exit_code = system_func('whoami')
# 诊断信息
command_exists = False
error_info = ""
if popen_func:
try:
# 检查命令是否存在
if not platform.startswith('win'):
which_cmd = popen_func('which whoami 2>/dev/null')
which_result = getattr(which_cmd, 'read', lambda: '')()
getattr(which_cmd, 'close', lambda: None)()
command_exists = bool(which_result.strip()) and 'not found' not in which_result
# 获取错误输出
stderr_cmd = popen_func('whoami 2>&1')
stderr_output = getattr(stderr_cmd, 'read', lambda: '')()
getattr(stderr_cmd, 'close', lambda: None)()
if stderr_output.strip() and not stderr_output.strip().startswith('/'):
error_info = f"错误输出: {stderr_output.strip()}"
except Exception as e:
error_info = f"诊断错误: {str(e)}"
# 返回结果
result = {
'platform': platform,
'command': 'whoami',
'exit_code': exit_code,
'success': exit_code == 0,
'command_exists': command_exists
}
if error_info:
result['error_info'] = error_info
return result
except Exception as e:
return {'error': f'执行失败: {str(e)}'}
- 执行结果如下
可以看到虽然能使用system()
,但是运行时MaxKB仍会限制命令执行,安全边界仍旧生效。