根据OWASP,用户在href属性中输入的内容应为“ ...除字母数字字符外,以%HH转义格式对所有ASCII值小于256的字符进行转义。”
我不理解其背后的原因。为什么URL编码无法完成这项工作?我花了数小时试图为动态生成并呈现给用户的URL字符串创建攻击向量,对我来说,这似乎是对XSS攻击的可靠保护。
我也已经研究了一段时间,大多数人建议将URL编码与HTML编码一起使用。我完全理解为什么HTML编码不足,因为仍然可以利用其他向量,例如onclick=alert()
有人可以给我展示一个攻击向量的例子,该向量被用来操纵带有URL编码,没有HTML编码或owasp.org在规则#5中建议的编码的href?
答案 0 :(得分:1)
否,如果有人注入javascript:alert(0)
,它将起作用。没有一种编码方法可以阻止这种情况,您应该尝试阻止javascript URI方案以及所有其他允许XSS的URI方案,例如data:
和blob:
。
建议不要将用户输入直接反映到链接中。
此外,重要的是要记住不要简单地使用preg_replace
之类的东西来精确地阻塞这些方案,因为换行会绕过它并产生XSS有效负载。例如:java%0a%0dscript:alert(0);
。如您所见,在有效负载的中间放置了一个CRLF字符,以防止PHP(或其他服务器端语言)将其识别为已阻止的javascript:
。但是HTML仍会将其呈现为javascript:alert(0);
,因为CRLF字符是空格,并且被HTML(在元素属性的值之内)忽略,但仍被PHP和其他语言解释。
答案 1 :(得分:1)
编码取决于上下文。如果HTML文档中有URL,则需要URL编码和HTML编码,但时间不同。
...除了字母数字字符外,用 使用%HH转义格式的ASCII值小于256。
这建议使用URL编码。但不是整个URL。上下文是在将URL参数插入到URL中时进行的,它们需要进行URL编码,仅允许在值中使用&
符号。
请勿使用URL编码对完整或相对URL进行编码!
这是整个URL的单独规则。对URL进行编码后,然后将其插入html属性中,然后应用html编码。
您无法将URL编码应用于完整的URL,因为它已被URL编码,再次对其进行编码将导致双重编码,从而破坏了URL。例如,原始网址中的任何%
符号都是错误的。
需要HTML编码,因为与符号(&)一样,它们在URL中是有效字符,但由于字符实体,在HTML中具有不同的含义。 URL可能包含看起来像HTML实体但不需要在插入HTML文档时进行编码的字符串。