示例1
考虑支持多种语言的Web应用程序。它通过使用lang参数选择适当语言的消息。
$ dir =“/home/cwe/语言”;
$ lang = $ _get ['lang'];
if(preg_match(“/[a-za-z0-9]+/”,$ lang)){
包括(“ $ dir/$ lang”);
}
别的 {
回声“你不会通过!\ n”;
}
以前的代码试图仅匹配字母数值,以便诸如“英语”和“法语”之类的语言值有效,同时也可以防止路径遍历,CWE-22。但是,省略了正则表达锚,因此任何包含至少一个字母数字字符的文本现在都将通过验证步骤。例如,下面的攻击字符串将匹配正则表达式。
如果攻击者可以将代码序列注入文件,例如Web服务器的HTTP请求日志,则攻击者可能能够将lang参数重定向到日志文件并执行任意代码。
示例2
该代码在调用“ ping”命令中使用它之前使用正则表达式来验证IP字符串。
导入子过程
导入
def validate_ip_regex(ip:str):
ip_validator = re.compile(r“((25 [0-5] |(2 [0-4] | 1 \ d | [1-9] |)\ d)\。?\ b){4}”)
如果ip_validator.match(ip):
返回IP
别的:
提高ValueError(“ IP地址不匹配有效模式。”)
def run_ping_regex(ip:str):
验证= validate_ip_regex(ip)
#ping命令将零prepended的IP地址视为八十
结果= subproces.call([[“ ping”,已验证]))
打印(结果)
由于正则表达式没有锚点(CWE-777),即没有 ^或$字符的无界无限,然后将0或0x预先到IP地址的开头仍将导致匹配的REGEX模式。由于PING命令支持八进制和十六进制的IP地址,因此它将使用意外有效的IP地址(CWE-1389)。例如,“ 0x63.63.63.63”将被认为等同于“ 99.63.63.63”。结果,攻击者可能会可能会直接达到攻击者无法直接到达的PING系统。