Python中能否构造字符串实现拼接逃逸并注入恶意代码?
针对Python代码注入场景的解决方案
核心前提说明
首先要明确你的代码执行场景:只有当add("user." + username, "n", timestamp)是动态生成的Python代码字符串并通过exec/eval执行时,才有可能实现参数注入;如果是普通运行时的函数调用(直接传递字符串拼接结果作为参数),则无法改变函数的参数列表,注入目标不可能达成。
可实现注入的场景(动态代码生成)
你之前尝试失败的关键错误是误用了注释语法:Python的单行注释是#,而非其他语言的//。根据你的目标,构造特定username值即可实现注入:
构造方案1(username作为代码片段直接插入)
如果代码模板是直接将username作为表达式插入(如code = f'add("user." + {username}, "n", timestamp)'),将username设置为:
"name", "y", timestamp)#
生成后的最终代码为:
add("user." + "name", "y", timestamp)#, "n", timestamp)
- 第一个参数变为
"user." + "name",得到目标键名"user.name" - 第二个参数被替换为管理员权限值
"y" - 第三个参数保留
timestamp - 原有的
", "n", timestamp)被#注释,完全失效
构造方案2(username被双引号包裹在代码模板中)
如果代码模板将username用双引号包裹(如code = f'add("user." + "{username}", "n", timestamp)'),将username设置为:
name", "y", timestamp)#
生成后的最终代码为:
add("user." + "name", "y", timestamp)#", "n", timestamp)
同样能达成目标,Python会自动忽略#之后的所有内容。
无法实现注入的场景(普通函数调用)
如果你的代码是普通运行时调用(如下):
def add(key, perm, ts): # 函数逻辑 pass username = request.body.username add("user." + username, "n", timestamp)
这种情况下无论username是什么内容,都只会作为第一个参数的字符串拼接部分,add的第二个参数永远是"n",无法通过字符串拼接改变函数的参数结构,注入目标无法实现。
内容的提问来源于stack exchange,提问作者Amparo
相关产品推荐
相关产品推荐

