任意代码执行需关注的函数,可使用正则搜索:
eval\(|exec\(|execfile\(|compile\(
需关注的危险库文件及函数有:
os.system/popen
timeit.timeit
platform.popen
commands.getstatusoutput
subprocess.popen/call/check_output
__import__("os").system("ls")
importlib.import_module('os').system('ls')
其中subprocess较为常见,防御办法需保证shell=True未设置 转义变量:Python 2.x使用pipes.quote(),Python 3.3或更高版本使用shlex.quote();错误示例代码:
subprocess.Popen('ls',shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT).stdout.read()
importsubprocess
def transcode_file():
filename = raw_input('Please provide the path for the file totranscode: ')
command = 'ffmpeg -i "{source}"output_file.mpg'.format(source=filename)
subprocess.call(command, shell=True)
除此之外需还关注模板注入(SSTI),全局搜索Template类,一般使用方法为Template(user_input)。
Python中用于反序列化的模块有:
marshal
PyYAML——>yaml.safe_load()
pickle/cpickle
shelve
PIL
Unzip
示例利用代码:
import cPickle
cPickle.loads("cos\nsystem\n(S'uname -a'\ntR.")
定位鉴权代码及日志记录代码等,确认if判断、cookie、验证码机制等逻辑是否存在可绕过的缺陷。
SQL注入是各语言的普遍存在的问题,可通过SQL语句或特有关键字定位:
cursor.excute
ORM.raw()|extra()
产生原因大多也是来自于直接拼接,示例代码:
defuser_contacts(request):
user = request.GET['username']
sql = "SELECT * FROM user_contacts WHEREusername = %s"
cursor = connection.cursor()
cursor.execute(sql, [user])
results = cursor.fetchone() #or results = cursor.fetchall()
cursor.close()
安全做法为采用:
ModelInstance.objects.raw(sql,[])或connection.objects.execute(sql,[])。
Python代码中文件处理需关注的函数有:
file()
open()
codecs.open()
文件处理主要有上传功能,若未限制文件大小,可能导致ddos,未限制文件后缀,可导致任意文件上传,未给文件重命名,可能导致目录穿越,文件覆盖等问题。
其他包括任意文件下载,删除,写入,覆盖等,需对用户输入的文件名及路径进行校验,如对文件名未做校验则可目录穿越导致任意zip文件下载:
defexportCheck(request,filename):
if re.match(r“*.zip”,filename):
fullname = filename
else:
fullname = "/export/test.zip"
print fullname
return HttpResponse(fullname)
除此以外可借鉴其他语言漏洞,如zip解压漏洞(tarfile/Zipfile)、跨目录解压、临时文件用完删除等漏洞。
关注Python代码是否导入使用xml处理解析类:
xml.dom.*
xml.etree.ElementTree
xml.sax.*
错误示例代码如:
from lxml import etree
tree1 = etree.parse('test.xml')
print etree.tostring(tree1.getroot())
关注代码是否存在发起请求的库及函数,常见的有自带库requests.get()及urllib/urllib2库,用法为urllib.request.urlopen(url)。
关注返回值为rensponse的代码,重定向通常形如:
return HttpResponseRedirect
下列代码若输入可控则可造成XSS:
return HttpResponse('hello %s' %(name))
安全的写法为:
return render_to_response('hello.html', {'name':name})
关注logging()函数及LOGGER 等关键字,查看是否输出口令、密钥和其他敏感信息及输入是否可插入%0A%0D进行日志伪造。
(1)安全随机数:
当用于安全加密用途时,不可采用形如random.randint(0, 100)不安全的随机数生成机制;在Linux和类Unix下用,需使用/dev/random生成安全随机数,在windows下,使用random模块中的SystemRandom类来实现。
(2)格式化字符串:
使用形如下列格式化字符串容易造成敏感信息泄露:
"My name is %s" % ('jayway', )或"Myname is {}".format('jayway')
"My name is %(name)%" % {'name':'jayway'}
(3)沙箱逃逸:
沙箱逃逸是python安全必谈的话题,可使用各种编码、内置对象、PyCodeObj等进行沙箱逃逸,可参考链接:
https://hatboy.github.io/2018/04/19/Python%E6%B2%99%E7%AE%B1%E9%80%83%E9%80%B8%E6%80%BB%E7%BB%93/