漏洞原理

代码注入是一种安全漏洞,指的是将恶意代码注入到应用程序中的过程。

简单来说,一些编程语言提供eval等函数将字符串的内容当作代码来执行,如果输入的内容可控,那么将会造成代码注入漏洞(任意代码执行)

漏洞危害

可以执行相关编程语言的任意代码,所以危害取决于可以执行代码的程度。

执行系统命令读写文件拒绝服务

漏洞复现

以python的exec函数为例。exec() 是 Python 的内置函数之一,用于执行动态生成的 Python 代码块。它接受一个字符串参数,该字符串包含要执行的 Python 代码。它可以执行包含多个语句的代码块,并且在执行时不返回结果。

假设存在如下功能函数:

def test(userInput):
    res = exec(f"a = 2+{userInput}; print(a)")
    return res

正常情况下,会给用户输入的内容和2相加并展示结果,如下。

2+3

但由于内容可控,因此我们可以输入任意内容,如:

3;import os;print(os.popen("whoami").read())

user

可见成功执行了预期外的代码

相关函数

列举常见编程语言中可能造成代码执行风险的函数,不保证全,仅当参考。

编程语言 风险函数
Python eval(), exec(), compile()
PHP eval(), create_function(), assert()
Java javax.script.ScriptEngine.eval(),OGNL表达式,SPEL表达式
JavaScript eval()

修复建议

  1. 输入验证和过滤
    1. 对于用户输入的数据,始终进行有效的验证和过滤,确保只接受预期的输入。
    2. 使用白名单验证,只允许特定的字符或格式通过验证,拒绝一切非法或不受信任的输入。
  2. 避免动态执行代码
    1. 避免直接使用函数(如 eval()exec()System.exec() 等)执行动态生成的代码。
    2. 尽量使用更安全的替代方案,如解析器、解释器或特定的API。
Copyright © d4m1ts 2023 all right reserved,powered by Gitbook该文章修订时间: 2023-05-16 16:09:33

results matching ""

    No results matching ""