数据来源
跨站脚本攻击
1、什么是跨站脚本攻击?
跨站脚本( Cross-site Scripting)攻击,攻击者通过网站注入点注入客户端可执行解析的 payload(脚本代码),当用户访问网页时,恶意 payload自动加载并执行,以达到攻击者目的(窃取 cookie、恶意传播、钓鱼欺骗等)。
为了避免与HTML语言中的CSS相混淆,通常称它为“XSS”。
2、危害?
- 获取用户信息:(如浏览器信息、ip地址、cookie信息等)
- 钓鱼:(利用xss漏洞构造出一个登录框,骗取用户账户密码,提示登录过期,模拟一个网站的登录框,将用户名、密码发送到攻击者服务器)
- 注入木马或广告链接:(有些在主站注入非法网站的链接,对公司的声誉有一定的影响)·
- 后台增删改网站数据等操作:(配合CSR漏洞,骗取用户点击,利用s模拟浏览器发包)
- xss蠕虫(微博蠕虫:只要看过某人的微博就是自动关注某人;贴吧蠕虫:看过某个帖子就是自动回复这个帖子)
跨站脚本攻击漏洞类型及利用场景
反射型XSS
http://testfire.net 这是一个开源的测试网站,攻击这个网站不犯法。
示例-测试网站是否存在反射型xss:
先在输入框输入点东西,随便写如:hello、你好啊,李银河 如下图:
然后加上一些HTML标签,如:h1~h3、p、a等等
<a href="https:www.baidu.com">你好啊,李银河</a>
李银河是谁?我也不知道.
测试到这里我们就可以得出结论,这个网站存在反射型xss,可以被不法分子利用,出现这个漏洞的原因:写这个网站的前端开发人员没有对输入框的输入内容进行过滤,当然一般大型网站是没有这种漏洞的,Altoro Mutua这个网站是外国人专门开发给别学习测试攻击的所以有很多漏洞。
如果你需要在输入框执行JS代码则需要写在 <script>标签内,如:
<script>alert("hello,zhangsan")</script>
alert() 这个函数的效果就是在页面弹窗,完整写法:window.alert() 简写: alert()
或者输入:<img src=1 οnerrοr=alert(1)> # img 是图像标签,src填写的是图片路径这里写1路径肯定是不存在的然后就报错,error 就是捕获报错的事件,on是绑定事件给这个img标签,“=”后面就可以跟我们要执行的JS代码
存储型XSS
这里我就使用DVWA靶场做测试(windows安装,kali安装)
1)把靶场的安全等级调到最低
2)选择XSS存储
<script>alert("hello,zhangsan")</script>
<scr<script>ipt>alert("xss")</script>
刷新网页之后,弹框还是出弹出。
原因:输入框没有严格的筛选就存到了数据库中,网页从数据库拿出数据展示也没有做过滤。
可以查看源码,看看这个网页是如何写的
<?php
if( isset( $_POST[ 'btnSign' ] ) ) {
// Get input
$message = trim( $_POST[ 'mtxMessage' ] );
$name = trim( $_POST[ 'txtName' ] );
// Sanitize message input
$message = stripslashes( $message );
$message = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $message ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
// Sanitize name input
$name = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $name ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
// Update database
$query = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
//mysql_close();
}
?>
trim() # trim()函数主要作用是移除字符串两侧的空白字符或其他预定义字符。
mysql_real_escape_string() # 函数会对字符串中的特殊符号(\x00,\n,\r,\,‘,“,\x1a)进行转义。
stripslashes() # 函数删除字符串中的反斜杠
$query = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );"; # INSERT INTO 是SQL的插入语句,这条代码主要是把$message(我们输入的留言内容)和$name(留言名称)分别插入到数据库的guestbook表的comment和name字段中。对SQL基础语句不了解的可以看这篇:SQL的基本语句用法
可以看到,对输入并没有做XSS方面的过滤与检查,且存储在数据库中,因此这里存在明显的存储型XSS漏洞
可以自行把安全等级调高然后查看源码,看看是如何做防御的(我这就不多讲了,有兴趣的可以看这篇:DVWA(XSS存储型) 我觉得他写的挺详细的)
不同的计算机语言防御方式是不一样的,不过原理都是相通的。
DOM型XSS
DVWA靶场做测试
1)跟之前的一样先把安全等级调到最低
开始测试,原来的下拉列表的DOM结构如下图:(F12可以打开开发者模式,查看网页的结构代码)
检测网站是否存在XSS的DOM漏洞
<script>alert("test")</script>
盗取网站的cookie
<script>alert(document.cookie)</script>
防御的话,可以自行调高安全等级然后查看源码