python怎么防止命令注入_Python3命令注入防范

本文介绍了Python脚本中如何防止命令注入,重点讲解了使用shlex.quote()函数进行修复的方法,包括直接使用和自实现该函数的过程,并通过示例展示了其效果。
摘要由CSDN通过智能技术生成

一、背景说明

说实话自己是做安全的,平时总是给别人代码找茬,但轮到自己写代码有时比开发还不注重安全,其中有安全脚本一般比较小考虑安全那么处理安全问题的代码比重将会大大超过业务代码的问题也有不是专职开发添加一项功能还没开发那么熟练的问题。由于安全脚本一般不是对外开启服务的,所以一般也不会暴出什么问题。

但前段时间被拉群通知说自己写的一个脚本存在命令注入漏洞,开始很讶异,经沟通和分析之后发现是因为脚本有通过system调用一个二进制文件上报执行存在风险命令的操作,当构造一个命中风险判定规则且进一步构造注入语法的命令时,即能实现命令注入。

二、直接使用shlex.quote()进行修复

防范命令入注我们一般都会建议过滤\n$&;|‘"()`等shell元字符,但自己实现一个个字符处理还是比较麻烦的,我们尽量寻求一种简单的方法最好是现成的函数或者库进行处理。

示例代码如下:

importshlex

filename_para= ‘somefile‘command= ‘ls -l {}‘.format(filename_para)print("except result command:")print("{}\n".format(command))

filename_para= ‘somefile; cat /etc/passwd‘command= ‘ls -l {}‘.format(filename_para)print("be injected result command:")print("{}\n".format(command))

filename_para= ‘somefile; cat /etc/passwd‘command= ‘ls -l {}‘.format(shlex.quote(filename_para))print("be injected but escape result command:")print("{}\n".format(command))

运行结果如下:

20200526204445202899.png

三、自行写代码实现shlex.quote()进行修复

shlex.quote()是Python3.3之后才引入的,shlex.quote()代码也很简单,如果要兼容没有该函数的Python版本可以自行实现该函数。

从原理上看,shlex.quote()所做的就是两件事,一是在字符串最外层加上单引号使字符串只能做为一个单一体出现,二是将字符串内的单引号用双引号引起来使其失去可能的闭合功能。

示例代码如下:

importredefquote(s):"""Return a shell-escaped version of the string *s*."""

#return if string in null

if nots:return "‘‘"

#_find_unsafe = re.compile(r‘[^\w@%+=:,./-]‘, re.ASCII).search

#return if string have no those char.

if re.search(r‘[^\w@%+=:,./-]‘, s, re.ASCII) isNone:returns#use single quotes, and put single quotes into double quotes

#the string $‘b is then quoted as ‘$‘"‘"‘b‘

return "‘" + s.replace("‘", "‘\"‘\"‘") + "‘"

if __name__ == "__main__":

filename_para= ‘somefile‘command= ‘ls -l {}‘.format(filename_para)print("except result command:")print("{}\n".format(command))

filename_para= ‘somefile; cat /etc/passwd‘command= ‘ls -l {}‘.format(filename_para)print("be injected result command:")print("{}\n".format(command))

filename_para= ‘somefile; cat /etc/passwd‘command= ‘ls -l {}‘.format(quote(filename_para))print("be injected but escape result command:")print("{}\n".format(command))

运行结果如下:

20200526204445366967.png

参考:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值