XSS攻击的原理和利用以及防范
原理
1.反射型
新建一个xss.php文件并加入以下代码:
[html] view plain copy
1. \\XSS反射演示
2. <form action="" method="get">
3. <input type="text" name="xss"/>
4. <input type="submit" value="test"/>
5. </form>
6. <?php
7. $xss = @$_GET['xss'];
8. if($xss!==null){
9. echo $xss;
10. }
这段代码中首先包含一个表单,用于向页面自己发送 GET 请求,带一个名为xss的参数。 然后 PHP 会读取该参数,如果不为空,则直接打印出来,这里不存在任何过滤。也就是说,如果xss中存在 HTML 结构性的内容,打印之后会直接解释为 HTML 元素。
部署好这个文件,访问localhost/xss.php,直接输入一个js代...
<script>alert('hack')</script>
之后点击test:
我们输入的HTML代码被执行了。用Firebug查看,我们输出的内容直接插入到了页面中,解释为<script>
标签。
反射型 XSS 的数据流向是:浏览器 -> 后端 -> 浏览器。
2.存储型
把xss.php内容改为(同时数据库中需要配置相应的表):
[html] view plain copy
1. \\存储XSS演示
2. <form action="" method="post">
3. <input type="text" name="xss"/>
4. <input type="submit" value="test"/>
5. </form>
6. <?php
7. $xss=@$_POST['xss'];
8. mysql_connect("localhost","root","123");
9. mysql_select_db("xss");
10. if($xss!==null){
11. $sql="insert into temp(id,payload) values('1','$xss')";
12. $result=mysql_query($sql);
13. echo $result;
14. }
用户输入的内容还是没有过滤,但是不直接显示在页面中,而是插入到了数据库。
新建show.php,内容为:
[html] view plain copy
1. mysql_connect("localhost","root","root");
2. mysql_select_db("xss");
3. $sql="select payload from temp where id=1";
4. $result=mysql_query($sql);
5. while($row=mysql_fetch_array($result)){
6. echo $row['payload'];
7. }
该代码从数据库读取了之前插入的内容,并将其显示出来。
先创建一个数据库xss,创建temp表
然后访问xss.php,像之前一样输入 HTML 代码
点击test,点击之后却发现没有任何动静,但事实上,我们的数据已经插入到了数据库中。
当我们访问show.php查询这个值的时候,代码就会被执行。
存储型 XSS 的执行位置通常不同于输入位置。我们可以看出,存储行 XSS 的数据流向是:
浏览器 -> 后端 -> 数据库 -> 后端 -> 浏览器。
3.dom-xss
把xss.php内容改为
[html] view plain copy
- <?php
- error_reporting(0); //禁用错误报告
- $name = $_GET[“name”];
- ?>
- var text = document.getElementById(“text”);
- var print = document.getElementById(“print”);
- print.innerHTML = text.value; // 获取 text的值,并且输出在print内。这里是导致xss的主要原因。
DOM-XSS 的数据流向是:URL–>浏览器
总结: 在易用上,存储型XSS > DOM - XSS > 反射型 XSS。
注:反射型xss和dom-xss都需要在url加入js代码才能够触发。
四、利用
通过 XSS 来获得用户 Cookie 或其他有用信息,利用平台负责接收并保存这些信息。XSS利用平台有很多种如XSS Shell, BeEF, Anehta, CAL9000。这里使用xsser.me、搭建过程可参考这:blog.csdn.net/u011781521/article/de...
进入搭建好的xsser.me平台首页输入用户名与密码进行登录
成功之后会显示主界面,左边是模块列表,右边是项目列表:
我们点击左边“我的项目”旁边的“创建”按钮:
名称和描述可以随便取,不影响使用。输入时候点击“下一步”按钮。之后会出现“配置代码”界面:
点击下一步、就会看到这个项目的一些信息
点击完成。然后我们会在首页看到我们的新项目,点击这个项目:
之后点击项目,进入一个页面再点击右上方的查看代码
就可以看到使用方法:
下面就演示下怎么利用
把注入到反射型 XSS 的演示页面中。
上面的src=”xxxx”是我另外创建的一个项目的地址,把你创建好的那个项目,提供的那个地址放进去,就可以了,虽然这个页面没反应,但是xsser.me那个项目就收到消息了。
如何防范 XSS攻击?
- 防堵跨站漏洞,不要信任用户输入,多正则。这一个层面做好,至少可以堵住超过一半的XSS 攻击。
- Cookie 防盗首先,避免直接在cookie 中泄露用户隐私,例如email、密码等等。
其次,通过使cookie 和系统ip 绑定来降低cookie 泄露后的危险。这样攻击者得到的cookie 没有实际价值,不可能拿来重放。 - 尽量采用POST 而非GET 提交表单
POST 操作不可能绕开javascript 的使用,这会给攻击者增加难度,减少可利用的跨站漏洞。 - 严格检查refer
检查http refer 是否来自预料中的url。这可以阻止第2 类攻击手法发起的http 请求,也能防止大部分第1 类攻击手法,除非正好在特权操作的引用页上种了跨站访问。 - 将单步流程改为多步,在多步流程中引入效验码
多步流程中每一步都产生一个验证码作为hidden 表单元素嵌在中间页面,下一步操
作时这个验证码被提交到服务器,服务器检查这个验证码是否匹配。首先这为第1 类攻击者大大增加了麻烦。其次攻击者必须在多步流程中拿到上一步产生的效验码才有可能发起下一步请求,这在第2 类攻击中是几乎无法做到的。 - 引入用户交互简单的一个看图识数可以堵住几乎所有的非预期特权操作。
- 只在允许anonymous 访问的地方使用动态的javascript。
- 对于用户提交信息的中的img 等link,检查是否有重定向回本站、不是真的图片等可疑操作。
- 内部管理网站的问题很多时候,内部管理网站往往疏于关注安全问题,只是简单的限制访问来源。这种网站往往对XSS 攻击毫无抵抗力,需要多加注意。