目录
XSS简介
XSS原理及分类
反射型XSS
存储型XSS
基于DOM的XSS
XSSer的使用
至少有一个的参数:
可选的参数:
检查选项
选择攻击向量
绕过防火墙选项
绕过器选项
特殊技术
最后注入选项
特殊最后注入选项
报告导出
XSSer演示
BeEF-XSS
漏洞的防范
总结
XSS是跨站脚本攻击(Cross Site Scripting)的简写,为了不与层叠样式表混淆而改写的。此漏洞也是网站存在相当多的漏洞,仅次于SQL注入,攻击者可以使用XSS来绕过访问控制,如同源策略。利用XSS可以窃取账号,网页挂马,发动拒绝服务攻击,发送垃圾邮件等等。
XSS形成的原因与SQL注入类似,也是由于程序员在开发过程中没有对用户提交的恶意数据做过滤,转义而直接输出到页面,导致用户可以利用此漏洞执行JavaScript,HTML等代码,和SQL注入不同的是XSS不一定要和数据库交互。XSS没有单一的、标准的分类,一般可以分为非持久型(反射型)、持久型(存储型)。通常人们也增加了第三种——基于DOM的XSS。反射型XSS指用户提交的数据没有存储在数据库中而是直接输出到页面,不具有存储性,一次提交只能执行一次。存储型XSS指用户提交的数据存储在了数据库,用户每一次访问都会触发XSS,一次提交可以一直执行,其危害是XSS中最大的。基于DOM的XSS指用户可以修改浏览器中的DOM节点并显示在浏览器上,从而产生XSS。XSS的分类并不那么重要,如果非要死磕到底,这里有一篇个人觉得很不错的博客那些年我们看不懂的XSS,看不懂没关系,以后再看。
使用DVWA来学习XSS的利用方法,登录DVWA,设置安全等级为low,然后先来学习一下反射型XSS的利用方法,点击XSS(Reflected),如图,输入什么就会显示Hello+输入的内容:
点击View Source查看源代码,如图:
可见,源码中没有对用户提交的数据做任何处理,只是简单判断如果提交的数据是否存在且不为空,就输出Hello+提交的内容,利用此漏洞提交一个JavaScript弹窗代码:,和SQL注入类似,可以通过表单提交,也可以通过URL提交,不过通过URL提交有时需要进行url编码,如图通过表单提交的结果:
构造获取cookie的JavaScript代码:,如图:
构造页面跳转JavaScript代码:,提交即可自动跳转,如图:
假设这台主机同时也是攻击者的远程主机,在wamp64目录下的www目录下创建文件夹test,在test下新建cookie.php,写入如图所示代码:
此时,构造获取cookie并发送到远程主机的JavaScript代码:,提交之后就会获取cookie并发送到远程主机,以GET方式传递给变量cookie,远程主机就会执行上图代码,创建一个cookie.txt的文件,并写入cookie,如图:
提交之后会把cookie提交到远程主机,打开test目录会发现多了一个cookie.txt文件,打开可以看到获取到的cookie。
然后设置安全等级为medium,然后同刚才一样,我们查看一下代码:
可以看到代码只是将输入的字符串使用str_replace函数中进行过滤,该函数将“,也可以使用其他标签,如,提交之后如图:
也可以使用javascript中的编码还原函数进行绕过:,提交之后如图:
然后设置安全等级为High,然后查看一下代码:
发现使用preg_replace函数对输入进行的过滤,且使用正则表达式匹配了所有的,你会发现只要访问刚才的页面就会直接跳转到百度首页,如果把百度的网址改成挂有木马的网址、钓鱼网站可以对用户造成不小的影响,如果结合metasploit,利用浏览器漏洞如MS14_064等,可以直接对用户的计算机远程控制。
插入JavaScript键盘记录代码:
可以记录用户的按键信息并发送到指定url。
设置安全等级为medium,查看代码:
发现过滤了name中的,替换url中default的值,提交后如图:
使用payload:,同样可以获取到cookie值,如图:
设置安全等级为Medium,查看源代码:
发现服务器端对参数default的值进行了过滤,且不区分大小写,查看网页源代码发现前端并没有对传入的参数进行过滤处理,因此可以在payload前加“#”,从而使其不发送到服务器端,只发送到浏览器,同样也可以使用img标签代替script标签执行JavaScript脚本:
设置安全等级为High,查看源代码发现服务端使用了白名单,但是仍然可以使用“#”进行绕过,方法同上。
XSSer是一个自动化的XSS漏洞检测和利用工具,支持控制台和图形界面,功能非常强大,Kali Linux中以及内置有该工具,因此可以直接使用。XSSer常用的参数如下:
-u, --url 目标URL
-i,READFILE url文件(批量检测url)
-d,DORK 利用搜索引擎搜索URL(如搜索包含“search.php?id=”的url使用“-d "search.php?id="”)
--De=DORK_ENGINE 指定搜索引擎(如google等,支持的搜索引擎较少,需配合-d参数一起使用)
--Da 使用XSSer提供的所有搜索引擎(需配合-d参数一起使用)
-s,--statistics 显示高级输出结果(包含HTTP状态码,payload是否执行等信息)
-v,--verbose 激活冗余模式输出结果(显示详细信息,包含HTTP请求头、响应头和payload执行情况等信息)
--gtk 以图像界面启动
--imx=IMX 使用xss插入图像(如--imx image.png)
--fla=FLASH 用XSS插入Flash视频(--fla movie.swf)
--xst=XST 跨站点跟踪(如--xst http(s)://host.com)
-g,GETDATA 使用GET请求发送payload(如-g /search.php?id=)
-p,POSTDATA 使用POST请求发送payload(如-p "name=a&pass=b")
-c,CRAWLING 目标上要爬行的URL数:1-99999
--Cw=CRAWLER_WIDTH 爬行深度:1-5
--Cl 仅对本地目标URL进行爬网(默认为true)
--cookie=COOKIE 修改HTTP请求头中的Cookie
--drop-cookie 忽略响应头中的Set-Cookie
--user-agent=AGENT 修改HTTP请求头中的User-Agent(默认为SPOOFED)
--referer=REFERER 使用其他的HTTP referer(默认为NONE)
--xforw 设置X-Forwarded-For为随机IP
--xclient 设置X-Client-IP为随机IP
--headers=HEADERS 添加额外的Headers,使用换行符分割
--auth-type=ATYPE 设置HTTP身份验证类型(如Basic, Digest, GSS or NTLM)
--auth-cred=ACRED HTTP身份验证凭据(如name:password)
--proxy=PROXY 设置代理服务器
--ignore-proxy 忽略系统默认的HTTP代理
--timeout=TIMEOUT 设置响应超时时间
--retries=RETRIES 连接超时时重试(默认为1)
--threads=THREADS 线程数(默认为5)
--delay=DELAY 每个HTTP请求之间的延迟,单位为秒(默认为0)
--heuristic 检查过滤的字符
--checkaturl=ALT 检查备用的url,使用Blind XSS
--checkatdata=ALD 检查备用的payload
--reverse-check 建立从目标到XSSER的反向连接,以证明100%易受攻击(推荐!)
--payload=SCRIPT 使用自定义的XSS payload
--auto 使用XSSer提供的攻击向量
--Phpids0.6.5 PHPIDS (0.6.5) [ALL]
--Phpids0.7 PHPIDS (0.7) [ALL]
--Imperva Imperva Incapsula [ALL]
--Webknight WebKnight (4.1) [Chrome]
--F5bigip F5 Big IP [Chrome + FF + Opera]
--Barracuda Barracuda WAF [ALL]
--Modsec Mod-Security [ALL]
--Quickdefense QuickDefense [Chrome]
--Str 使用String.FromCharCode()进行绕过(即Unicode编码绕过)
--Une 使用Unescape()进行绕过(即URL编码绕过)
--Mix 使用Unicode编码和URL编码绕过
--Dec 使用十进制编码绕过
--Hex 使用十六进制编码绕过
--Hes 使用带分号的十六进制编码绕过
--Dwo 使用DWORD(双字)编码IP地址
--Doo 使用八进制编码IP地址
--Cem=CEM 使用多种编码方式结合(如Mix,Une,Str,Hex)
--Coo 跨站脚本Cookie注入
--Xsa 跨站脚本Agent注入
--Xsr 跨站点引用脚本
--Dcp 数据控制协议注入
--Dom DOM型注入
--Ind HTTP响应拆分诱导代码
--Anchor 使用Anchor隐身payload(DOM 影子)
--Fp=FINALPAYLOAD 利用自己的代码
--Fr=FINALREMOTE 利用远程脚本
--Doss XSS服务的拒绝服务
--Dos XSS客户端拒绝服务
--B64 使用Base64编码标签
--Onm 使用onMouseMove()事件(即鼠标移动出发payload)
--Ifr 使用iframe标签自动加载
--save 导出为文本文档,在/usr/share/xsser/XSSreport.raw
--xml=FILEXML 导出为xml文件(如report.xml)
接下来使用XSSer对dvwa进行测试,在测试中我遇到了问题:在Kali 2019.2版本中使用系统自带的xsser 1.7b怎么都测不出来,因此我卸载了xsser1.7vb安装了xsser 1.6版本,1.6版本使用的beautifulsoup模块而1.7版本使用的是beautifulsoup4模块,因此需要安装beautifulsoup模块(pip install beautifulsoup)。
以反射型XSS为例,查看cookie信息,如图:
将名称和值记录下来,使用XSSer检测是否存在XSS漏洞(xsser -u "http://192.168.88.131/dvwa/vulnerabilities/xss_r/?name=" --cookie "security=low;PHPSESSID=1gcpm1407sbsngpu1g41dsj4u1" -v):
以存储型XSS为例,测试(xsser -u "http://192.168.88.131/dvwa/vulnerabilities/xss_s/" --cookie "security=low;PHPSESSID=1gcpm1407sbsngpu1g41dsj4u1" -p "btnSign=Sign+Guestbook&mtxMessage=b&txtName="),结果没测出来,尝试别的选项也无法测试出来,我改变我的看法了,XSSer也就是个一般脚本,还不如手工测试方便,误报太高了,原理很容易理解:提交payload,然后分析返回的html页面是否存在payload,我们自己也可以写一个。
BeEF-XSS可以说是最强大的XSS漏洞利用工具,可以收集浏览器信息、键盘记录、社会工程等,还可以结合Metasploit进行攻击。要做到这些只需在受害者的网页中插入即可,总之就是需要受害者客户端加载该js文件。
在终端输入beef-xss就可以启动该程序,初次使用会提示你设置密码,如果需要和metasploit配合使用的话,需要修改BeEF的配置文件,将/usr/share/beef-xss/config.yaml打开,搜索metasploit,将enable: false改为enable: true,然后将/usr/share/beef-xss/extensions/demos/config.yaml打开,将enable: false改为enable: true即可。
启动beef-xss后会自动打开登录界面,用户名为beef,密码为你设置的密码,登录之后如图:
左侧会显示受害者主机,中间部分是入门使用方法。日志会记录受害者的操作,如鼠标移动,键盘按键信息等,已DVWA中的反射型XSS为例,提交:
可以在beef-xss控制面板看到左侧显示了受害者浏览器、IP地址、操作系统等信息:
接着在受害者端输入框输入aaaaa,不提交,如图:
在BeEF控制面板当前浏览器选项下边的日志中可以看到:
在命令选项里,左侧有各种命令,各按钮的颜色代表的含义在入门选项里,选择播放声音命令,设置声音文件路径,点击执行,然后受害者就可以听到声音了,如图:
检测弹出窗口阻止程序,双击模块结果,可以在右侧看到命令执行结果,如图:
功能非常多,此外在社会工程学模块有很多有意思的东西,可以自行尝试。这里有篇博客写的也不错http://www.vuln.cn/6966
和SQL注入一样,XSS漏洞也是注入型漏洞,不能相信用户的输入,对用户的输入进行过滤,将用户的输入使用escapeHTML()进行转义,只要过滤的够严格就不怕有XSS。
本文讲解了XSS 漏洞形成的原因、测试该漏洞的方法、一些简单的利用方法以及XSSer和BeEF-XSS的使用方法,且仅讲解了常见的有回显的XSS,对于禁用了弹框、无回显的XSS需要查看网页源代码中是否含有我们插入的payload来进行判断。本文讲解的内容较为基础,若要深入学习,推荐阅读《XSS跨站脚本攻击剖析与防御》。