Javascript 未关闭的img标签中断站点,但未显示

Javascript 未关闭的img标签中断站点,但未显示,javascript,html,xss,Javascript,Html,Xss,我想创建一个简单的站点,它可以被跨站点脚本漏洞破坏。问题在于第三个“困难”挑战,即使用正则表达式过滤输入,并删除以尖括号开始和结束的所有内容。例如, 搜寻 这是对应的JavaScript: <head> <title>Search</title> <meta charset="UTF-8"> <link rel="stylesheet" href="stylesheet/stylesheet.css">

我想创建一个简单的站点,它可以被跨站点脚本漏洞破坏。问题在于第三个“困难”挑战,即使用正则表达式过滤输入,并删除以尖括号开始和结束的所有内容。例如,

搜寻

这是对应的JavaScript:

<head>
    <title>Search</title>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="stylesheet/stylesheet.css">
    <script src="script/xss_hard.js"></script>
</head>
<body>
    <div id="top">
        <div id="Logo">
            <img src="images/logo.png" style="margin-top: 0px; width:150px;display:block" />
            <h2><span id="title">Search</span></h2>
        </div>
    </div>

    <div id="logic">
        <input type="text" onclick="javascript:clearBox()" value="Search" id="box">
        <input type="submit" value="Check" onclick="javascript:submit()" id="butt">
    </div>

    <p id="searchReflect"></p>
</body>
函数提交(){
var reflect=document.getElementById('searchReflect');
var-boxText=document.getElementById('box')。值;
var黑名单=/;
替换(黑名单“”);
reflect.HTML=“您对\”“+boxText+“\”的搜索没有返回任何内容!”;
}
我们的期望是,可以注入例如
并获得警报弹出窗口(XSS)。实际情况是这样的(摘自Firefox inspector的“编辑为HTML”):

您对“

奇怪的是,它破坏了输出,但仍然没有运行。与
svg
iframe
或其他标记相同。当过滤或正确嵌入时(例如
innerText
),它应该是:


您对“foo”的搜索没有返回任何结果!

您需要改进代码

function submit(){
    var reflect = document.getElementById('searchReflect');
    var boxText = document.getElementById('box').value;

    var blacklist = /<.*>/;

    boxText = boxText.replace(blacklist, '');

    reflect.HTML = "Your search for \"" + boxText + "\" returned nothing!";  
}

搜寻
搜寻

和相应的Javascript。我在
标记中添加了jQuery以使代码更简单:)Javascript太长,无法编写,因此请使用jQuery而不是Javascript

<head>
    <title>Search</title>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="stylesheet/stylesheet.css">
    <script src="https://code.jquery.com/jquery-3.4.1.js"integrity="sha256-WpOohJOqMqqyKL9FccASB9O0KwACQJpFTUBLTYOVvVU="crossorigin="anonymous"></script>
    <script src="script/xss_hard.js"></script>
</head>
<body>
    <div id="top">
        <div id="Logo">
           <img src="images/logo.png" style="margin-top: 0px;width:150px;display:block" />
            <h2><span id="title">Search</span></h2>
        </div>
    </div>
    <div id="logic">
        <input type="text" value="" id="box" placeholder="Search" />
        <input type="submit" value="Check" onclick="submit()" id="butt" />
    </div>
    <p id="searchReflect"></p>  
</body>
函数提交(){
var reflect=$(“#searchReflect”);
var-boxText=document.getElementById('box')。值;
var黑名单=/;
替换(黑名单“”);
html('您对\''+boxText+'\'的搜索没有返回任何内容!');
$('框').val('');
}

我强烈建议您在不使用
innerHTML
的情况下使用DOM,如果您愿意,我可以向您展示示例找到我的答案并运行代码。我不知道您的意思。@VadimHulevich。我很高兴看到一个示例-该示例是否仍能运行代码?正如我所说的,我需要跨站点脚本才能工作。谢谢您的回复r、 但这不是问题所在。问题是它为什么会这样,以及我如何解决它。jQuery没有解决问题。发布的答案是由我运行的,它是有效的。没有显示任何图像标记的错误。不幸的是,它对我不起作用。与以前一样,正在发生同样的事情。我需要页面来运行注入的脚本。
function submit(){
    var reflect = $('#searchReflect');
    var boxText = document.getElementById('box').value;
    var blacklist = /<.*>/;

    boxText = boxText.replace(blacklist, '');

    reflect.html('Your search for \'' + boxText + '\' returned nothing!');  
    $('#box').val('');
 }