Pikachu:XSS-盲打、过滤、htmlspecialchars、href与js输出

a 夏天 提交于 2020-03-25 10:19:46

XSS盲打:

  前端数据交互的地方,输入信息,输入后的结果不在前端显示,也就是只有后台能看到输入的内容,从前端无法判断是否存在XSS,这种情况下,我们直接往里面插入XSS代码,然后等待。我们先进入盲打的页面:

 

   然后在上面的文本框植入script标签,你的大名的地方随便写就可以:

  <script>alert('xss')</script>    /    123

 

   然后发现并没有弹窗,没有特别的事情发生:

 

   打开右上角的“点一下提示”,里面的内容提示我们登录后台看看,我们就登陆一下:

 

 

  http://192.168.1.4/pikachu-master/vul/xss/xssblind/admin_login.php

  admin/123456

 

   发现点击Login,马上就出现了弹窗:

 

  然后点确定,我们发现后台已经存储了数据:

  这种就是也是存储型的,将前端的数据存储到后台,后台如果没有进行过滤的话会使攻击者嵌入恶意代码进行登录获取到后台的信息。这种漏洞属于随机性质的,刚好后台没有做处理,攻击者就可以采取这种方式进行 暗箱操作。

 

XSS过滤:

  如果学习过Sqli-labs或者DVWA,那么对这种注入方式的绕过应该有所了解了,没有学习过请自行查阅相关资料或者参考我前面的博客。后端的代码会在文本框输入的部分进行限制,避免攻击者通过js标签语句来入侵,我们这里先输入常规的script标签的代码,来看看页面的反应,发现没有我们想要的弹窗出现:

  <script>alert('xss')</script>

 

   右击选择打开页面源代码,看看网页源码,了解我们刚刚输入的文本的去向,结果发现,我们的文本根本就没有显示出来,说明已经被过滤了:

 

   既然已经过滤,我们看看后端的源码用怎样的逻辑来过滤(源码路径如下图所示):

 

 

   我们能看到上图图二中选中的这句代码,对“script”这个词进行了过滤,我们的标签当然无法生效,所幸它只是过滤了小写,我们直接用大小写混合,或者直接大写,都可以,发现弹窗顺利跳出:

  <SCRIPT>alert('xss')</SCRIPT>

 

   关于XSS绕过还有下面这些方式,根据实际情况使用:

1.大小写混合:

  这种方式上面也可以用,不再演示

  <SCRIpt>ALErt(11)<SCRipt>

2.双写:

  适用于对整个字段的过滤,比如后端过滤了<script>只要碰到这个字段就过滤,那我们就拼凑双写,过滤的时候把中间标红的<script>过滤了,而前后没有被过滤的字段又组合成一个新的<script>

  <scr<script>ipt>alert(11)</sc<script>ript>

3.注释符:

  用注释符把字段隔开,注释符被过滤,其实跟第二种一样,只不过用来欺骗前端的,一个是<script>,一个是注释符

  <scr<!--text-->ipt>alert(11)</sc<!--text-->ript>

 

XSS的htmlspecialchars:

  这一关之所以叫这个名字,就是因为这个函数:

  htmlspecialchars()函数

  它会把预定义的字符转换为html实体,说白了就是另外一种过滤方式,你输入的某些字符不能正常输出成你想要的形式,下面是在htmlspecialchars()函数中的转换规则:

  预定义的字符:       预防: 可用的引号类型:(一般使用这个函数时候要指定类型)

  &转换为&amp          ENT_COMPAT 默认,仅编码双引号

  “转换为&quot           ENT_QUOTES 编码双引号和单引号(xss漏洞是因为指定类型时候的疏忽)

  ‘转换为&#039           ENT_NOQUOTES 不编码任何引号

  <转换为&lt       

  >转换为&gt

  我们输入带有特殊符号的一系列字符,看看返回的结果,发现只是提醒输入已经被记录:

  <'>"123&456

 

  右击点查看页面源代码,打开网页源码,我们看看输入的字符串的状态:

 

 

   发现只有'(单引号)没有被过滤,打开后端源码来看看:

 

 

   发现htmlspecialchars默认形式不对单引号处理,那么我们就构造语句,发现成功弹窗:

  a' onclick='alert(123)' 

 

XSS的防范措施

href输出

  href这里有一个输出漏洞:输出出现在a标签的href属性里面,可以使用javascript协议来执行js,在输入时候只允许是http,https协议,只有这两种协议才可以进行输出,如果不是的话就不允许输入。之后再进行htmlspecialchars函数过滤。我们来看看后端的代码(路径如下图):

 

 

 

  我们查看源码发现,虽然对htmlspecialchars()函数做了额外的处理,但是,它把输出放在了a标签的href属性里,所以我们可以用下面的payload让这种网页执行我们的代码,然后发现出现弹窗:

  javascript:alert(123)

 

 

js输出

  我们先来看一下源码(路径如下图):

 

 

   发现是把对应的输入放在了js里面,进行判断,再进行相应的输出,我们如果把逻辑部分忽略,那我们实际剩下的语句就是:

  <script>$ms=123

  我们熟悉标签的话,一看应该就知道没有闭合,后面应该用</script>闭合,所以我们把它闭合:

  <script>$ms=123</script>

  然后这个标签后面应该跟着我们弹窗的script标签,也就是:

  <script>$ms=123</script><script>alert(123)</script>

  而我们在文本框中输入的语句,除了script的弹窗语句,还应该加上对前面的闭合,因为它原来没闭合,如果不加,那语句执行肯定会有错误,所以,我们最终的语句为:

  </script><script>alert(123)</script>

  把语句输入文本框,发现弹窗:

  我们上面查看源码已知,输出点是在javaScript,通过用户的输入动态的生成JavaScript代码,javaScript里面是不会对tag和字符实体进行解释的,所以正常的输入得不到正常的输出,这不是我们需要的。所以,如果需要进行处理,就进行JavaScript转义处理,也就是用\ 对特殊字符进行处理。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!