写在前面 虽然今天是周末,但职位每日推荐不可少,万一有努力找工作的小伙伴因为我一天偷懒导致没找到满意工作那就是我的罪过了,今日职位已放置在文章末尾,请注意查看! 引言 XSS是目前最普遍的Web应用安全漏洞,它带来的危害是巨大的,是Web安全的头号大敌。 关键词:跨站脚本(JavaScript、Java、VBScript、ActiveX、Flash或者HTML)注入执行1。什么是XSS漏洞? XSS攻击:跨站脚本攻击(CrossSiteScripting),为不和前端层叠样式表(CascadingStyleSheets)CSS混淆,故将跨站脚本攻击缩写为XSS。 XSS(跨站脚本攻击)是指恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。类似于sql注入。是目前最普遍的Web应用安全漏洞,也是Web攻击中最常见的攻击方式之一。 XSS(跨站脚本攻击)攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java、VBScript、ActiveX、Flash或者甚至是普通的HTML。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。2。XSS漏洞攻击原理及攻击手段 HTML是一种超文本标记语言,通过将一些字符特殊地对待来区别文本和标记,例如,小于符号()被看作是HTML标签的开始,之间的字符是页面的标题等等。 当动态页面中插入的内容含有这些特殊字符(如)时,用户浏览器会将其误认为是插入了HTML标签,当这些HTML标签引入了一段JavaScript脚本时,这些脚本程序就将会在用户浏览器中执行。所以,当这些特殊字符不能被动态页面检查或检查出现失误时,就将会产生XSS漏洞。 常用的XSS攻击手段和目的有: 1、盗用cookie,获取敏感信息。 2、利用植入Flash,通过crossdomain权限设置进一步获取更高权限;或者利用Java等得到类似的操作。 3、利用iframe、frame、XMLHttpRequest或上述Flash等方式,以(被攻击)用户的身份执行一些管理动作,或执行一些一般的如发微博、加好友、发私信等操作。 4、利用可被攻击的域受到其他域信任的特点,以受信任来源的身份请求一些平时不允许的操作,如进行不当的投票活动。 5、在访问量极大的一些页面上的XSS可以攻击一些小型网站,实现DDoS攻击的效果。 最简单的XSS示例:inputtypebuttonvalue评论input3。XSS分类如下: 分类 主要特点 存储型XSS 经过后端服务处理,数据存储在数据库端 反射型XSS 经过后端服务处理,不存储数据库 DOM型XSS 不经过后端服务处理,不存储数据库 4。XSS漏洞分析 4。1存储型XSS 通过网页注入的代码最终会存储在数据库或其他物理文件中,在某个页面中注入的代码会被浏览器成功执行,该类型的漏洞存在持久性的特点。 主要特点:存储持久性 图解成因分析: 4。2反射型XSS 一般是通过url的形式注入代码,注入的代码不在服务器端存储,但会在服务器端进行处理然后进行回显,在回显时浏览器会触发漏洞执行注入代码,该类型攻击具有临时性特点。 主要特点:回显临时性 图解成因分析 4。3DOM型XSS 也是通过url的形式注入代码,注入的代码服务器端程序不存储、不处理,而是由浏览器进行处理,该类型攻击也具有临时性特点。主要特点:不存储、不处理浏览器临时性 图解成因分析 5。三种XSS漏洞对比 分类 一般表现形式 特点 存储型XSS 表现为包含表单的页面,post提交后数据存储在数据库,通过其他页面访问触发 存储、持久性 反射型XSS 表现为包含参数的url地址,参数经后端程序程序处理后回显,通过访问url触发 url参数、后端处理参数、临时性 DOM型XSS 表现为包含参数的url地址,参数由页面中的JS代码处理,通过访问url触发 url参数、JS处理参数、临时性 6。植入JS代码攻击及危害分析 外在表现形式:直接注入JavaScript代码引用外部JS文件 基本实现原理:通过img标签的src发送数据构造表单诱导用户输入账密构造隐藏的form表单自动提交页面强制跳转植入文字链接、图片链接 潜在危害:获取管理员或者其他用户Cookie,冒充用户身份登录构造表单诱导用户输入账号、密码,获取账密跳转到其他网站,网站流量被窃取植入广告、外链等通过隐藏友链提升其他网站百度权重(SEO黑帽) 7。植入HTML代码攻击及危害分析 外在表现形式:构造img标签构造a标签构造iframe构造其他HTML标签 基本实现原理:通过img标签的src发送数据通过img的onerror触发脚本代码通过a标签被动触发脚本代码hrefonclick通过iframe引入第三方页面直接构造文字链接或图片链接style属性嵌入脚本代码backgroundimage:url(javascript:);(浏览器已可防范) 潜在危害:获取管理员或者其他用户Cookie,冒充用户身份登录构造表单诱导用户输入账号、密码,获取账密植入广告、外链等通过隐藏友链提升其他网站百度权重(SEO黑帽) 8。XSS简单预防策略 8。1对html标签进行字符替换:replaceAll(script,);。。。prepdatatrack111spanstyleletterspacing:1px;存在问题:spanblockquoteclasspgcblockquoteabstractp大小写问题blockquotepdatatrack113spanstyleletterspacing:1px;优化升级:spanblockquoteclasspgcblockquoteabstractp正则表达式blockquotepdatatrack115spanstyleletterspacing:1px;存在问题:spanblockquoteclasspgcblockquoteabstractp反替换scrscriptiptscriptblockquotepdatatrack117spanstyleletterspacing:1px;strong8。2对html字符转义或是半角转全角字符:strongspanprecode{,,} 转义: {,,}) 全角: {,,}codeprepdatatrack119spanstyleletterspacing:1px;strong新场景:strongspanblockquoteclasspgcblockquoteabstractp页面中需要根据某个参数生成文字链接blockquotepdatatrack121spanstyleletterspacing:1px;strong存在问题:strongspanblockquoteclasspgcblockquoteabstractpa标签的href属性javascript:blockquotepdatatrack123spanstyleletterspacing:1px;strong其他问题:strongspanblockquoteclasspgcblockquoteabstractp针对json字符串的场景pdatatrack205如何公用的问题blockquotepdatatrack126 h1classpgcharrowrightdatatrack1279。XSS漏洞预防策略最佳实践h1pdatatrack128spanstyleletterspacing:1px;strong9。1输入环节strongspanullidatatrack129emspanstyleletterspacing:1px;spanstylecolor:0052FF;ttdarkmodecolor:005CFF;页面限制输入长度、特殊字符限制,后端代码限制输入长度、处理特殊字符spanspanemlilidatatrack130emspanstyleletterspacing:1px;spanstylecolor:0052FF;ttdarkmodecolor:005CFF;Filter过滤器统一处理(自定义处理规则、使用ApacheText、使用OwaspAntiSamy)spanspanemliulpdatatrack131spanstyleletterspacing:1px;strong9。2Cookie防护strongspanullidatatrack132emspanstyleletterspacing:1px;spanstylecolor:0052FF;ttdarkmodecolor:005CFF;cookie设置httponly,一般servlet容器默认httponly为truespanspanemlilidatatrack133emspanstyleletterspacing:1px;spanstylecolor:0052FF;ttdarkmodecolor:005CFF;resp。setHeader(SETCOOKIE,JSESSIONIDrequest。getSession()。getId();HttpOnly);spanspanemliulpdatatrack134spanstyleletterspacing:1px;strong9。3XFrameOptions响应头(是否允许frame、iframe等标记)strongspanullidatatrack135emspanstyleletterspacing:1px;spanstylecolor:0052FF;ttdarkmodecolor:005CFF;DENY不允许、SAMEORIGIN可在相同域名页面的frame中展示、ALLOWFROMuri可在指定页的frame中展示spanspanemlilidatatrack136emspanstyleletterspacing:1px;spanstylecolor:0052FF;ttdarkmodecolor:005CFF;addheaderXFrameOptionsSAMEORIGIN;在nginx的http或server节点中配置即可spanspanemlilidatatrack137emspanstyleletterspacing:1px;spanstylecolor:0052FF;ttdarkmodecolor:005CFF;也可通过Filter设置resp。setHeader(xframeoptions,SAMEORIGIN);spanspanemliulpdatatrack138spanstyleletterspacing:1px;strong9。4输出环节strongspanullidatatrack139emspanstyleletterspacing:1px;spanstylecolor:0052FF;ttdarkmodecolor:005CFF;OWASPESAPIforJavaspanspanemlilidatatrack140emspanstyleletterspacing:1px;spanstylecolor:0052FF;ttdarkmodecolor:005CFF;显示时对字符进行转义处理,各种模板都有相关语法,注意标签的正确使用spanspanemlilidatatrack141spanstyleletterspacing:1px;示例如下:spanliulpdatatrack142spanstyleletterspacing:1px;strongthymeleafstrongspanprecodespanth:utext{result}spanspanth:text{result}span !utext与text区别codeprepdatatrack144spanstyleletterspacing:1px;strongJSPstrongspanprecodec:outvalue{content}escapeXmlfalsec:outvalue{content}!escapeXml默认truecodeprepdatatrack146spanstyleletterspacing:1px;strong9。5DOM型XSSstrongspanullidatatrack147emspanstyleletterspacing:1px;spanstylecolor:0052FF;ttdarkmodecolor:005CFF;避免。innerHTML、。outerHTML、document。write()的使用,应使用。textContent、。setAttribute()等。spanspanemlilidatatrack148emspanstyleletterspacing:1px;spanstylecolor:0052FF;ttdarkmodecolor:005CFF;VueReact技术栈,避免使用vhtmldangerouslySetInnerHTMLspanspanemlilidatatrack149emspanstyleletterspacing:1px;spanstylecolor:0052FF;ttdarkmodecolor:005CFF;尤其注意onclick、onerror、onload、onmouseover、eval()、setTimeout()、setInterval()以及a标签的hrefspanspanemlilidatatrack150emspanstyleletterspacing:1px;spanstylecolor:0052FF;ttdarkmodecolor:005CFF;可使用OWASPesapi4js:esapi。jsspanspanemliulpdatatrack151 h1classpgcharrowrightdatatrack15210。后端服务编码实践h1pdatatrack153spanstyleletterspacing:1px;通过https:start。spring。io快速创建springboot应用:spanimgsrcc2021imgdataimg。jpgdatasrcimgq01。71396。comcbmi7f1c68fe6f2f31bb。jpgimgwidth1080imgheight808imagetype1mimetypeimagepngweburitoscniqvj2lq49k021ec060f0bf243bbbc0a8b083d354b44pclasspgcimgcaptionimgsrcc2021imgdataimg。jpgdatasrcimgq01。71396。comcbmi796f946275fcae67。jpgimgwidth1080imgheight590imagetype1mimetypeimagepngweburitoscniqvj2lq49k0c99c351f7c5e4d9b8bd8beae97f3ca1epclasspgcimgcaptionpdatatrack154spanstyleletterspacing:1px;解压并在IDEA导入刚刚创建的xssdemo项目spanimgsrcc2021imgdataimg。jpgdatasrcimgq01。71396。comcbmiaf6df5507fb77223。jpgimgwidth1080imgheight681imagetype1mimetypeimagepngweburitoscniqvj2lq49k0aefa413a39c74ab3835a49106af30cccpclasspgcimgcaptionpdatatrack155spanstyleletterspacing:1px;在pom。xml添加相关依赖:spanprecode!防止XSS攻击的antiSamy dependency groupIdorg。owasp。antisamygroupId antisamyartifactId version1。5。7version dependency !fastjson依赖 dependency groupIdcom。alibabagroupId fastjsonartifactId version1。2。62version dependencycodeprepdatatrack157spanstyleletterspacing:1px;修改xssdemo工程包结构如下:spanimgsrcc2021imgdataimg。jpgdatasrcimgq01。71396。comcbmi931a31ec2b38afad。jpgimgwidth1080imgheight524imagetype1mimetypeimagepngweburitoscniqvj2lq49k0ac84b648c49e4f0a84a07ec2a9c589aapclasspgcimgcaptionpdatatrack158spanstyleletterspacing:1px;XSSFilter编码如下:spanprecode program:xssdemo author:Mr。Zhang create:2021022115:45 publicclassXssFilterimplementsFilter{ Override publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{ HttpServletRequesthttpServletRequest(HttpServletRequest)request; HttpServletRequestreq(HttpServletRequest)request; Stringpathreq。getServletPath(); 注解配置的是urlPatterns(过滤所有请求),所以这里对不需要过滤的静态资源url,作忽略处理(大家可以依照具体需求配置) String〔〕exclusionsUrls{。js,。gif,。jpg,。png,。css,。ico}; for(Stringstr:exclusionsUrls){ if(path。contains(str)){ chain。doFilter(request,response); return; } } chain。doFilter(newXssRequestWrapper(httpServletRequest),response); } }codeprepdatatrack160spanstyleletterspacing:1px;XssRequestWrapper包装类编码如下:spanprecode program:xssdemo author:Mr。Zhang create:2021022115:46 Slf4j publicclassXssRequestWrapperextendsHttpServletRequestWrapper{ publicXssRequestWrapper(HttpServletRequestrequest){ super(request); } 获取策略文件,直接使用jar中自带的ebay策略文件 privatestaticInputStreaminputStreamXssRequestWrapper。class。getClassLoader() 。getResourceAsStream(antisamyebay。xml); privatestaticPolicypolicynull; static{ try{ 使用静态代码块处理策略对象的创建 policyPolicy。getInstance(inputStream); }catch(PolicyExceptione){ e。printStackTrace(); } } 使用AntiSamy进行过滤数据 paramhtml return privateStringxssClean(Stringhtml){ StringcleanHTML; try{ AntiSamyantiSamynewAntiSamy(); CleanResultsscanantiSamy。scan(html,policy); cleanHTMLscan。getCleanHTML(); }catch(ScanExceptione){ e。printStackTrace(); }catch(PolicyExceptione){ e。printStackTrace(); } returncleanHTML; } 重写处理请求参数的方法 paramname return Override publicString〔〕getParameterValues(Stringname){ String〔〕valuessuper。getParameterValues(name); 判断参数有值,如果没有值,直接返回 if(valuesnull){ returnnull; } 遍历参数数组,使用AntiSamy进行过滤 intlenvalues。length; String〔〕newValuesnewString〔len〕; for(inti0;ilen;i){ 过滤前的数据 log。info(使用AntiSamy进行过滤清理,过滤清理之前的数据:{},values〔i〕); 进行过滤 newValues〔i〕xssClean(values〔i〕); 过滤后的数据 log。info(使用AntiSamy进行过滤清理,过滤清理之后的数据:{},newValues〔i〕); } 返回过滤后的结果 returnnewValues; } 重写处理json数据的方法 return throwsIOException Override publicServletInputStreamgetInputStream()throwsIOException{ 读取流 BufferedReaderreadernewBufferedReader( newInputStreamReader(super。getInputStream(),UTF8)); 获取json格式的数据 StringBuildersbnewStringBuilder(); StringinputStr; while((inputStrreader。readLine())!null){ sb。append(inputStr); } 把json转为map MapmapJSON。parseObject(sb。toString(),Map。class); 过滤前 log。info(json过滤前:{},sb。toString()); 对map中的value值进行AntiSamy的过滤 map。keySet()。forEach(k{ map。put(k,xssClean(map。get(k)。toString())); }); 过滤后 StringjsonJSON。toJSONString(map); log。info(json过滤后:{},json); 把json数据转为流的格式进行返回 ByteArrayInputStreambaisnewByteArrayInputStream(json。getBytes()); returnnewServletInputStream(){ Override publicbooleanisFinished(){ returnfalse; } Override publicbooleanisReady(){ returnfalse; } Override publicvoidsetReadListener(ReadListenerlistener){} Override publicintread()throwsIOException{ returnbais。read(); } }; } }codeprepdatatrack162spanstyleletterspacing:1px;AntiSamyConfig配置过滤器类编码如下:spanprecode program:xssdemo author:Mr。Zhang create:2021022115:58 Configuration publicclassAntiSamyConfig{ 配置xss过滤器 return Bean publicFilterRegistrationBeancreate(){ FilterRegistrationBeanfilterRegistrationBeannewFilterRegistrationBean(newXssFilter()); filterRegistrationBean。addUrlPatterns(); filterRegistrationBean。setOrder(1); returnfilterRegistrationBean; } }codeprepdatatrack164spanstyleletterspacing:1px;User实体类:spanprecode program:xssdemo author:Mr。Zhang create:2021022115:42 Data publicclassUser{ privateintid; privateStringname; privateintage; }codeprepdatatrack166spanstyleletterspacing:1px;UserController测试控制器类编码如下:spanprecode program:xssdemo author:Mr。Zhang create:2021022115:43 Slf4j RestController RequestMapping(user) publicclassUserController{ 表单 paramuser return PostMapping(save) publicStringsave(Useruser){ log。info(name{},age{},user。getName(),user。getAge()); returnJSON。toJSONString(user); } json数据格式请求体 paramuser return PostMapping(json) publicStringsaveJson(RequestBodyUseruser){ log。info(user{},user。toString()); returnJSON。toJSONString(user); } }codeprepdatatrack168spanstyleletterspacing:1px;application。properties配置文件为空,运行启动类后默认端口号8080。spanpdatatrack169spanstyleletterspacing:1px;Postman模拟表单数据请求及响应效果如下:spanpdatatrack170 imgsrcc2021imgdataimg。jpgdatasrcimgq01。71396。comcbmic066ba5ea4b08108。jpgimgwidth1080imgheight426imagetype1mimetypeimagepngweburitoscniqvj2lq49k0100beda382f64b6e86e6ec2cf9c26a05pclasspgcimgcaptionpdatatrack171spanstyleletterspacing:1px;后端程序控制台日志打印如下:spanimgsrcc2021imgdataimg。jpgdatasrcimgq01。71396。comcbmi60b2dd623049b00d。jpgimgwidth1080imgheight263imagetype1mimetypeimagepngweburitoscniqvj2lq49k07425cf3a8f1544db86c695d731a868fdpclasspgcimgcaptionpdatatrack172spanstyleletterspacing:1px;Postman模拟json数据请求及响应效果如下:spanimgsrcc2021imgdataimg。jpgdatasrcimgq01。71396。comcbmif51f506f1741b457。jpgimgwidth1080imgheight411imagetype1mimetypeimagepngweburitoscniqvj2lq49k0b9b8fe566cc94640875ddeef2bb62d95pclasspgcimgcaptionpdatatrack173spanstyleletterspacing:1px;后端程序控制台日志打印如下:spanimgsrcc2021imgdataimg。jpgdatasrcimgq01。71396。comcbmieaa63eb5398a638b。jpgimgwidth1080imgheight278imagetype1mimetypeimagepngweburitoscniqvj2lq49k011eede9ed9e648808394004ecd621fa5pclasspgcimgcaptionpdatatrack174spanstyleletterspacing:1px;以上两个情况,请求参数中隐藏的xss攻击代码被过滤器过滤后再进入Contrlloer层处理。spanpdatatrack175 h1classpgcharrowrightdatatrack17611。能不能根本上解决问题,即浏览器自动禁止外部注入恶意脚本?h1pdatatrack177spanstyleletterspacing:1px;开启CSP(内容安全策略ContentSecurityPolicy)方法:设置HTTP的头部字段spanprecoderesp。setHeader(ContentSecurityPolicy,defaultsrchttp:https:);codeprepdatatrack179spanstyleletterspacing:1px;设置网页的spanstylebackgroundcolor:F3F4F4;ttdarkmodebgcolor:BDBEBE;metaspan标签spanprecodemetahttpequivContentSecurityPolicycontentformactionself;codeprepdatatrack181spanstyleletterspacing:1px;strongCSP常见可选策略设置strong如下:spantablestyleminwidth:112px;colgroupcolcolcolgrouptbodytrtdpdatatrack182spanstyleletterspacing:1px;strong策略strongspantdtdpdatatrack183spanstyleletterspacing:1px;strong含义strongspantdtrtrtdpdatatrack184spanstylefontsize:0。882em;spanstyleletterspacing:1px;defaultsrchttp:https:;spanspantdtdpdatatrack185spanstylefontsize:0。882em;spanstyleletterspacing:1px;只能通过外联的方式引用js和cssspanspantdtrtrtdpdatatrack186spanstylefontsize:0。882em;spanstyleletterspacing:1px;defaultsrcselfhttp:smart4j。cn;spanspantdtdpdatatrack187spanstylefontsize:0。882em;spanstyleletterspacing:1px;只能在指定的域下加载文件(包含img)spanspantdtrtrtdpdatatrack188spanstylefontsize:0。882em;spanstyleletterspacing:1px;formactionself;spanspantdtdpdatatrack189spanstylefontsize:0。882em;spanstyleletterspacing:1px;form表单的只能在指定域提交spanspantdtrtrtdpdatatrack190spanstylefontsize:0。882em;spanstyleletterspacing:1px;scriptsrcself;spanspantdtdpdatatrack191spanstylefontsize:0。882em;spanstyleletterspacing:1px;只限制js文件在同域加载文件spanspantdtrtrtdpdatatrack192spanstylefontsize:0。882em;spanstyleletterspacing:1px;reporturireport;spanspantdtdpdatatrack193spanstylefontsize:0。882em;spanstyleletterspacing:1px;向指定uri发送违规报告(不支持meta方式)spanspantdtrtbodytablepdatatrack196本文转载自码上修行pstyletextalign:center;datatrack208spanstylefontsize:1。176em;strongspanstylecolor:3D89FF;ttdarkmodecolor:3D89FF;今日职位推荐:spanstrongspanpstyletextalign:left;datatrack209spanstylefontsize:1。176em;strong前端开发主管strongspanpstyletextalign:left;datatrack216要求:pstyletextalign:left;datatrack2171。本科及以上学历,软件技术、计算机科学与技术、电子工程等相关专业,5年及以上前端开发经验pstyletextalign:left;datatrack2182。精通VueJQuery等JS框架,HTMLHTML5CSS3JavaScript,熟练使用uniapppstyletextalign:left;datatrack2193。具备浏览器开发调试技能,能分析解决问题pstyletextalign:left;datatrack2204。掌握Web前端构建工具,能够运用构建工具pstyletextalign:left;datatrack2215。具有基于VUE低代码开发经验pdatatrack222办公地址:苏州市吴中区pdatatrack223薪资范围:20k25kpdatatrack225投递方式:FreemenApp中定位苏州搜索strong前端开发主管strongimgsrcc2021imgdataimg。jpgdatasrcimgq01。71396。comcbmid45c5e4c90538b04。jpgimgwidth1024imgheight512imagetype1mimetypeimagepngweburitoscniqvj2lq49k086a0cd5af6724207be6528f2bd007432pclasspgcimgcaption div divclassreadallbox divclassreadmoremaskdiv aclassreadmorebtntargetself展开阅读全文a div pclassinfo投稿时间:20230213最后更新:20230324 pclasstags 标签:ahrefat392800。htmltargetblank攻击者aahrefat382660。htmltargetblank大敌aahrefat257990。htmltargetblank表单aahrefat88060。htmltargetblank头号aahrefat266670。htmltargetblank过滤器aahrefat125750。htmltargetblank脚本aahrefat99550。htmltargetblank漏洞aahrefat109780。htmltargetblank恶意aahrefat6870。htmltargetblank策略aahrefat43820。htmltargetblank参数aahrefat83070。htmltargetblank代码aahrefat56110。htmltargetblank文件aahrefat33060。htmltargetblank网页a pclasspageLink pclasspagelink1 ahrefa151676251417699869。html1a ahrefa151676251416699868。htmlb2ba ahrefa151676251283699867。html3a ahrefa151676251282699866。html4a ahrefa151676251280699865。html5a divclassabjs2 scripttypetextjavascriptsrcabjsm2。phpscript