最近在一个 Python Web 项目中处理了 3 个安全漏洞。
在修复完毕之后,来给大家简单地总结分享一下,以提高大家在程序编写和项目开发中的安全意识。
YAML文件解析漏洞
在项目中,我们使用了 Python 的 yaml 模块来解析用户上传文件中的.yaml文件,在之前的代码中我们使用了如下的代码对.yaml文件进行读取和解析:
代码语言:javascript复制
import yaml
yaml.load(yaml_file)
实际上,这样做会带来很大的安全风险。正常情况下,yaml会按照特定的解析规则对 yaml文件的内容进行解析,最后实现转换为Python可读取的对象形式。
但是,除此之外,yaml.load()方法还能调用任何Python函数,如果上传的yaml文件不是常规的yaml内容格式,而是一串 Python代码,它也会进行执行。
解决方法是,使用yaml模块的safe_load()方法代替load()方法来读取yaml文件。
代码语言:javascript复制
import yaml
yaml.safe_load(yaml_file)
SVG图片上传漏洞
SVG 是一个可伸缩的矢量图形,其使用XML来定义图形。
SVG 图片有一个绝佳的好处就是它放大或缩小都不会导致图片质量的下降,而像PNG、JPG等格式的图片在放大或缩小后都会带来一定程度的图片质量损失。
正是由于这一特性,使得越来越多的网站开始采用SVG格式的图片。
但是由于 SVG图片是通过 XML 来定义的,在其标准中也允许<script>
标签的存在,所以相当于就可以在SVG嵌入 JavaScript 的代码。而这,就会带来 XSS 的安全风险。
举个例子,我们通过如下代码构造一个SVG图片:
代码语言:javascript复制
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg
version="1.1"
baseProfile="full"
xmlns="http://www.w3.org/2000/svg">
-
<rect
width="300"
height="100"
style="fill:rgb(0,0,255);stroke-width:3;stroke:rgb(0,0,0)"
/>
-
<script
type="text/javascript">
alert("SVG XSS");
-
</script>
</svg>
在本地显示如下图所示:
在网页中打开,就会触发SVG文件中的JavaScript代码,如下图所示:
用户输入XSS
用户输入是很常见的XSS产生领域,在这个项目中,因为使用了其自带的HTML模板引擎,自动过滤和转义了不安全的HTML标签和符号。所以一开始也没对用户输入的这一块内容进行过滤处理。
代码语言:javascript复制
"><img src/onerror=alert(1)>
结果后面换了一个前端组件,在这个前端组件里面对文本内容进行解析,这个XSS漏洞就出现了。
索性在接收到用户输入的时候对其进行一次转义:
代码语言:javascript复制
def html_filter(data):
-
if len(data)
==
0:
-
return
""
payloads =
{
-
''':''',
-
'"':'"',
-
'<':'<',
-
'>':'>'
-
}
-
new
= data
-
for key, value in payloads.items():
-
new
=
new.replace(key, value)
-
return
new
根源
上述一切漏洞的根源,其实都是过于相信用户的输入。
在网络安全领域有一句铁律:永远不要相信用户的一切输入。
的确,你永远不知道用户会有多变态,构造各种变态的输入值来试图突破系统。
所以,永远不要相信用户的一切输入,永远对用户的一切输入保持警惕、提防和审查。
你在项目开发中遇到过哪些安全漏洞?欢迎留言讨论!