专栏首页卓文见识Python代码审计汇总

Python代码审计汇总

1、任意代码执行

任意代码执行需关注的函数,可使用正则搜索:

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)。

2、反序列化

Python中用于反序列化的模块有:

marshal
PyYAML——>yaml.safe_load()
pickle/cpickle
shelve
PIL
Unzip

示例利用代码:

import cPickle
cPickle.loads("cos\nsystem\n(S'uname -a'\ntR.")

3、权限绕过

定位鉴权代码及日志记录代码等,确认if判断、cookie、验证码机制等逻辑是否存在可绕过的缺陷。

4、SQL注入

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,[])。

5、文件操作

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)、跨目录解压、临时文件用完删除等漏洞。

6、XXE

关注Python代码是否导入使用xml处理解析类:

xml.dom.*
xml.etree.ElementTree
xml.sax.*

错误示例代码如:

from lxml import etree
tree1 = etree.parse('test.xml')
print etree.tostring(tree1.getroot())

7、SSRF

关注代码是否存在发起请求的库及函数,常见的有自带库requests.get()及urllib/urllib2库,用法为urllib.request.urlopen(url)。

8、XSS/重定向

关注返回值为rensponse的代码,重定向通常形如:

return HttpResponseRedirect

下列代码若输入可控则可造成XSS:

return HttpResponse('hello %s' %(name))

安全的写法为:

return render_to_response('hello.html', {'name':name})

9、日志相关

关注logging()函数及LOGGER 等关键字,查看是否输出口令、密钥和其他敏感信息及输入是否可插入%0A%0D进行日志伪造。

10、其他

(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/

本文分享自微信公众号 - 卓文见识(zhuowenjianshi),作者:Jayway

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-02-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java代码审计汇总系列(八)——其他

    汇总一下其他类型的代码审计漏洞,包括硬编码、日志打印漏洞、开放重定向、IP伪造、越权、CSRF等。

    Jayway
  • 账户接管(Account Takeover)漏洞挖掘及实战案例全汇总

    身份验证(Authentication):验证某人是特定用户,是否正确提供其安全凭据(密码,安全问题答案,指纹扫描等)。

    Jayway
  • 信息泄露(Information Exposure)挖掘及实战案例全汇总

    信息泄露(InformationExposure)漏洞是有意或无意地向未明确授权访问该信息的行为者披露信息。信息泄露是最为常见和普遍的漏洞之一,漏洞出现的位置、...

    Jayway
  • 「译」什么是抽象语法树

    AST 是抽象语法树的缩写词,表示编程语言的语句和表达式中生成的 token。有了 AST,解释器或编译器就可以生成机器码或者对一条指令求值。

    Chor
  • 基于FPGA的二值图像的边界提取算法的实现

    二值图像(Binary Image)是指将图像上的每一个像素只有两种可能的取值或灰度等级状态,人们经常用黑白、B&W、单色图像表示二值图像。二值图像是指在图像中...

    FPGA开源工作室
  • 聊聊rocketmq的suspendCurrentQueueTimeMillis

    本文主要研究一下rocketmq的suspendCurrentQueueTimeMillis

    codecraft
  • 聊聊rocketmq的suspendCurrentQueueTimeMillis

    本文主要研究一下rocketmq的suspendCurrentQueueTimeMillis

    codecraft
  • 卫星图像分割--Effective Use of Dilated Convolutions for Segmenting Small Object Instances

    Effective Use of Dilated Convolutions for Segmenting Small Object Instances in R...

    用户1148525
  • 机器学习系列7:逻辑回归

    你们有没有每天被垃圾短信骚扰的经历呢?假设我收到了一条短信,这条短信对我来说只有两种情况,要么是对我有用的,要么是没用的。我想通过一个模型去预测该短信是否为垃圾...

    SuperFeng
  • Vue+Django2.0 REST framework打造前后端分离的生鲜电商项目(三)设计数据库以及导入原始数据

    玩蛇的胖纸

扫码关注云+社区

领取腾讯云代金券