2016年4月23日 星期六

Chrome JS Injection


昨天讀過「滲透 Facebook 的思路與發現」,真的眼界大開!今天突然閃過一個概念「究竟 Chrome 的 Console 是否有能力把網頁的 Javascript 作 run-time 修改?」。Google 了一下指「不行」。但我抱著好奇的心態決定一試,得出驚訝的結果。

我先在網頁服務器編寫一個簡單的 HTML。內容是容許用戶輸入一個電印地址,然後以 JS 來桃查格式是否正確。代碼如下:
<html>
    <head>
        <script>
            function isEmail(email)  {
                var regex = /^([a-zA-Z0-9_.+-])+\@(([a-zA-Z0-9-])+\.)+([a-zA-Z0-9]{2,4})+$/;
                return regex.test(email);
            }

            function submitNow()  {
                var email = document.getElementById("email").value;
                var result = isEmail(email);
                document.getElementById("output").innerHTML = result;
            }
        </script>
    </head>
    <body>
        Please enter a valid email address:
        <br><input id="email"><button onclick="submitNow();">Check</button>
        <br><div id="output"></div>
    </body>
</html>
打開 HTML 頁面,試過功能正常,進入 Injection 戲肉。在 Chrome Console 內,如圖所示先調用 isEmail("abc@cde.com"); 得出 true 正確結果。之後以 function isEmail(input) {return false;} 把功能取諦,再用相同的 isEmail("abc@cde.com"); 指令執行一次。今次出現 false,意味著 isEmail 功能已被修改。回到 HTML 頁面,輸入正確的電郵格式,點「Check」同樣傳回 false。確認了 isEmail 功能不止在 Console 被改,連實際網頁運作也被調換了。

讓我驚訝的是,這樣的取諦能成功的話,意味著系統更容易出現漏洞。如例子中的電郵格式檢查,只要編程人員信任客戶端由 JS 傳來的電郵格式是正確無誤,後台沒有再作檢查的話,這兒很大機會可以實現 PHP Injection,從而加入 Webshell 及其他程式碼,進行下一步攻擊。不過,今時今日,要是服務器端沒有好好檢查輸入的資料,就算 Chrome Console 沒有這個功能也很容易出現問題...。

沒有留言: