渗透测试-XSS跨站脚本攻击

概述

跨站脚本(cross site script)为了避免与样式css混淆,所以简称为XSS。

XSS是一种经常出现在web应用中的计算机安全漏洞,也是web中最主流的攻击方式。那么什么是XSS呢?

XSS是指恶意攻击者利用网站没有对用户提交数据进行转义处理或者过滤不足的缺点,进而添加一些代码,嵌入到web页面中去。使别的用户访问都会执行相应的嵌入代码。从而盗取用户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式。

XSS的危害

1、盗取各类用户帐号,如机器登录帐号、用户网银帐号、各类管理员帐号
2、控制企业数据,包括读取、篡改、添加、删除企业敏感数据的能力
3、盗窃企业重要的具有商业价值的资料
4、非法转账
5、强制发送电子邮件
6、网站挂马
7、控制受害者机器向其它网站发起攻击

XSS的起因

主要原因:过于信任客户端提交的数据!

解决办法:不信任任何客户端提交的数据,只要是客户端提交的数据就应该先进行相应的过滤处理然后方可进行下一步的操作。

进一步分析细节:

客户端提交的数据本来就是应用所需要的,但是恶意攻击者利用网站对客户端提交数据的信任,在数据中插入一些符号以及javascript代码,那么这些数据将会成为应用代码中的一部分了。那么攻击者就可以肆无忌惮地展开攻击啦。

因此我们绝不可以信任任何客户端提交的数据!!!

XSS的分类

反射型

新建一个xss.php文件并加入以下代码:

\\XSS反射演示
<form action="" method="get">
    <input type="text" name="xss"/>
    <input type="submit" value="test"/>
</form>
<?php
$xss = @$_GET['xss'];
if($xss!==null){
    echo $xss;
}

这段代码中首先包含一个表单,用于向页面自己发送 GET 请求,带一个名为xss的参数。 然后 PHP 会读取该参数,如果不为空,则直接打印出来,这里不存在任何过滤。也就是说,如果xss中存在 HTML 结构性的内容,打印之后会直接解释为 HTML 元素。

部署好这个文件,访问http://localhost/xss.php,直接输入一个js代码,比如,
渗透测试-XSS跨站脚本攻击
之后点击test:
渗透测试-XSS跨站脚本攻击
我们输入的HTML代码被执行了。用Firebug查看,我们输出的内容直接插入到了页面中,解释为<script>标签。
渗透测试-XSS跨站脚本攻击
反射型 XSS 的数据流向是:浏览器 -> 后端 -> 浏览器。

存储型

把xss.php内容改为(同时数据库中需要配置相应的表):

\\存储XSS演示
<form action="" method="post">
    <input type="text" name="xss"/>
    <input type="submit" value="test"/>
</form>
<?php
$xss=@$_POST['xss'];
mysql_connect("localhost","root","123");
mysql_select_db("xss");
if($xss!==null){
    $sql="insert into temp(id,payload) values('1','$xss')";
    $result=mysql_query($sql);
    echo $result;
}

用户输入的内容还是没有过滤,但是不直接显示在页面中,而是插入到了数据库。

新建show.php,内容为:

mysql_connect("localhost","root","root");
mysql_select_db("xss");
$sql="select payload from temp where id=1";
$result=mysql_query($sql);
while($row=mysql_fetch_array($result)){
   echo $row['payload'];
}

该代码从数据库读取了之前插入的内容,并将其显示出来。

先创建一个数据库xss,创建temp表:
渗透测试-XSS跨站脚本攻击然后访问xss.php,像之前一样输入 HTML 代码。
渗透测试-XSS跨站脚本攻击
点击test,点击之后却发现没有任何动静,但事实上,我们的数据已经插入到了数据库中。
渗透测试-XSS跨站脚本攻击当我们访问show.php查询这个值的时候,代码就会被执行。
渗透测试-XSS跨站脚本攻击存储型 XSS 的执行位置通常不同于输入位置。我们可以看出,存储行 XSS 的数据流向是:

浏览器 -> 后端 -> 数据库 -> 后端 -> 浏览器。