xss 脚本攻击问题

如下php代码

<?php
error_reporting(0);
$name = $_GET["name"];
?>
<input id="text" type="text" value="<?php echo $name;?>" />
<div id="print"></div>
<script type="text/javascript">
var text = document.getElementById("text"); 
var print = document.getElementById("print");
print.innerHTML = text.value; // 获取 text的值,并且输出在print内。这里是导致xss的主要原因。
</script>

为什么会有两种不同情况?chrome 55版本

http://localhost/test/?name=<script>alert(1)</script>//失败
http://localhost/test/?name=<img src=1 onerror=alert(1)>//成功
阅读 4.4k
5 个回答

你好,这个问题主要是chrome自带的xss过滤器导致的

目前很多浏览器都会自身对用户的输入进行判断,检测是否存在攻击字符,比如你上述提到的<script>标签,这段脚本很明显就是一段xss攻击向量,因此浏览器会对这段输入进行处理,不同的浏览器处理方式也不一样。

但为了不影响用户体验,过滤器一般也只会对一些基础的xss攻击语句进行处理,所以题主下面的语句很可能过滤器并未检测和处理,因此造成了上述情况。

不好意思,之前没仔细看代码,题主是通过innerHTML将文本插入,这样的方式确实不会执行,我上述的回答仅适用于直接输出时造成的执行差异。

$name = htmlspecialchars ($_GET["name"],ENT_QUOTES );
print.innerText= text.value;

新手上路,请多包涵

print.innerHTML 这个 innerHTML 是解析html标签的 innerText 是不解析 html标签的.这个是典型的demoxss

可以使用document.write()让js执行

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题