一、XSS漏洞简介
XSS(Cross-Site Scripting):跨站脚本攻击,为不与层叠样式表的缩写混淆,将跨站脚本攻击缩写为XSS。
XSS漏洞是一种在Web应用中常见的安全漏洞,它允许用户将恶意代码植入Web页面,当其他用户访问此页面,植入的恶意代码就会在其他用户的客户端执行。
二、XSS的分类
1、反射型XSS漏洞
利用反射型XSS漏洞植入的恶意代码不会存储在服务器端,一般通过搜索页面,需要构造植入恶意代码的Web页面,诱骗受害者访问该页面,才能触发攻击。
2、存储型XSS漏洞
利用存储型XSS的恶意代码存储在服务器中,一般通过留言板、个人信息、文章发表等功能的页面中。如果页面对用户输入的数据过滤不严格,恶意用户会将恶意代码存储到服务器中。这类XSS漏洞代码非常严重,因为恶意代码会存储到服务器中,客户端每次访问服务器都会触发恶意代码。
3、DOM型XSS漏洞
DOM型XSS漏洞是基于文档对象模型(Document Object Model)的一种XSS漏洞。
三、反射型XSS
漏洞代码分析:
<?php
if(isset($_GET['name'])){
$name=$_GET['name'];
echo "<h2>"."Hello".$name."<h2>";
}else{
echo "参数错误";
}
输入以下测试语句:
http://127.0.0.2/name.php?name=zhang
会输出Hellozhang,如图3.1所示。
图3.1 输入name=zhang的返回结果
输入以下测试语句:
http://127.0.0.2/name.php?name=<script>alert('xss')</script>
会执行植入的XSS恶意代码,触发弹窗,如图3.2所示。
图 3.2 利用反射型XSS漏洞的效果
分析:某些情况下,用户输入的内容会直接通过浏览器显示,因为浏览器会识别HTML标签和JavaScript代码,因此在没有对用户输入的内容做过滤时,当用户提交的内容存在JavaScript代码时会直接被浏览器识别并执行。
四、存储型XSS
漏洞代码分析:
if(array_key_exists("message",$_POST) $$ $_POST['message'] != null){
$message=escape($link,$_POST['message']);
$query="insert into message(content,time) values ('message',now())";
$result=execute($link,$query);
if(mysqli_affected_rows($link)!=1){
$html.="<p>数据库出现异常,提交失败!</p>";
}
}
上述代码将用户提交的表单内的值以POST形式提交到message数据表中,由于代码没有对提交的内容做限制以及过滤,当用户上传恶意的JavaScript代码时同样会被上传到数据库中,如图4.1所示
图 4.1 上传至数据库的内容
由于恶意代码被Hack上传至服务器,所以当其他用户访问该页面时,恶意代码都会被调用并且由用户的浏览器执行。如图4.2 所示。
图 4.2 普通用户访问时页面
五、DOM型XSS
5.1、简介
DOM是W3C组织推荐的处理可扩展标记语言的标准编程接口,可以使程序和脚本能够动态访问和更新文档内容、结构以及样式。
DOM:通过JavaScript,可以重构整个HTML文档,就是说可以添加,移除等等,对页面的某个东西进行操作时,JavaScript就需要获得对HTML文档中所有元素进行访问的入口,这个入口就是DOM,所以在DOM型的XSS漏洞中,DOM可以看成是一个访问HTML的标准程序接口。
特征:整个过程都是在前端完成的,没有后端的参与(纯前端的操作)。
5.2、漏洞代码分析
<div id="xssd_main">
<script>
function domxss(){
var str=document.getElementByla("text").value;
document.getElementById("dom").innerHTML = "<a href=' " +str+ " '>what do you see?</a>
}
</script>
<input id="text" name="text" type="text" value="" />
<input id="button" type="button" value="click me" onclick="domxss()" />
<div id="dom"></div>
</div>
上述代码var str = document.getElementbyId("text“).value;和<input id ="text" ...../>意思是把我们输入 的东西(字符串)赋值给str,然后document.getElementById("dom").innerHTML = <a href='"str"' ..../>把这个字符串整合到a这个标签中的href(属性) 里在吧a标签写到dom这个标签中,最后<div id="dom"></div>执行这个标签。
5.3、实列
通过构造'><img src="#" οnclick="alert(document.cookie)" >获得cookie。