@rg070836rg
2016-11-29T13:07:50.000000Z
字数 3688
阅读 2116
网络安全
Cross Site Script英文缩写:CSS又叫XSS,中文意思:跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行。
XSS的攻击目标是为了盗取客户端的cookie或者其他网站用于识别客户端身份的敏感信息。获取到合法用户的信息后,攻击者甚至可以假冒最终用户与网站进行交互。
XSS攻击是目前所有漏洞中所占比例最大的一类,防不胜防。
XSS的原理也就是往HTML中注入脚本,HTML指定了脚本标记
<script></script>
在没有过滤字符的情况下,只需要保持完整无错的脚本标记,即可触发XSS。
- XSS reflected
- XSS stored
①首先页面如下:
②在文本框中随意输入一个用户名,提交之后就会在页面上显示。
③从URL中可以看出,用户名是通过name参数以GET方式提交的。
http://115.159.87.218/DVWA/vulnerabilities/xss_r/?name=hello#
④这时候,我们尝试往里面输入XSS攻击命令,比如下面这一行,最简单的:
<script> alert("helllo") </script>
并提交,这时候,我们观察url如下:
http://115.159.87.218/DVWA/vulnerabilities/xss_r/?name=%3Cscript%3E+alert%28%22helllo%22%29+%3C%2Fscript%3E
网页效果如下:
⑤这时候,我们通过F12开发者工具查看网页源码,我们发现,服务器给我们返回的是:
⑥可以看到我们所输入的脚本被嵌入到了网页中。
⑦那我们可以通过这个方式,来植入一些恶意脚本,就能够获取到本地的数据了,如:
<script>alert(document.cookie)</script>
网页源码如下:
⑧了cookies,我们可以直接使用这个cookies伪造登录。
⑨当然,这样做没有啥意思,因为有人运行了,我们又看不到,到了这,可以利用javascript代码,将获取到的cookies发送到其他地方,那这样,我们就能利用获取到的cookies伪造登录了。
⑩那攻击者,利用这样的漏洞,就可以获得用户的session,并伪造登录。当然,直接用alert未免太蠢太明显,所以,有一些事件可以被用来写xss攻击,这边不去加以分析。
①乍一看,页面没有什么区别,我们去试一下,原来的代码,是否还能继续使用:
②我们发现,我们的提交url并没有发生变化:
http://115.159.87.218/DVWA/vulnerabilities/xss_r/?name=%3Cscript%3E+alert%28%22helllo%22%29+%3C%2Fscript%3E
但是却没有继续弹出窗口,这时候,我们利用开发者工具查看一下源码,发现:
这一对标签不见了,我们往回倒,查看源码,发现
那这段源码,很明显就是将我们的标签给过滤掉了
③应对方法:我们只要使用大写的就可以绕过:
<Script> alert("helllo") </Script>
其次XSS也并非只能使用JavaScript,通过HTML语句也可以跨站比如
<img onerror="s=createElement('script');body.appendChild(s);s.src='…………';" src="x">
是html中的图片标记,这条语句表示在网页中插入一张图片,“src=x”指定了图片文件的URL,如果图片不存在(这里肯定是不存在了),那么将会弹出错误提示框,从而实现弹框的效果。
①通过查看源码我们发现:
他使用了这样一个函数:
htmlspecialchars($_GET['name']);
②这个函数可以把& (和号)、"(双引号)、'(单引号)、(大于)这些敏感符号都进行转义,所有的跨站语句中基本都离不开这些符号,因而只需要这一个函数就阻止了XSS漏洞。
③那么有没有方法,能够饶过这个函数呢?
绕不过。所谓绕过就是挑程序员忘记正确转码的地方下手。只需要注意,并非htmlspecialchars就万事大吉,不同的地方需要不同的转码。所以所谓绕过htmlspecialchars也可能指那个漏洞点用htmlspecialchars转码压根不正确。
④所以,一般来说,这个函数,足够安全了。
①存储型跨站可以将XSS语句直接写入到数据库中,因而相比反射型跨站的利用价值要更大。存储型XSS,持久化,代码是存储在服务器中的,如在个人信息或发表文章等地方,加入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,用户访问该页面的时候触发代码执行。
②我们首先查看low级别的代码
<?php
if(isset($_POST['btnSign']))
{
$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);
$query = "INSERT INTO guestbook (comment,name) VALUES ('$message','$name');";
$result = mysql_query($query) or die('<pre>' . mysql_error() . '</pre>' );
}
?>
③ 这里提供了$message
和$name
两个变量,分别用于接收用户在Message和Name框中所提交的数据。对这两个变量都通过mysql_real_escape_string()
函数进行了过滤,但是这只能阻止SQL注入漏洞。
④ 可以看出,在low级别下,Name和Message这两个文本框都存在跨站漏洞,但是由于DVWA对name框的长度进行了限制,最多只允许输入10个字符,所以我们这里在Message框输入跨站语句“alert('hi')”,以后任何人只要访问这个留言页面,就可以触发跨站语句,实现弹框。
⑤ 当然,弹框并不是目的,XSS的主要用途之一是盗取cookie,也就是将用户的cookie自动发送操作者的电脑中。方法和反射式差不多,不过会更加容易被触发。
①我们观察源码:
可以看到对变量$message
用htmlspecialchars()函数进行了过滤,这样Message输入框就不存在XSS漏洞了,但是Name框仍有漏洞。
②我们尝试输入之前的漏洞,发现没有起到效果:
③但由于name只限定输入10个字符,所以,漏洞很难利用。
毫无疑问地对$message
和$name
都进行了过滤,这样跨站漏洞也就被彻底阻止了。
2005 年 10 月 4 日,Samy 蠕虫,同类中第一个重大的蠕虫病毒,利用一个在 MySpace.com 的个人资料页面模板的持续的跨站点脚本漏洞进行传播。Samy,也是作者,用漏洞的 JavaScript 攻击代码的第一个副本更新了他的个人资料页面当一个通过身份验证 MySpace 的用户观看 Samy的个人资料,该蠕虫病毒的 payload
使用 XHR,使得用户的网页浏览器发送请求,增加 Samy 为朋友,包括加 Samy 为他英雄,并用恶意代码的副本改变用户的个人资料。当用户访问 Samy 或
者其他受感染用户的个人资料页,他们基本上在打开浏览器时就受到攻击。
从单一访客,然后随着在社交网络上的每一个新的不知情的朋友,Samy 蠕虫感染呈几何级数增长,受感染的用户资料页面超过 1,000,000。MySpace 是被迫关闭其网站,以阻止感染,修复漏洞,并进行清理
①小心并测试,常见的xss攻击方式
②注意敏感的html标签
③对文本输入进行转码替换,能够非常有效的进行防御
xssnow:http://xssnow.com/index.php
很好的一个网站,有很多xss
优点:
①无需自己搭建XSSer环境,利用平台,可以很快部署好。
②有很多预设的代码,也可以自己设计代码
③植入简单
示例:
植入:
访问效果: