几个DOM XSS案例分析
文章目錄
案例一:
搜索框输入payload,点击搜索的时候触发。利用起来比较鸡肋,一直对dom xss没有仔细分析过,记录一下dom xss的常规分析方法。
在输入框中输入单引号,查看console报错。定位到goPage函数。
定位到相关代码:
function getSearchKeys() {
var keys = {};
if (!window.location.search)
return keys;
for (var t = window.location.search.slice(1).split("&"), i = 0, len = t.length; len > i; i++) {
var m = t[i].split("=");
keys[m[0]] = m[1]
}
return keys
}
function goPage(keys) {
window.location.href = window.location.protocol + "//" + window.location.host + window.location.pathname + "?" + eval("'" + JSON.stringify(keys) + "'").slice(1, -1).replace(/\"/g, "").replace(/\:/g, "=").replace(/\,/g, "&")
}
getSearchKeys获取url中的search参数,保存到keys中。在goPage中,keys进入了eval函数。如下:
eval("'" + JSON.stringify(keys) + "'")
导致js执行。
调试js,异常时断点。可以观察keys的值,以及eval执行的字符串。
修复代码:去掉了eval函数
function goPage(keys) {
var sk = combineKeys(keys);
window.location.href = window.location.protocol + "//" + window.location.host + window.location.pathname + "?" + sk
}
function combineKeys(keys) {
var currSearch = window.location.search;
if (currSearch) {
currSearch = currSearch.slice(1) + "&";
for (var key in keys)
if (currSearch.indexOf(key + "=") >= 0) {
var reg = new RegExp(key + "=(.|\n)*?&");
currSearch = currSearch.replace(reg, key + "=" + keys[key] + "&")
} else
currSearch = currSearch + key + "=" + keys[key] + "&";
currSearch = currSearch.slice(0, -1)
} else
for (var key in keys)
currSearch = currSearch + key + "=" + keys[key];
return currSearch
}
案例二:
https://url?fileName=111jpg&cameraName=%3C/span%3E%3Cscript%3Ealert(1)%3C/script%3E%3C/span%3E 触发。
形式看起来像反射xss,但是搜索源码没有发现alert关键词。在script标签中,输入alert(1);111111这样执行到这里的时候会触发异常,使用chrome的调试工具的异常断点。
之后使用F10 step over next function call 按钮。定位到
看到是因为$(‘#cameraName’).html(cameraName); 直接html()获取到的内容导致的dom型xss。