漏洞原理
代码注入是一种安全漏洞,指的是将恶意代码注入到应用程序中的过程。
简单来说,一些编程语言提供eval
等函数将字符串的内容当作代码来执行,如果输入的内容可控,那么将会造成代码注入漏洞(任意代码执行)
漏洞危害
可以执行相关编程语言的任意代码,所以危害取决于可以执行代码的程度。
如 执行系统命令、读写文件、拒绝服务 等
漏洞复现
以python的
exec
函数为例。exec()
是 Python 的内置函数之一,用于执行动态生成的 Python 代码块。它接受一个字符串参数,该字符串包含要执行的 Python 代码。它可以执行包含多个语句的代码块,并且在执行时不返回结果。
假设存在如下功能函数:
def test(userInput):
res = exec(f"a = 2+{userInput}; print(a)")
return res
正常情况下,会给用户输入的内容和2相加并展示结果,如下。
但由于内容可控,因此我们可以输入任意内容,如:
3;import os;print(os.popen("whoami").read())
可见成功执行了预期外的代码
相关函数
列举常见编程语言中可能造成代码执行风险的函数,不保证全,仅当参考。
编程语言 | 风险函数 |
---|---|
Python | eval() , exec() , compile() |
PHP | eval() , create_function() , assert() |
Java | javax.script.ScriptEngine.eval() ,OGNL表达式 ,SPEL表达式 |
JavaScript | eval() |
修复建议
- 输入验证和过滤
- 对于用户输入的数据,始终进行有效的验证和过滤,确保只接受预期的输入。
- 使用白名单验证,只允许特定的字符或格式通过验证,拒绝一切非法或不受信任的输入。
- 避免动态执行代码
- 避免直接使用函数(如
eval()
、exec()
、System.exec()
等)执行动态生成的代码。 - 尽量使用更安全的替代方案,如解析器、解释器或特定的API。
- 避免直接使用函数(如