XSS注入原理及应用

XSS简介

参考书籍:《白帽子讲web安全》

XSS 跨站脚本攻击(Cross Site Script),它与SQL注入攻击类似,SQL注入攻击中以SQL语句作为用户输入,从而达到查询/修改/删除数据的目的,而在xss攻击中,通过(插入恶意脚本,实现对用户游览器的控制。

XSS漏洞原理

首先在本地搭个PHP环境,代码如下:

1
2
3
4
<?php
$input = $_GET["param"];
echo "<div>".$input."</div>";
?>

1
http://localhost/ch01/xss.php?param=hello

可以看到页面输出hello,那么尝试提交一段HTML代码会怎么样呢

1
http://localhost/ch01/xss.php?param=<script>alert('xss')</script>

image

成功弹出框,说明存在XSS注入,这就是简单的XSS基本原理了.

这里有个不错的链接讲解

XSS的原理分析与解剖

xss分为三类:

  • 反射型XSS:又称“非持久性XSS”(Non-persistent XSS),只是简单地把用户输入的数据“反射”给浏览器。

  • 存储型XSS:又称“持久型XSS”,用户输入的数据存储在服务器端,具有很强的稳定性

  • DOM Based XSS:这种类型并非按照“数据是否保存在服务器端”来划分,从效果上来说也是反射型XSS,但其形成原因较特别。出于历史原因,就把他单独作为一个分类了。修改页面的DOM结点形成XSS,故称之为DOM Based XSS。

再看如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<html>
<body>
<script>
function test(){
var str = document.getElementById("text").value;
document.getElementById("t").innerHTML = "<a href='"+str+"' >testLink</a>";
}
</script>
</body>
</html>

<div id ="t" ></div>
<input type="text" id="text" value="" />
<input type="button" id="s" value="write" onclick="test()"/>

点击”write”按钮后,会在当前页面插入一个超链接,其地址为文本框的内容。

image

这里的 “write”按钮中的onclick事件调用了test()函数.而在test()函数中,修改了页面的DOM节点,通过innerHTML把一段用户数据当作HTML写入到页面中,这就造成了DOM based XSS.

接下来尝试构造如下数据:

1
' onclick=alert('xss') //

输入后页面代码变成了:

1
<a herf='' onclick=alert('xss')//'>testLink</a>

  • 第一个单引号闭合掉href的第一个单引号
  • //是注释符,注释掉第二个单引号

点击这个新生成的链接,脚本将被执行:

image

这个就是恶意脚本的执行。

还有另一种利用方式——除了构造一个新事件外,还可以选择闭合掉标签,并插入一个新的HTML标签:

1
'><img src=# onerror=alert('xss') /><'

文章目录
  1. 1. XSS简介
    1. 1.1. 参考书籍:《白帽子讲web安全》
    2. 1.2. XSS漏洞原理
,