ua.js中JSocket.getlso和JSocket.setlso代码分析

       actionlog_js_ua.js混淆编程形式与执行主流程

       ua.js中UA_Opt设定信息的重要性与来源分析

       ua.js文件load事件自定义处理函数功能解析

       ua.js中mousedown和mousemove事件自定义函数功能解析

       ua.js文件focus&blur&keydown事件分析

       ua.js中UA生成函数vq4的“庐山真面目”

       ua.js中网络超时检测函数 wql 功能分析

       ua.js中用 image 对象实现页面访问统计

       ua.js中JSocket.getlso和JSocket.setlso代码分析

       ua.js中arguments.callee.caller的应用

       ua.js 获取访客浏览器与操作系统信息的方式

      搜索关键词JSocket.getlso或JSocket.setlso,会发现乌云上几个与”淘宝网存储xss”相关的漏洞,有一部分漏洞与ua.js中的JSocket相关。虽然以我目前的知识暂时还不能理解漏洞形成的原理,但是我可以先将漏洞相关内容与JSocket相关的代码字面意思记录下来。

      淘宝网存储xss

      乌云上这些标题看起来都很可怕,不明觉厉,但内容还感觉比较亲切:我从这些作者的文章里找到了我正在学习的ua.js文件的影子。这里记录下相关的链接,万一我哪天可以看懂了呢,呵呵。

      2013年10月  一个flash的0day导致的淘宝网存储xss(可形成永久后门)

      2014年6月  淘宝埋雷式XSS第四集可在第三方网站窃取用户帐号密码(大陆地区)

      2015年8月 淘宝网宝贝页面存储型XSS(需要卖家方发起攻击)

      除上述内容外,知乎上还有一篇标题更可怕,描述更详细的文章:一个可大规模悄无声息窃取淘宝/支付宝账号与密码的漏洞 -(埋雷式攻击附带视频演示)

     xss rookit

      ua.js中JSocket相关代码

      首先我们来回顾一下前面提到过JScoket的地方:JScoket相关的代码在load事件处理函数中被调用,会参与UA的生成:

       函数jl的功能是获取JSocket.getos和JSocket.getversion并参与生成UA,这两个函数我找不到更详细的说明。我只好大胆的猜测一下:或者flash所运行的操作系统和版本信息?这个函数不涉及到乌云相关漏洞中提到的setlso和getlso,所以我们把重点放在函数q和aqi中。

       由函数q反混淆和简化后的代码可知:先判断当前页面中是否存在ID为JSocket的元素,若存在,q()返回JSocket元素;若不存在,那么该函数按照代码所示的属性创建该元素,然后再返回JSocket元素。

      若ivsz[“PCIDInfo”]不为0,那么在DOM加载完成后100ms后将调用函数aqi,这里先对aqi中的函数做一个初步的说明:

      dpm 执行document.JSocket.getlso(),将相应字符串加密后返回

      rwh  对传入参数加密后,执行document.JSocket.setlso

      tpy   返回一个与DOM加载完成的时间相关的数组。

      j28/swzx/b0z 暂且理解为加密函数

      aqi函数的执行逻辑如下:

      1. 执行document.JSocket.getlso();若该语句执行出现异常,那么200ms后再执行函数aqi,若持续10次异常,那么将不再调用aqi;若无异常则进入第2步。

      2. 获取document.JSocket.getlso()返回的信息,将该信息加密后存储在变量p8中。

      3. 在函数tpy中可以看到:var a5 = [0, ghj +”|” + window.Math.random(), 0],其中ghj是DOM加载完成的时间;代码中tpy返回的数组为a5,则a5 = [j28(a5), ghj +”|” + window.Math.random(), 0]。

      在aqi函数中,会根据p8以及p1(p8)的值来重新为数组a5赋值,

      若p8=””,则 a5 = [j28(a5),ghj +”|” + window.Math.random(),0];

      若p1(p8)=true, a5=p8, a5=[j28(a5), p8[1], 1];

      若不满足上述条件,则a5 = [j28(a5)ghj +”|” + window.Math.random(),2];

      4.将第3步中得到的数组进行加密后作为函数document.JSocket.setlso的参数执行。

      5.记录当前正在执行的函数名,用第3步中得到数组更新UA。

      从代码来看,getlso从服务器获取相关参数用于更新UA;而setlso则主要是获取了DOM加载完成的时间来更新lso?或者其实有更高深的功能隐藏在其中,而我没有看懂?

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

Fork me on GitHub