MENU

Python eval() 命令注入

August 6, 2015 • Security

0x00 前言

eval是Python用于执行python表达式的一个内置函数,eval函数是python最常用于做序列化、反序列化的函数,有些人就会把外部输入的数据,eval一下变成对象.使用eval,可以很方便的将字符串动态执行。比如下列代码:

>>> eval("1+2")
3
>>> eval("[x for x in range(10)]")
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

当内存中的内置模块含有os的话,eval同样可以做到命令执行:

>>> import os
>>> eval("os.system('whoami')")
win-20140812chj\administrator
0

当然,eval只能执行Python的表达式类型的代码,不能直接用它进行import操作,但exec可以。如果非要使用eval进行import,则使用__import__

>>> exec('import os')
>>> eval('import os')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1
    import os
         ^
SyntaxError: invalid syntax
>>> eval("__import__('os').system('whoami')")
win-20140812chj\administrator
0

在实际的代码中,往往有使用客户端数据带入eval中执行的需求。比如动态模块的引入,举个栗子,一个在线爬虫平台上爬虫可能有多个并且位于不同的模块中,服务器端但往往只需要调用用户在客户端选择的爬虫类型,并通过后端的exec或者eval进行动态调用,后端编码实现非常方便。但如果对用户的请求处理不恰当,就会造成严重的安全漏洞。

0x01 案例

想一想这种使用环境:需要用户输入一个表达式,并求值。

如果用户恶意输入,例如:

__import__('os').system('dir')  

那么eval()之后,你会发现,当前目录文件都会展现在用户前面。

那么攻击者要是继续输入:

open('文件名').read()  

获取完毕,代码都给人看了

要是删除命令呢?

0x02 安全使用eval

  1. 自行写检查函数;
  2. 使用ast.literal_eval:自行查看DOCUMENT;
  3. safeeval;
  4. Restricted "safe" eval (Python recipe)

0x03 总结

so.强大的函数有代价,安全性是其最大的缺点。

0x04 参考

Archives QR Code
QR Code for this page
Tipping QR Code