欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

Python Subprocess库在使用中可能存在的安全风险总结

来源:本站整理 作者:佚名 时间:2018-09-10 TAG: 我要投稿
0×04. 参数拼接引发的命令注入风险
1)命令注入场景1:shell=True时,命令参数可控
案例:
s=subprocess.Popen('ls;id', shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
处理方案:
1)shell=True,使用 pipes.quote() 对参数进行过滤
如果是python3,推荐使用shlex.quote()
2)shell=False,参数使用list,此时能防止部分命令注入(其他风险见2))
缺点是写参数时会稍微麻烦点
2)命令注入场景2:shell=False时,参数选项拼接引发的命令注入风险
使用subprocess执行命令的时候,如果使用外部传入参数,且参数可控,要注意,参数不要变成命令中的 参数选项
像subprocess.call([]) 执行的是list 拼接起来的命令,如果可控参数 在拼接之后使得参数变成了参数选项,则存在命令注入风险
案例:
import subprocess
query = '--open-files-in-paper=id;'
r = subprocess.call(['git', 'grep', '-i', '--line-number', query, 'master'], cwd='/root/op-scripts')
默认情况下,python的subprocess接受的是一个列表。我们可以将用户输入的query放在列表的一项,这样也就避免了开发者手工转义query的工作,也能从根本上防御命令注入漏洞。但可惜的是,python帮开发者做的操作,也仅仅相当于是PHP中的escapeshellarg。我们可以试试令query等于–open-files-in-pager=id;:
php 中方式命令注入的两个函数
escapeshellcmd
escapeshellarg
二者分工不同,前者为了防止用户利用shell的一些技巧(如分号、反引号等),执行其他命令;后者是为了防止用户的输入逃逸出“参数值”的位置,变成一个“参数选项”。
如果开发者在拼接命令的时候,将$query直接给拼接在“参数选项”的位置上,那用escapeshellarg也就没任何效果了,与之类似的是如果将$query直接给拼接在“参数选项”的位置上,python中的shlex.quote() 或者pipes.quote() 也没了作用
为什么 shlex.quote() 不会奏效?
1)git grep -i --line-number '--open-files-in-pager=id;' master
2)git grep -i --line-number --open-files-in-pager=id; master
1)和 2)没有区别,单引号并不是区分一个字符串是“参数值”或“选项”的标准。
处理方案:
解决此类命令注入风险的关键是如何让shell 认为 ‘–open-files-in-pager=id;’ 不是个参数选项
在前面加上 — 就可以, 比如这样:git grep -i –line-number — ‘–open-files-in-pager=id;’ master
这样–open-files-in-pager 就不会作为参数选项了,原理如下:
在命令行解析器中,–的意思是,此后的部分不会再包含参数选项(option):
A -- signals the end of options and disables further option processing. Any arguments after the -- are treated as filenames and arguments. An argument of - is equivalent to --.
If arguments remain after option processing, and neither the -c nor the -s option has been supplied, the first argument is assumed to be the name of a file containing shell commands. If bash is invoked in this fashion, $0 is set to the name of the file, and the positional parameters are set to the remaining arguments. Bash reads and executes commands from this file, then exits. Bash's exit status is the exit status of the last command executed in the script. If no commands are executed, the exit status is 0. An attempt is first made to open the file in the current directory, and, if no file is found, then the shell searches the directories in PATH for the script.
-e 与 –  具有等同效果
0×05. 参考资料
https://docs.python.org/2/library/subprocess.html
https://www.leavesongs.com/PENETRATION/escapeshellarg-and-parameter-injection.html
 

上一页  [1] [2] 

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载