一、概述
javascript函數劫持,也就是老外提到的javascript hijacking技術。最早還是和劍心同學討論問題時偶然看到的一段代碼,大概這樣寫的:
window.alert = function(s) {};
覺得這種用法很巧妙新穎,和API Hook異曲同工,索性稱之為javascript function hook,也就是函數劫持。通過替換js函數的實現來達到劫持這個函數調用的目的,一個完整的hook alert函數例子如下:
<!--1.htm-->
代碼如下:
<script type="text/javascript">
<!--
var _alert = alert;
window.alert = function(s) {
if (confirm("是否要彈框框,內容是/"" + s + "/"?")) {
_alert(s);
}
}
//-->
</script>
<html>
<body>
<input type="button" onclick="javascript: alert('Hello World!')" value="test" />
</body>
</html>
搞過API Hook的同學們看到這個代碼一定會心的一笑,先保存原函數實現,然后替換為我們自己的函數實現,添加我們自己的處理邏輯后最終再調用原來的函數實現,這樣這個alert函數就被我們劫持了。原理非常簡單,下面舉些典型的應用來看看我們能利用它來做些什么。
二、應用舉例
1. 實現一個簡易的javascript debugger,這里說是debugger比較標題黨,其實只是有點類似于debugger的功能,主要利用js函數劫持來實現函數的break point,來看看個簡單的例子:
代碼如下:
<script type="text/javascript">
<!--
var _eval = eval;
eval = function(s) {
if (confirm("eval被調用/n/n調用函數/n" + eval.caller + "/n/n調用參數/n" + s)) {
_eval(s);
}
}
//-->
</script>
<html>
<head>
</head>
<body>
<script type="text/javascript">
<!--
function test() {
var a = "alert(1)";
eval(a);
}
function t() {
test();
}
t();
//-->
</script>
</body>
</html>
通過js函數劫持中斷函數執行,并顯示參數和函數調用者代碼,來看一個完整例子的效果:
>help
debug commands:
bp <function name> - set a breakpoint on a function, e.g. "bp window.alert".
bl - list all breakpoints.
bc <breakpoint number> - remove a breakpoint by specified number, e.g. "bc 0".
help - help information.
>bp window.alert
* breakpoint on function "window.alert" added successfully.
>bl
* 1 breakpoints:
0 - window.alert
>bc 0
* breakpoint on function "window.alert" deleted successfully.
這里演示設置斷點,察看斷點和刪除斷點,完整代碼在本文附錄[1]給出。
2. 設置陷阱實時捕捉跨站測試者,搞跨站的人總習慣用alert來確認是否存在跨站,如果你要監控是否有人在測試你的網站xss的話,可以在你要監控的頁面里hook alert函數,記錄alert調用情況:
新聞熱點
疑難解答
圖片精選