jQuery DOM-XSS笔记

0x00 基本介绍

jQuery函数等于$() 。

在上文列出的第一个公式中,jQuery() — 这个也可以写成 $() — 通过提供的选择器检索任何DOM元素并且通过这些元素创建一个新的jQuery对象.

参考:https://www.css88.com/jqapi-1.9/jQuery/

0x01 实际案例

jQuery("<img/src=x onerror=alert(1)>") 可以触发xss。

实际案例:

站点:https://www.alchemer.com/

1
2
3
4
5
6
7
8
window.addEventListener("message", (function(t) {
if ("hsFormCallback" === t.data.type && "onFormReady" === t.data.eventName) {
var e = t.data.id,
n = jQuery('form[data-form-id="'.concat(e, '"]')),
a = ["contact_last_touch_page_url_", "contact_last_touch_page_title_", "contact_last_touch_n_2_page_title_", "contact_last_touch_n_1_page_title_"];

}
}

jQuery('form[data-form-id="'.concat(e, '"]')) 中e是可控的。

但是字符串开头不发控制,在大部分jQuery版本下无法利用。

0x02 jQuery版本

jQuery("form[data-form-id=1].<img/src=x onerror=alert(1)>") 这个payload生效版本为1.8.3版本及以前,也就是说1.9及1.9之后的版本就无法利用了。

查阅资料看到1.9的更新:https://jquery.com/upgrade-guide/1.9/

Prior to 1.9, a string would be considered to be an HTML string if it had HTML tags anywhere within the string. This has the potential to cause inadvertent execution of code and reject valid selector strings. As of 1.9, a string is only considered to be HTML if it starts with a less-than (“<”) character. The Migrate plugin can be used to restore the pre-1.9 behavior.

As of 1.9, a string is only considered to be HTML if it starts with a less-than ("<") character 主要看这一句,也就是说,1.9版本之后,只有< 尖括号开头的才能利用。