安全小黄鸭 10月23日 23:53
Python subprocess使用陷阱与漏洞
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文分享了在使用python subprocess进行扫描器开发时遇到的问题,特别是在使用shell=True参数时可能导致的远程命令执行漏洞。作者通过实例分析了subprocess.Popen在shell=True和shell=False模式下的行为差异,并提出了相应的解决方案,强调在使用subprocess时应尽量避免使用shell=True,以避免潜在的安全风险。

🔍 在使用subprocess.Popen时,如果设置了shell=True,subprocess会先启动一个shell进程,然后再从shell启动目标进程。这可能导致即使父进程被杀,子进程仍然残留,造成资源浪费。

🔒 当使用shell=True时,如果传入的命令来自用户输入,如URL参数,可能会被恶意利用,从而实现远程命令执行漏洞。例如,用户输入的URL包含命令注入代码,通过shell=True被执行。

🛠️ 解决方案是将shell参数设置为False,并确保命令作为列表传递。如果命令原本是字符串格式,可以使用shlex.split函数将其转换为列表。这样可以避免shell进程的额外启动,减少安全风险。

Fr1day 2017-08-22 23:46

分享我在使用 python subprocess 进行扫描器开发过程中踩过的坑,以及应用在分布式扫描程序中的时候,可能存在的远程命令执行漏洞。

安全开发者的小黄鸭,会不定期的分享我在日常工作中遇到的一些问题、解决方案,以及新的姿势技巧,大多数推送的文章会比较短。

如果你在安全开发方面有什么问题,也可以直接回复公众号,我会抽时间解答~


一句话总结:subprocess.Popen 使用的时候,最好是 shell=False


ok~今天的主要内容是分析python subprocess模块的应用,以及需要注意的点,首先来看一段基本代码:



这段代码的作用是用 subprocess.Popen 开启一个基于 phantomjs 的爬虫进程,阻塞等待程序执行结束,使用正则表达式匹配出有效内容后返回。


程序做了超时处理,在调用communicate函数的时候指定了超时时间,如果任务超时,会调用kill函数杀掉当前进程。


但是在程序运行过程中,出现了多个phantomjs进程驻留内存的问题。


一开始怀疑kill()函数失效,为了检查kill()函数是否正常运行,我在 process.kill() 之前,插入了一句print(process.pid)。根据打印出来的pid,进程中并没有 subprocess 进程残留,即打印出来的 pid 和未结束的 phantomjs 进程pid并不相同,且phantomjs.pid = process.pid + 1。


似乎是subprocess在调度任务的时候,开启了两个进程,在父进程被kill的时候,并没有kill子进程(或者两个进程之间根本没有父子关系)。那为什么会开启两个进程呢?


搜索之后,发现了问题所在。shell=True 参数会模拟在shell中执行,先是起了shell进程,再从shell起了phantomjs进程。调用 process.kill() 之后,只杀死了shell进程。


所以解决方案也很明显,把 shell=True 改成 shell=False 即可。但 shell=False 的模式下,subprocess.Popen第一个参数传参需为 list,否则会报错。



对于原本是字符串格式的命令,可以用 shlex.split 函数来转换成 list。


在分布式扫描系统中,启用 shell=True 还可能导致远程命令执行漏洞。

shell=True模式下,subprocess.Popen函数的第一个参数为字符串,有些同学就会这样写:



当你抓取到的URL是这样的:



再比如,当你抓取到的URL是这样的:


如果没做特别限制的话,扫描者的程序可能就被狗带了。


当然还有一些其他的反击扫描者的方式,之后会和大家分享~



阅读原文

跳转微信打开

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

Python subprocess 安全开发 命令注入 远程命令执行
相关文章