ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

XSS通关

XSS通关 level1无过滤XSS的攻击就是看输出想输入在哪里更改输入代码看执行。第一关我们观察界面1先找输入点只有URL这里可以输入并且会显示在“欢迎用户”后面同时记录字符长度2右键查看源代码根据方框里的函数我们的目的是触发弹窗跳转到level2看不出有什么过滤3没有过滤直接使用最基础的payload?namescriptalert()/script至此第一关通关level2标签闭合1找输入点比第一关多了个搜索框2查看网页源代码和第一关有点像但是第二关用双引号包裹需要使用闭合双引号和标签。3payload本关两个输入点随机选一个都行scriptalert()/script至此第二关通关额外内容查看以下网站第二关php代码可以看到有一个htmlspecialchars函数这里的htmlspecialchars是一个实体化函数说白了就是为了防止攻击把一些特殊符号转化成了文本说白了就是告诉浏览器看清楚这些是文本不是你需要执行的代码。查一下这个函数的特殊符号对应的实体 amp; lt; gt; quot; #39;level3单引号闭合1寻找输入点输入点大多都是url和输入框之后就不再过多介绍了XSS攻击第一步肯定要找输入点。2查看网页源代码和第二关不同的是它使用的是单引号闭合3但是使用payload时scriptalert()/script发现没有成功这就用到了第二关的扩展内容查看第三关的php代码它有htmlspecialchars函数对输入的数据进行了实体化看结果它没有对单引号实体化说明单引号闭合可行但不能用script/script我们换种方法攻击改用事件 οnmοuseοveralert()------鼠标经过元素时触发弹窗 οnclickalert()------点击元素触发弹窗 οnfοcusalert()------元素获得焦点触发弹窗 οnbluralert()------当元素失去焦点时触发弹窗4随机挑选一个就行输入后触发相应事件就行如onmouseover就是鼠标滑过文本框成功payloadonmouseoveralert() onclickalert() onfocusalert() onbluralert() 至此第三关通关level4双引号闭合1查看页面源代码可以判断出要用双引号闭合使用scriptalert()/script发现我们输入的都被过滤了所以本关不能用标签而要用和第三关一样的事件来进行绕过。2payload onmouseoveralert()至此第四关通关最后查看后端源代码可以看到它过滤了并且进行了实体化。level5标签绕过1查看页面源代码可采取双引号绕过2先用一句payload测试scriptalert()/script有实体化仅在输出部分标签部分无实体化script过滤script οnmοuseοveralert()过滤onmouseover ONMOUSEROVERalert()有大写转小写。3换思路事件和标签闭合都不能用我们使用新标签进行绕过。a hrefjavascript:alert()click/a至此第五关通关最后看后端php代码后端防护方法是全部小写化过滤script,onmouseoverlevel6大小写绕过1把之前用过的方法都用一次后查看网站源代码scriptalert()/scriptοnmοuseοveralert()a hrefjavascript:alert()click/a它同时过滤script,onmouseover,href。2使用大写字母查看结果没有进行大小写过滤这就是突破口。3payloadSCRIPTalert()/SCRIPT ONmouseoveralert() a HREFjavascript:alert()click/a注意如果后面没有使用引号闭合时要加空格来隔断原来的引号至此第六关通关level7关键字绕过1输入move UP说明有大小写转换。接下来我们用最基本的payload看一下结果可以看见我们输入的script没有了。将之前的两个方法都试过后我们会发现它还过滤href和on。但是它的过滤方法不是替换而是直接删除所以可以通过双写绕过双写不可直接写在一起否则会全部删除2payloadsscriptcriptalert()/sscriptcript oonnmouseoveralert() a hhrefrefjavasscriptcript:alert()click/a至此第七关通关level8编码绕过1输入最基本的payload我们输入的语句会到input的value里和a的href里并且都进行了实体化这意味着之前的三种语句标签无法闭合。2尝试直接在href里加javascript:alert()它使用了下划线替换。3在这种情况下我们使用编码绕过。编码就是对HTML内容进行十进制编码。对于html页面来说它会识别页面中的html编码自动将其转换成对应的字符后显示在页面中而后台的过滤函数并不会解码html编码也就无法识别出是什么内容这样就绕过了后台过滤。把javascript:alert()转换后为#106;#97;#118;#97;#115;#99;#114;#105;#112;#116;#58;#97;#108;#101;#114;#116;#40;#41;输入后点击友情链接其他两个方法要靠引号闭合由于编码后也无法闭合所以不能用。至此第八关通关level9字符串检测绕过1使用最基本的注入语句SCriptalert()/script可以看出来它和上一关一样有实体化。2使用上一关的payload它说链接不合法我们打开后端的源代码看一看它使用了一个函数strpos这个函数是用来查找字符串中某个子字符串的位置。如果找到了子字符串strpos 会返回子字符串在字符串中首次出现的位置从0开始计数如果没有找到它会返回false。也就是说在str7里面找http://如果没有找到返回false此时输出链接不合法那我们就想办法在payload里面包含http://但是也不能让他影响payload正常运作为了防止它影响payload我们要加//来注释。编码语句为javascript:alert()//http://#106;#97;#118;#97;#115;#99;#114;#105;#112;#116;#58;#97;#108;#101;#114;#116;#40;#49;#41;//http://至此第九关通关。level10参数掩盖1先输入一句话试试它进行了实体化输出界面里并且将input进行了隐藏2我们要找到输入想办法来利用三个input在keyword里传入不同的参数值进行测试t_link111t_history222t_sort333?keywordt_link111t_history222t_sort333根据结果只有第三个input可用3payload在html标签中每个参数只能被定义赋值一次只有第一次的值会被应用其他重复的赋值会被忽略在这题中type参数的值默认被赋值为hidden所以会看不见而我们插入值的位置在type前面完全可以先给type赋值将默认的hidden挤掉让输入框显示出来.以下为keyword里的值?keywordt_link111t_history222t_sort333 typetext onmouseoveralert() 注意本关里没有对input内容实体化但是删除所以只能用事件。至此第十关通关。最后后端代码可以看出来它只进行了删除level 11请求头注入1先右键查看页面源代码相较上一关源代码里多了一个name属性为t_ref的隐藏输入框namet_ref是该输入框的字段标识符表单提交时后台会通过这个 name 来获取对应的值t_ref介绍t target目标 ref referer来源页、引用页t_ref 含义目标来源地址、跳转来源页作用来源记录统计记录用户从哪个页面进入当前接口本关里页面加载时JS把浏览器自带的来源地址填进 value所以我们要利用referer请求头注入2用BP抓包referer请求头写入相应payloadReferer: onmouseoverjavascript:alert() typetext3成功弹窗最后看一下后端源代码它会过滤所以只能用事件至此第十一关通关level12请求头注入1先查看页面源代码和上一关一样有一个特殊的输入框它的name属性为t_uat_ua为User-Agent所以本关我们要修改的请求头为User-Agent2使用BP抓包修改User-Agent头payload与上一关相同User-Agent: onmouseoverjavascript:alert() typetext3成功弹窗至此第十二关通关最后查看后端源代码和上一关原理相同level13cookie注入1查看页面源代码可以看出来和上一关原理相同本关name属性是t_cook获取的是cookie2在网页cookie里加入payload onmouseoverjavascript:alert() typetext3成功弹窗至此第十三关通关最后查看后端源代码和上一关原理相同level14这一关需要在其他网站上完成但那个网站已经没了就做不了这一题了直接跳过进入下一关。level15文件包含1先查看页面源代码html ng-app !-- ① 启用AngularJS应用 -- head meta charsetutf-8 script srcangular.min.js/script !-- ② 加载AngularJS核心库 -- script window.alert function() { confirm(完成的不错); // ③ 重写alert函数 window.location.hreflevel16.php?keywordtest; // ④ 跳转到下一关 } /script title欢迎来到level15/title /head h1 aligncenter欢迎来到第15关自己想个办法走出去吧/h1 p aligncenterimg srclevel15.png/p body span classng-include:/span !-- ⑤ 关键注入点 -- /body /html逐部分详解①html ng-app作用告诉 AngularJS 这是一个 Angular 应用ng-app不带模块名表示使用默认模块效果页面中的所有 Angular 指令如ng-include都会被解析执行②script srcangular.min.js/script加载 AngularJS 1.x 核心库提供了模板引擎、数据绑定、指令系统等功能这就是漏洞的根源——AngularJS 允许在模板中执行 JavaScript 表达式③window.alert function() { ... }重写覆盖了原生的alert()函数原本的alert(消息)会弹出提示框现在调用alert()会执行confirm(完成的不错)弹出确认框页面跳转到level16.php防御意图防止攻击者用alert(1)弹窗证明 XSS 存在④window.location.hreflevel16.php?keywordtest跳转到下一关第16关携带参数keywordtest⑤span classng-include:/span⭐核心漏洞点ng-include是 AngularJS 的指令用于动态加载外部HTML内容正常用法span ng-includeheader.html/span核心漏洞就在第五部分我们可以看到URL里有src它后面跟的是外部HTML内容会加载外部HTML页面所以我们就要使用src来利用其他关卡进行弹窗。2因为第一关最简单所以我们使用src来包含第一关的网页?srclevel1.php3我们来利用第一关进行弹窗?srclevel1.php?namea hrefjavascript:alert(1)111/a注意AngularJS 的 ng‑include 加载外部HTML片段时会自动剥离、不执行 script 标签。本关不能使用scriptalert(1)/script其余标签方法任选至此第十五关通关最后查看后端代码注意如果浏览器本关会自动转义单引号本关就会没有漏洞了。需要用stripslashes() 强制清掉level 16空格绕过1先查看页面源代码可以看出来是要在没有标签的情况下加标签弹窗2使用我们之前的方法方法一 ?keywordimg srcx onerroralert(1) ?keyworda hrefjavascript:alert(1)111/a 方法二 ?keywordscriptalert()/script可以看出来它会删除script并进行实体化所以要想成功我们要绕过它对空格的实体化这时候就要用到其他特性了在html中换行符也会被视为空格这样就可以使用换行符代替空格来绕过空格实体编码了。换行符的url编码是%0a将payload的空格替换为%0a提交后成功绕过实体编码实现弹窗。2使用payload成功弹窗?keywordimg%0asrcx%0aonerroralert(1)【使用a标签script会被删除】至此第16关通关最后查看后端代码level17参数拼接这一关要正常做的话需要修改一下源码原本使用的是xsf01.swf文件这个文件是flash使用的而目前主流浏览器都就已经不再支持flash插件导致文件没法加载需要修改一下让这个位置显示出东西来。在靶机的靶场目录中找到level17.php文件打开找到embed标签将src中原本的xsf01.swf修改成index.png后保存。在浏览器刷新一下页面出现正常图片即可。1先看源代码我们能看到有两个参数它们在标签里我们使用事件来触发弹窗2输入payload成功弹窗?arg01aarg02b onmouseoveralert()至此第十七关通关最后查看后端代码level 18参数拼接和上一关一样要先修改一下源码能出现正常图片查看后端代码和上一关一样payload仍可用?arg01aarg02b onmouseoveralert()至此第十八关通关level19level20这两个都是flash xss现在很多浏览器都因为flash安全漏洞太多而停用了好像还要下载配置之类的先学好基础的再研究这两关吧xss方法总结1.寻找输入点找到所有接收用户输入的位置常见的比如URL参数输入框cookiehttp头部提交图片flashhref属性get请求参数2.看源码看源码逻辑以及可能的过滤点3.测试过滤点转义特殊字符白名单过滤4.绕过过滤点大小写标签href实体化函数用事件绕过关键词替换用事件绕过关键词严格替换用双写绕过HTML编码注释http头ccokierefererUA回车绕过空格攻击防御性较弱网页间接攻击原网页
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进