XSS的知识梳理

XSS

概念:

XSS(Cross Site Scripting)跨站脚本攻击,也是一种注入攻击,当web应用对用户输入过滤不严格,攻击者写入恶意的脚本代码(HTML、JavaScript)到网页中时,如果用户访问了含有恶意代码的页面,恶意脚本就会被浏览器解析执行导致用户被攻击。

常见的危害有:cookie窃取,session劫持,钓鱼攻击,蠕虫,ddos等。

web应用漏洞产生大多出现在对用户输入的考虑不周全,给了攻击者可乘之机,从经典的反射型xss讲起:

反射型XSS:

这里给一个最简单的反射型xss源码:

前端:

<html>
<head lang="en">
        <meta charset="UTF-8">        
        <title>反射型XSS</title> </head>
<body>
        <form
        action="action.php" method="post">  <!-- <form>表示文档的服务器区域,此区域中包含 一个Web站点的信息控件,用于向Web服务器区域提交 -->
                <input type="text" name="name" />
                <input type="submit" value="提交">
       </form>
</body>
</html>

//后端: action.php:

<?
php $name=$_POST["name"];
echo $name;
?>

当你部署好后,应该是这样的:(也没有必要部署,学习原理即可)

在输入框内提交常规的xss数据:弹窗

可以看到,我们插入的语句已经被页面给执行了。

这就是最基本的 反射型的 XSS 漏洞 ,这种漏洞数据流向是: 前端–>后端–>前端

漏洞逻辑是:

提交窗口引用了action.php函数,post方法传参

action="action.php" method="post">  <!-- <form>表示文档的服务器区域,此区域中包含 一个Web站点的信息控件,用于向Web服务器区域提交 -->
<input type="text" name="name" />
<input type="submit" value="提交">

action.php的内容:

<?
php $name=$_POST["name"];
echo $name;
?>

 通过Post方法输入name的值,回显name属性的内容

由分析可知:

数据流向为从前端到后端再到前端

存储型XSS:

前端代码:2.html

<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>存储型XSS</title>
</head>
<body>
    <form action="action2.php" method="post">
        输入你的ID:  <input type="text" name="id" /> <br/>
        输入你的Name:<input type="text" name="name" /> <br/>
        <input type="submit" value="提交">
    </form>
</body>
</html>

后端代码: action2.php:

<?
php
    $id=$POST["id"];
    $name=$POST["name"];
	mysql_connect("localhost","root","root");
	mysql_select_db("test");

	$sql="insert into xss value ($id,'$name')";
	$result=mysql_query($sql);
?>

/供其他用户访问页面:show2.php

<?
php
	mysql_connect("localhost","root","root");
	mysql_select_db("test");
	$sql="select * from xss where id=1";
	$result=mysql_query($sql);
	while($row=mysql_fetch_array($result)){
		echo $row['name'];
	}
?>

用户提交界面

我们看看数据库:这里可以看到我们提交的数据已经插入到数据库中了

细心的你想必发现了储存型xss与反射型xss的注入语句不同!

反射型:<script>alert('hack')</script>

储存型:<script>alert(\'hack\')</script>

原因是:

这里的 hack 的单引号要通过\进行转义,因为 sql 语句中的 $name 是单引号的,所以这里不转义的话就会闭合 sql 语句中的单引号。不然注入不进去。

这里的代码逻辑是:

在前端的提交窗口传入id 和name两个值,后端数据库会把两个值存入数据库中

供其他用户访问页面:show2.php的功能则是将数据库中的内容显示出来,XSS 代码就被执行了。

存储型 XSS 的数据流向是:前端–>后端–>数据库–>后端–>前端

DOM型:

如下图,我们在 URL 中传入参数的值,然后客户端页面通过 js 脚本利用 DOM 的方法获得 URL 中参数的值,再通过 DOM 方法赋值给选择列表,该过程没有经过后端,完全是在前端完成的。

所以,我们就可以在我们输入的参数上做手脚了。

典型漏洞点 doucument.write()

 代码逻辑可见是纯前端导致的,我们能直接传入值写入到前端代码中,所以造成的xss有的可以是一次性的有的可以像长久的储存型一样是可长久利用的。

关于dom型xss:

DOM型XSS - FreeBuf网络安全行业门户

看到这里,其实我想讲的就差不多了,我是笔记党,过往是不喜写博客或者文章的。写下这篇的目的,一是要为之后的就业做准备梳理所学知识,二是这样的极其基础的知识恰是初学者所需要的,我希望引导初学者积极思考,具有探究精神,多想想为什么会产生这样的漏洞。

很推荐大家写笔记。靠背来学习是反人类的,多理解,多思考,做笔记可以让你多一个储存知识的外脑。

xss具体攻击:

反射型xss

1.Alice 经常浏览某个网站,此网站为 Bob 所拥有。Bob 的站点需要 Alice 使用用户名/密码进行登录,并存储了 Alice 敏感信息(比如银行帐户信息)。 2.Tom 发现 Bob 的站点存在反射性的 XSS 漏洞。 3.Tom 利用 Bob 网站的反射型 XSS 漏洞编写了一个exp,做成链接的形式,并利用各种手段诱使 Alice 点击。 4.Alice 在登录到 Bob 的站点后,浏览了 Tom 提供的恶意链接。 5.嵌入到恶意链接中的恶意脚本在 Alice 的浏览器中执行。此脚本 盗窃敏感信息 (cookie、帐号信息等信息)。然后在 Alice 完全不知情的情况下将这些信息发送给 Tom。 6.Tom 利用获取到的 cookie 就可以以 Alice 的身份登录 Bob 的站点,如果脚本的功更强大的话,Tom 还可以对 Alice 的浏览器做控制并进一步利用漏洞控制。

储存型xss

1.Bob 拥有一个 Web 站点,该站点允许用户发布信息/浏览已发布的信息。 2.Tom 检测到 Bob 的站点存在存储型的 XSS 漏洞。 3.Tom 在 Bob 的网站上发布一个带有恶意脚本的热点信息,该热点信息存储在了 Bob 的服务器的数据库中,然后吸引其它用户来阅读该热点信息。 4.Bob 或者是任何的其他人如 Alice 浏览该信息之后,Tom 的恶意脚本就会执行。 5.Tom的恶意脚本执行后,Tom就可以对浏览器该页面的用户发动一起 XSS 攻击。

从以上我们可以知道,存储型的XSS危害大。因为他存储在服务器端,所以不需要我们和被攻击者有任何接触,只要被攻击者访问了该页面就会遭受攻击。而反射型和DOM型的XSS则需要我们去诱使用户点击我们构造的恶意的URL,需要我们和用户有直接或者间接的接触,比如利用社会工程学或者利用在其他网页挂马的方式。

那么,利用XSS漏洞可以干什么呢?

XSS 的防御:

XSS防御的总体思路是:对 用户的输入(和URL参数) 进行 过滤 ,对 输出 进行 html编码。也就是对用户提交的所有内容进行过滤,对url中的参数进行过滤;然后对动态输出到页面的内容进行 html 编码,转换为 html 实体,使脚本无法在浏览器中执行。 1.对输入的内容进行过滤,可以分为黑名单过滤和白名单过滤。黑名单过滤虽然可以拦截大部分的 XSS 攻击,但是还是存在被绕过的风险。白名单过滤虽然可以基本杜绝 XSS 攻击,但是真实环境中一般是不能进行如此严格的白名单过滤的。

2.对输出进行 html 编码,就是通过函数,将用户的输入的数据进行 html 编码,使其不能作为脚本运行。 如下,是使用 php 中的 htmlspecialchars 函数对用户输入的 name 参数进行 html 编码,将其转换为 html 实体:

 #使用htmlspecialchars函数对用户输入的name参数进行html编码,将其转换为html实体
 $name = htmlspecialchars( $_GET[ 'name' ] );

如图  进行了 html 编码的。经过 html 编码后 script 标签被当成了 html 实体。

我们还可以服务端设置会话 Cookie 的 HTTP Only 属性,这样,客户端的 JS 脚本就不能获取Cookie 信息。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值