XSS攻击通关之路

前言:

  之前去郑州学习的时候看了一套比较系统的XSS注入的视频,简直是要膜拜做这个视频的人,以前会的XSS注入测试跟着一比简直是关公门前耍大刀,不仅刷新了以前对这个注入的理解,还涨了不少姿势。看来以后这种学习大会一定要多去去见识见识,没有什么比这提升更快了我觉得。。。。。。

正文:

  刚开始还是先在这里记录一下XSS注入的意义和危害吧:

  XSS攻击又叫跨站脚本攻击,它是一种经常出现在WEB应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。比如这些代码包括HTML代码和客户端脚本。主要利用的就是JavaScript,对于hacker来说,XSS就是一种新生的”缓冲区溢出攻击“,而JavaScript就是这个攻击中的ShellCode。这个比喻确实很形象。

XSS攻击可能产生的危害:
  1. 盗取各类用户帐号,如机器登录帐号、用户网银帐号、各类管理员帐号
  2. 控制企业数据,包括读取、篡改、添加、删除企业敏感数据的能力
  3. 盗窃企业重要的具有商业价值的资料
  4. 非法转账
  5. 强制发送电子邮件
  6. 网站挂马
  7. 控制受害者机器向其它网站发起攻击
XSS攻击的分类:
  1. DOM型:这是一种hacker和受害用户直接交互的本地利用漏洞,简单说就是hacker给某个特定用户发送了一串含有ShellCode的URL,用户不小心点开该URL,hacker的ShellCode在用户的客户端上被触发执行,利用JavaScript打开一个具有某种漏洞的HTML界面并安装在用户的客户端界面上。
  2. 反射型:这是一种hacker通过第三方服务器与受害用户交互的服务端利用漏洞,简单说就是hacker发现在某个服务端网站上存在反射型的XSS漏洞(也就是客户端的请求数据的响应结果直接经过服务端返回的URL,直接返回给客户端浏览器),伪造一个含有ShellCode的URL,并以服务端的名义发送给用户,用户在点开之后就会触发ShellCode,JavaScript就会将用户的信息传给hacker伪造的站点。
  3. 存储型:这是一个hacker利用服务端数据库窃取用户信息的XSS漏洞,某服务端未完全过滤ShellCode,并允许用户在站点发布和浏览信息,hacker利用这一点将ShellCode存入数据库,站点在解析的时候就会执行该ShellCode,阅读hacker发布信息的用户就有可能被窃取cookie或者其他信息。
XSS攻击常见利用方式:

  接下来使用的都是xss在线训练链接

  1. 最简单的就是普通的GET型XSS,这里描述参数不加密的URL:

    1
    http://test.xss.tv/level1.php?name=<script>alert(/xss/)</script>

    普通GET型XSS攻击

      这是第一关,直接URL参数提交注入,该注入能产生说明程序员没有过滤或用引号包裹任何参数内容,也就是说后台代码直接解析执行参数值。这就造成在弱类型的语言中,原本是正常的字符串被当作代码执行,形成该XSS漏洞。

  2. 第二种就是带<input>标签的GET型XSS,直接在表单输入窗口直接输入XSS代码:

    1
    http://test.xss.tv/level2.php?keyword="><script>alert(/xss/)</script>

      这里选择在URL处直接注入代码,带<input>标签的GET型XSS和普通的GET型XSS最大的区别就是普通的GET型XSS的参数可以直接被解析,而带<input>标签的GET型XSS还需要闭合原本的input窗口,然后才能注入ShellCode。闭合点举例:

    1
    2
    3
    4
    <form action=level2.php method=GET>
    <input name=keyword value="test">
    <input type=submit name=submit value="搜索"/>
    </form>

      这里的keyword参数就是输入框的变量,我们输入的值会在替换value的值,也就是双引号里面的就是keyword变量代表的东西,所以我们闭合这个<input>标签用的是">,后面就可以跟上ShellCode。放到界面输入框里就是带input标签的GET型XSS攻击

      这个输入框太小,里面的内容有一小部分没显示出来ԅ(¯ㅂ¯ԅ)。。。。。POST型同理,这里就不举例了。

  3. 第三种就是过滤一些特殊字符:

    level3测试

      上面就是通过源码看出的测试字符串,结果的源码如下:

    1
    2
    3
    4
    <form action=level3.php method=GET>
    <input name=keyword value=''&gt;&lt;script&gt;alert(/xss/)&lt;/script&gt;'>
    <input type=submit name=submit value=搜索 />
    </form>

      可以看出输入的"<>都被过滤了,所以带有尖括号的ShellCode就不能用了。所以在此换思路采用事件属性:

    1
    http://test.xss.tv/level3.php?keyword='+onclick='javascript:Aalert(/xss/)'&submit=submit

      同样的道理,先闭合前一个变量值,在放ShellCode,放到界面输入框就是level4

      在这里就要注意下,因为上面用的是onclick点击事件,所以还要点击一下输入框才会有弹窗。

  4. 第四种就是过滤关键字:

      一般测试的第一反应就是用最常见两中方式,发现特殊字符都被过滤了才会考虑用触发事件,但触发事件的关键字也被过滤了,这时候就要找有哪些还没有被过滤的。关键字测试:

    1
    http://test.xss.tv/level5.php?keyword=" ONclick="javascript:alert(/xss/)

      源代码处可以看到得到的结果是

    1
    2
    3
    4
    <form action=level5.php method=GET>
    <input name=keyword value="" o_nclick="javascript:alert(/xss/)">
    <input type=submit name=submit value=搜索 />
    </form>

      很明显,onclick关键字中间被加了下划线,这种是用双关键字和大小写绕过不了的,那就换一种触发事件,这里可以先考虑超链接

    1
    http://test.xss.tv/level5.php?keyword="><a href="javascript:alert(/xss/)">点这里</a>//

      看到的结果就是level5

      同样可以成功,后面加了个//的原因是为了注释掉后面多余的部分,以免影响代码的正确性。同样的道理,这一类型的常用利用方法有onclick,onerror,<a>标签、<img>标签、<svg>标签双关键字、大小写等不同的多种组合。

  5. 第五种就是HTML实体编码绕过

      HTML实体编码指的就是用unicode编码来代替关键字符或关键符号,它有一个很大的特点,那就是&#;不能被过滤。具体使用举个例子就一目了然:假设关键字JavaScript被过滤成JavaScrip_t,那就可以用JavaScrip&#x74;来代替JavaScript,这里的括号可以用两个反单引号代替。

    1
    http://test.xss.tv/level8.php?keyword=javascript:alert(1)

      这里的关键字javascript被正则表达式加上了下划线:

    1
    2
    3
    4
    5
    6
    7
    8
    <form action=level8.php method=GET>
    <input name=keyword value="javascript:alert(1)">
    <input type=submit name=submit value=添加友情链接 />
    </form>
    <center>
    <a href="javascr_ipt:alert(1)">友情链接</a>
    <img src=level8.jpg>
    </center>

      这个时候HTML实体编码就可以派上用场了:

    1
    http://test.xss.tv/level8.php?keyword=javascrip&#x74;:alert(/xss/)&submit=%E6%B7%BB%E5%8A%A0%E5%8F%8B%E6%83%85%E9%93%BE%E6%8E%A5

      这里的submit参数后面的一串URL编码代表的是添加友情链接,界面执行就是level6

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <form action=level8.php method=GET>
    <input name=keyword value="javascrip&amp;#x74;:alert(/xss/)">
    <input type=submit name=submit value=添加友情链接 />
    </form>
    <center>
    <a href="javascrip&#x74;:alert(/xss/)">友情链接</a>
    </center>
    <center>
    <img src=level8.jpg>
    </center>

      同样的道理,这里需要点击那个友情链接。可以看出,源码不会出现问题,这里的t使用HTML实体编码照样能够被解析成功。这就是HTML实体编码的强大之处,HTML可以识别,执行文件的正则匹配不会成功,从而达到一个绕过的效果。

      编码绕过的方式还有好多种,比如十六进制编码jsfuck编码url编码等,这里不做过多的举例。

  6. 第六种就是HTTP头流量包注入:

      这种就是在隐藏HTTP流量存在CSS漏洞的时候就可以抓包修改,流通ShellCode:

    1
    2
    3
    4
    5
    6
    <form id=search>
    <input name="t_link" value="" type="hidden">
    <input name="t_history" value="" type="hidden">
    <input name="t_sort" value="" type="hidden">
    <input name="t_ref" value="http://test.xss.tv/level10.php?keyword=well%20done!&t_sort=%22type=%22text%22%20onclick%20=%20%22alert(1)" type="hidden">
    </form>

      可以看出,第四个隐藏的<input>标签里面流通的是t_ref,可以猜测,这个流量包是经过Referer的,所以对其进行抓包,修改Referer参数level7level8

      可以看到,这里多出来了一个部分,因为使用的是onmouseover事件,所以只要鼠标经过触碰到,就会触发通过。同样的道理,还可以修改User-AgentCookie等一系列HTTP头参数,具体情况具体使用。

  这里一直可以做到第十三关,第十四关好像崩了,进行不下去了。这样这次就做到这里了,以后找机会再往后进行吧,这一次消化的东西有点多了。如果记录的有什么不对,还请表哥表姐们点名批评,批评通道:

level9