Lua中的代码注入能否仅通过变量定义来执行?

时间:2019-12-04 15:50:41

标签: lua code-injection sanitization

假设我在Lua中定义了这样的变量

local input = "..."

...来自用户提供的字符串。该用户仅从变量定义就能执行代码注入吗?我需要清理字符串吗?

1 个答案:

答案 0 :(得分:2)

通常,如果您需要问自己是否需要清理输入内容,正确的答案是“是”。

对于这种特殊情况,如果仅将用户的字符串直接复制/粘贴到Lua源文件中,即使使用这样的引号,他们也将能够执行任意代码。这甚至不是特别困难。他们可以提供some text"; my_code = 20; last = "end of string

解决此问题的最佳方法是使用带有[[...]]语法的长格式文字字符串。但是即使那样也可以破解,因此您需要在给定的字符串中搜索=字符的重复序列。每次找到一个序列时,请注意该序列中有多少个=字符。搜索后,在您的文字字符串中插入许多=个字符,这些字符不是用户字符串中找到的长度之一。

当然,Lua的内部实现可能会对长格式文字字符串中=序列的长度有所限制。在这种情况下,外部用户可以通过强迫您使用比实现所支持的更长的序列来破坏。但是它不会导致任意代码执行;您只会得到一个编译错误。