主机名不完整的正则表达式¶
ID: py/incomplete-hostname-regexp
Kind: problem
Security severity: 7.8
Severity: warning
Precision: high
Tags:
- correctness
- security
- external/cwe/cwe-020
Query suites:
- python-code-scanning.qls
- python-security-extended.qls
- python-security-and-quality.qls
清理不受信任的 URL 是防止攻击(如请求伪造和恶意重定向)的常见技术。通常,这是通过检查 URL 的主机是否在允许的主机集中来实现的。
如果正则表达式实现了这种检查,则很容易通过不适当地转义 .
元字符来意外地使检查过于宽松。即使检查没有用于安全关键环境,当它意外成功时,不完整的检查也可能导致不希望的行为。
建议¶
在为安全检查构造正则表达式时,请适当地转义所有元字符,并特别注意 .
元字符。
示例¶
以下示例代码检查 URL 重定向是否将到达 example.com
域或其子域之一。
from flask import Flask, request, redirect
import re
app = Flask(__name__)
UNSAFE_REGEX = re.compile("(www|beta).example.com/")
SAFE_REGEX = re.compile(r"(www|beta)\.example\.com/")
@app.route('/some/path/bad')
def unsafe(request):
target = request.args.get('target', '')
if UNSAFE_REGEX.match(target):
return redirect(target)
@app.route('/some/path/good')
def safe(request):
target = request.args.get('target', '')
if SAFE_REGEX.match(target):
return redirect(target)
由于未转义的 .
允许在 example.com
之前出现任何字符,因此 unsafe
检查很容易绕过,实际上允许重定向到攻击者控制的域,例如 wwwXexample.com
。
safe
检查通过转义 .
来关闭此漏洞,以便形式为 wwwXexample.com
的 URL 被拒绝。
参考资料¶
OWASP: SSRF
OWASP: XSS 未验证重定向和转发备忘单.
常见弱点枚举:CWE-20.