babel2.9.0内含目录遍历缺陷,可用以加载.dat任意定位文件,内含串行式Python对象攻击者可引起babel.Lible任意代码执行可以通过运行过程内脱序实现
路径定位文件可指定从本地数据目录外加载本地文件./././基本允许非许可局部文件加载
区块构造器调用时,它会填充语言、领域、脚本、变量
检验本地标识符是否存在
核心.py
166标识值=spledata.despenes:168
标识符归来值获取_locale_degifer ():
核心.py
357 def____str__(自定义):358返回获取_locale_识别器
万一我们传递语言标识符归结为'en'和'en', 并可以通过调用_star___
locale-'en's
edata.debenss方法使用以确保区间存在
核心.py
167if非局部化
名不在缓存中时,它会查看#dirname中是否存有+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
本地化data.py
24_dirname=os.path.jin
归根结底它写进网站包目录
>>> print(babel.localedata._dirname) /home/ubuntu/.local/lib/python3.8/site-packages/babel/locale-data
现在我们发布文件系统路径含前导././
locale = bael.bele./././././././././././././././no
第一行
文件 '/home/ubuntu/.Lib/pyth3.8/site打包/babel/core.py.
在上述案例中, 文件系统根部没有.dat文件if we复制es.dat文件到/tmp/en.dat
$ cp ~/.local/lib/python3.8/site-packages/babel/locale-data/es.dat /tmp/en.dat
locale = baile./././././././././././././././tmp/en
/tmp/en.dat文件确实加载,并配有美国西班牙文译文
上头见可从文件系统装入任意局部文件深入点
当局部对象属性访问时,Lapile.dat文件最终使用chep.load方法解密攻击者使用Python泡菜模块编译恶意.dat文件并加载时,可实现任意代码执行
详解当局部对象属性存取例举 :
本地语区
Lationaledata.load()方法调用局部标识符作为参数
核心.py
361@property362def_data(自定义):363自定义.__data=localedata
归根结底,通向淡入指定位置loadata方法本地化data.py
122 filename = os.path.join(_dirname, '%s.dat' % name) 123 with open(filename, 'rb') as fileobj: 124 if name != 'root' and merge_inherited: 125 merge(data, pickle.load(fileobj)) 126 else: 127 data = pickle.load(fileobj)
概念证明
显示任意代码执行假想 运行下Python代码代码先取类对象创建恶意.dat文件对象由 Babel解密时,它会运行UNIX'id'shell命令输出通知显示id命令结果
babel_id_exploit.py:
导入子进程输出file.close打印
输出 :
ython3bail_id_development.py创建/tmp/evil.dat加载语域uid=1000(ubuntu) gid=1000(ubuntu) groups=1000(ubuntu),4(adm),20(dialout),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),44(video),46(plugdev),117(netdev),118(lxd)trackback(最近最后一次调用):文件Babel_id_despect.py,行22
e.e/lib/pyon3.8/site-packages/bel/core.py