请考虑下面的PHP页面,名为xss1.php。您可以将其上传到您拥有的任何LAMP服务器或VM,以了解我的难题。
<?php
ob_start();
session_start();
$searchValue = "";
if ($_SERVER["REQUEST_METHOD"] === "POST") {
$searchValue = trim($_POST["txtSearch"]);
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>XSS: Sample 1</title>
</head>
<body>
<form name="xssForm" method="POST" action="xss1.php">
<input type="text" id="txtSearch" name="txtSearch" maxlength="128" value="<?php print($searchValue); ?>"/>
<input type="Submit" id="btnSubmit" value="Submit"/>
</form>
</body>
</html>
<?php
ob_end_flush();
?>
我的印象是,文本字段中的数据按原样显示,并且需要最少或无需XSS检查。在此文本字段中,如果我坚持&lt; script&gt; alert(1);&lt; / script&gt; 并且表单已发布,则该值将再次显示在文本字段中,没有XSS执行或注入。我正在运行Firefox 50.0.2。在我的Mac OS X上。
现在,如果我坚持&#34;&gt;&lt; script&gt; alert(1);&lt; / script&gt; ,就会有XSS,我会看到一个Javascript警告弹出窗口1在其中。字符&#34; /&gt;来自文本字段,在页面上呈现为文本,而不是在文本字段内。这里改变了什么?我有点困惑,可能会花费下一个小时试图在https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet
上找到XSS Filter Evasion Cheat Sheet上的答案在Safari中,我没有看到Javascript警告弹出,但&#34; /&gt;写在文本字段之外,紧跟在页面上。
太平洋时间凌晨2:01,我在西雅图失眠了。)
答案 0 :(得分:0)
我的印象是,文本字段中的数据按原样显示,需要进行最少或无需XSS检查
你的印象错了。对于XSS,需要考虑将任何用户输入到HTML文档中。它必须是:
字符
"/>
位于文本字段之后,在页面上呈现为文本,而不是在文本字段内。这里改变了什么?
您添加了"
个字符。 "
结束属性值。
然后你添加了>
。在标记内部,但在属性值之外,>
结束标记。
原始文档中的"/>
(即不属于用户输入的那些)不再具有要关闭的属性和标记(因为来自用户输入的">
因此,它被呈现为文本。