1.xss漏洞简介
XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。比 如这些代码包括HTML代码和客户端脚本。攻击者利用XSS漏洞旁路掉访问控制——例如同源策略(same origin policy)。这种类型的漏洞由于被黑客用来编写危害性更大的网络钓鱼(Phishing)攻击而变得广为人知。对于跨站脚本攻击,黑客界共识是:跨站脚本攻击是新型的“缓冲区溢出攻击“,而JavaScript是新型的“ShellCode”。
百度百科的解释: XSS又叫CSS (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的。
它与SQL注入攻击类似,SQL注入攻击中以SQL语句作为用户输入,从而达到查询/修改/删除数据的目的,而在xss攻击中,通过插入恶意脚本,实现对用户游览器的控制,获取用户的一些信息
2.XSS攻击的危害包括
1、盗取各类用户帐号,如机器登录帐号、用户网银帐号、各类管理员帐号
2、控制企业数据,包括读取、篡改、添加、删除企业敏感数据的能力
3、盗窃企业重要的具有商业价值的资料
4、非法转账
5、强制发送电子邮件
6、网站挂马
7、控制受害者机器向其它网站发起攻击
8、对于那些半年没有更新的小企业网站来说,发生XSS漏洞几乎没有什么用
9、但是在各类的社交平台,邮件系统,开源流行的Web应用,BBS,微博等场景中,造成的杀伤力却十分强大。
10、劫持用户cookie是最常见的跨站攻击形式,通过在网页中写入并执行脚本执行文件(多数情况下是JavaScript脚本代码),劫持用户浏览器,将用户当前使用的sessionID信息发送至攻击者控制的网站或服务器中。
11、又可以称为“框架钓鱼”。利用JS脚本的基本功能之一:操作网页中的DOM树结构和内容,在网页中通过JS脚本,生成虚假的页面,欺骗用户执行操作,而用户所有的输入内容都会被发送到攻击者的服务器上。
12、进行基于大量的客户端攻击,如DDOS攻击,结合其它漏洞,如CSRF漏洞,进一步渗透网站
3.xss基本原理
1.攻击者对某含有漏洞的服务器发起XSS攻击(注入JS代码)
2.诱使受害者打开受到攻击的服务器URL(邮件、留言等,此步骤可选项)
3.受害者在Web浏览器中打开URL,恶意脚本执行。
4.xss分类
XSS攻击需要具备两个条件:需要向web页面注入恶意代码;这些恶意代码能够被浏览器成功的执行。
xss攻击可以分成两种类型:
1.非持久型攻击
2.持久型攻击
非持久型xss攻击:顾名思义,非持久型xss攻击是一次性的,仅对当次的页面访问产生影响。非持久型xss攻击要求用户访问一个被攻击者篡改后的链接,用户访问该链接时,被植入的攻击脚本被用户游览器执行,从而达到攻击目的。
持久型xss攻击:持久型xss,会把攻击者的数据存储在服务器端,攻击行为将伴随着攻击数据一直存在。
也可以分成三类:
反射型:经过后端,不经过数据库
存储型:经过后端,经过数据库
DOM:不经过后端,DOM—based XSS漏洞是基于文档对象模型Document Objeet Model,DOM)的一种漏洞,dom - xss是通过url传入参数去控制触发的。
5.xss攻击代码演示
1.反射型xss
新建一个xss.php文件并加入以下代码:
\\XSS反射演示
<form action="" method="post">
<input type="text" name="xss" value=""/>
<input type="submit" value="test"/>
</form>
<?php
$xss = @$_POST['xss'];
if($xss!==null){
echo $xss;
}
?>
这段代码中首先包含一个表单,用于向页面自己发送 POST请求,带一个名为xss的参数。 然后 PHP 会读取该参数,如果不为空,则直接打印出来,这里不存在任何过滤。也就是说,如果xss中存在 HTML 结构性的内容,打印之后会直接解释为 HTML 元素。部署好这个文件,访问http://localhost/xss.php,直接输入一个js代码,比如<script>alert('xss_hack')</script>,
接着点击test出现如下图
反射型 XSS 的数据流向是:前端利用js向后端传输带有(恶意js代码)数据 -> 后端接收数据并做输出处理 -> (恶意js代码数据)在前端被浏览器自动执行。
2.存储型xss
新建一个xss_stored.php文件并加入以下代码
<form name="guestform" method="post">
<table width="550" cellspacing="1" cellpadding="2" border="0">
<tbody>
<tr>
<td width="100">Name *</td>
<td>
<input type="text" maxlength="10" size="30" name="txtName">
</td>
</tr>
<tr>
<td width="100">Message *</td>
<td>
<textarea maxlength="50" rows="3" cols="50" name="mtxMessage"></textarea>
</td>
</tr>
<tr>
<td width="100"> </td>
<td>
<input type="submit" value="Sign Guestbook" name="btnSign">
</td>
</tr>
</tbody>
</table>
</form>
<?php
setcookie("TestCookie",md5("xueh"), time()+3600*24);
$link=mysql_connect('localhost','root','root');
if(!$link)
{
die("连接失败:".mysql_error());
}
//为后续的mysql扩展函数的操作选定一个默认的数据库,它相当于sql命令(use 数据库名)
mysql_select_db('fanke',$link) or die('不能选此数据库:'.mysql_error());
if( isset( $_POST[ 'btnSign' ] ) ) {
// Get input
$message = trim( $_POST[ 'mtxMessage' ] );
$name = trim( $_POST[ 'txtName' ] );
// Sanitize message input
$message = stripslashes( $message );
$message = mysql_real_escape_string( $message );
// Sanitize name input
$name = mysql_real_escape_string( $name );
// Update database
$query = "INSERT INTO user(username,password) VALUES ( '$message','$name' );";
$result = mysql_query( $query ) or die( '<pre>' . mysql_error() . '</pre>' );
//mysql_close();
}
?>
可以看到代码中用户输入的内容没有过滤,而且也被插入了数据库中
新建show_xss.php并加入如下代码
<?php
$link=mysql_connect('localhost','root','root');
if(!$link)
{
die("连接失败:".mysql_error());
}
//为后续的mysql扩展函数的操作选定一个默认的数据库,它相当于sql命令(use 数据库名)
mysql_select_db('fanke',$link) or die('不能选此数据库:'.mysql_error());
$sql="select password from user where username='xss_hack' ";
$result=mysql_query($sql,$link);
while($row=mysql_fetch_array($result)){
echo $row['password'];
}
?>
在上面代码中的最后几行可以看到,插入到数据库中的恶意js代码回显到前端
在stored_xss.php的表单中name插入<script>alert("I am xss");</script>;message插入xss_hack
插入到数据库的恶意代码被后端相关代码输出到前端,且被浏览器自动执行,结果如下
存储型 XSS 的执行的页面位置通常不同于输入页面的位置。我们可以看出,存储行 XSS 的数据流向是:
前端输入(恶意代码)数据到后端 -> 后端相关代码处理将恶意js代码储存在数据库-> 后端相关代码将js恶意代码从数据库取出并输出到前端 -> js恶意代码被浏览器自动执行
简单说数据流向就是:浏览器 -> 后端 -> 数据库 -> 后端 -> 浏览器
3.DOM-XSS型
新建一个dom-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>
DOM-XSS 的数据流向是:利用dom结构构造js恶意代码-->自动被浏览器 执行