13.5 Callback 自定义测试
13.5.1 测试原理和方法
在浏览器中存在着同源策略,所谓同源是指域名、协议、端口相同。当使用 Ajax 异步
传输数据时,非同源域名之间会存在限制。其中有一种解决方法是 JSONP(JSON
with
Padding),基本原理是利用了 HTML 里<script></script>元素标签,远程调用 JSON 文件来
实现数据传递。JSONP 技术中一般使用 Callback(回调函数)参数来声明回调时所使用的
函数名,这里往往存在安全问题,由于没有使用白名单的方法进行限制 Callback 的函数
名,导致攻击者可以自定义 Callback 内容,从而触发 XSS 等漏洞。
13.5.2 测试过程
如图 13-25 所示,攻击者在测试前,使用 Brup Suite 的爬虫功能对网站进行爬取,筛选
出带有 Callback 或者 jsonp 参数的请求,对请求响应的 Content-Type 进行判断,如果 Content-Type 为 text/html,则进行下一步,接着攻击者对 Callback 参数进行分析,如果 Callback 参数
允许攻击插入 HTML 标签,则存在漏洞。
图 13-25 CallBack 测试流程图
步骤一:如图 13-26 所示,使用 Burp Suite 的爬虫功能,从重点关注的目录(一般为网
站根目录)开始爬取,在 HTTP history 选项卡中选中要开始爬取的项,右键选择“Spider from here”。
如图 13-27 所示,爬取的结果会在 Target→Site
map 中显示。在爬取完毕后,再使用
Burp Suite 的过滤功能找到带有 Callback 参数的链接,如图 13-28 所示。
图 13-26 从网站根目录开始爬取
图 13-27 切换到 Site map 标签页
图 13-28 使用 callback 关键词进行过滤
在输入关键词之后,再单击图 13-28 中序号“1”的位置即可让过滤生效。步骤二:如图
13-29 所示,找到 URL 带有 callback 参数的链接。
图 13-29 定位到 callback 参数位置
步骤三:查看 URL 对应的 HTTP
Response 的 Content-Type 类型是否为 text/html。如果
Content-Type 为 text/html,我们输入的 HTML 标签才会被浏览器解析。如图 12-30 所示,
Content-Type 类型为 text/html,将对应的请求发送到 Repeater,继续步骤四。
图 13-30 观察响应的 Content-Type
步骤四:如图 13-31 所示,查看 callback 参数是否存在过滤及可控,这时我们需要在
callback 参数值前追加一些文本类的 HTML 标签,不直接使用 script 等标签是避免 waf 等防护
设备的检测。我们这里使用的 HTML 标签是一级标题标签<h1>。
如图 13-32 所示,根据 Response 的内容,我们可以了解到 callback 参数不存在过滤及可
控。进一步测试发现 info 参数对 Response 的输出内容没有影响,删除掉 info 参数,精简
URL。
图 13-31 测试 callback 参数是否可控
图 13-32 精简漏洞 URL
步骤五:如图 13-33 所示,将 callback 参数更换成带有恶意行为的 HTML 标签,进行利
用。
图 13-33 确认漏洞
13.5.3 修复建议
(1)严格定义 HTTP 响应中的 Content-Type 为 json 数据格式:Content-Type:
application/json。
(2)建立 callback 函数白名单,如果传入的 callback 参数值不在白名单内,跳转到统
一的异常界面阻止其继续输出。
(3)对 callback 参数进行 HTML 实体编码来过滤掉“<”、“>”等字符。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论