文章目录

案例一:

搜索框输入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。

文章目录