0x00 前言
学完了基本 SQL 漏洞,也需要进行下一步的学习,继续看着书学习吧,等学完之后就去 BUU 刷一下 Web 题。
0x01 简单的分类
跨站脚本攻击(Cross Site Scripting,为避免与层叠样式表 CSS 混淆,通常简称为 XSS )是一种网站应用程序的安全漏洞,是代码注入漏洞的一种。它使得攻击者可以通过巧妙的方法向网页中注入恶意代码,导致用户浏览器在加载网页、渲染 HTML 文档时就会执行攻击者的恶意代码。
以漏洞成因可分为三类:反射型、存储型、DOM 型。
也可以根据输出点的不同分为三类:
- 输出在 HTML 属性中。
- 输出在 CSS 代码中。
- 输出在 JavaScript 中。
0x02 反射型 XSS
关于反射型:
我觉得这个反射是指当我们进行漏洞的利用的时候,漏洞利用代码马上就会执行,如同反射一般。
关于漏洞的利用:
我们首先假设具有漏洞的网站的 php 代码为:(来自:XSS的原理分析与解剖 - FreeBuf网络安全行业门户)
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>XSS利用输出的环境来构造代码</title>
</head>
<body>
<center>
<h6>把我们输入的字符串 输出到input里的value属性里</h6>
<form action="" method="get">
<h6>请输入你想显现的字符串</h6>
<input type="text" name="xss_input_value" value="输入"><br>
<input type="submit">
</form>
<hr>
<?php
$xss = $_GET['xss_input_value'];
if(isset($xss)){
echo '<input type="text" value="'.$xss.'">';
}else{
echo '<input type="type" value="输出">';
}
?>
</center>
</body>
</html>
页面的显示情况为:
所以我们可以通过注入以下代码来利用其存在的漏洞:
//"><script>alert('xss')</script>
//其中前面的 ' "> ' 使用于将前方的 '<' 闭合,后面的代码可以使得页面出现弹窗,弹窗内写着 xss 。
0x03 存储型 XSS
关于存储型:
其和反射型 XSS 的区别在于所提交的 XSS 代码是否会被存储在服务端,是否可以在将来再次被利用。
关于漏洞利用:
我们以下面的代码为漏洞原型:(来自:《CTF 特训营》)
<html>
<head>
<title>GuestBook v1.0</title><meta charset="utf-8">
</head>
<body>
<form method="post">
昵称:<input type="text" name="nickname"><br>
内容:<textarea name="content"><ltextarea><br>
<input type="submit" name="submit" value="提交留言">
</form>
<hr>
<?php
$conn = mysql_connect("localhost","root","root");
if (!$conn){
die('Could not connect: '. mysql_error());
}
mysql_select_db("guestbook", $conn);
if (isset($_POST['submit]')){
$nickname =$_PoST['nickname";$content= $_POST['content];
mysql_query("INSERT INTO guestbook (nickname, content) VALUES ('$nickname', '$content")");
$result = mysql_query("SELECT * FROM guestbook");
while($row = mysql_fetch_array($result)){
echo $row['nickname'].": ".$row['content'] . '<br>;
}
mysql_close($conn);
?>
</body>
</html>
此时,我们如果在内容处提交了<script>alert('xss')</script>
,那么在我们下一次访问被漏洞利用的用户的时候,会再一次的弹出弹窗。
0x04 DOM 型 XSS
关于 DOM 型:
DOM 型 XSS与反射型 XSS、存储型 XSS 的主要区别在于 DOM 型 XSS 的 XSS 代码不需要服务端解析响应的直接参与,触发 XSS 的是浏览器端的 DOM 解析。
关于漏洞利用:
我们假设具有 DOM 型 XSS 漏洞给的网站代码如下:(来自:《CTF 特训营》)
<html>
<head>
<title>DOM XSS</title>
<meta charset="utf-8">
</head>
<body>
<div id="area"></div>
<script>
document.getElementByld("area").innerHTML = unescape(location.hash);
</script>
</body>
</html>
http://example.com/dom.html#<img src=x οnerrοr=alert(/xss/)>
原因:由于以下三者的共同作用,使得产生了 DOM 型 XSS
unescape
函数:已被废弃,可用于将参数其中的十六进制转义序列将被其表示的字符替换
onerror
:表示当发生错误时
window.location.hash
读取 # 值
#
号:将自动跳转到页面相应的位置处,提交带有#
的 url 时,不会提交#
后的数据,除非转码为%23
;每次该变#
后的值,不会重新加载页面,但会在浏览记录留下新的记录。
总结:
个人感觉就是利用 html
页面本身存在的漏洞问题,而这个漏洞问题可能存在于 js 代码、CSS 代码、HTML代码等。
0X05 输出在 HTML 标签、CSS、JS中
关于注意点:
当输出点在 HTML 代码中时,我们需要注意标签的闭合问题。如
<input name="user" value="{{ your input }}"/>
<!--对于上面的标签,我们需要注意双引号和括号闭合,可以输入:"οnclick="alert(/xxs/),使其变为-->
<input name="user" value="" onclick="alert(/xss/)">
<!--也可以输入:">cscript>alert(/xss/)</script>,使其变为-->
<input name="user" value=""><script>alert(/xss/)</script>">