看好你的门-客户端传数据(3)-不安全的http信息头
2015-03-06 08:36
295 查看
首先需要声明,本文纯属一个毫无远见和真才实学的小小开发人员的愚昧见解,仅供用于web系统安全方面的参考,请勿用与非法用途。
Referer用来表明,浏览器向 WEB 服务器表明自己来自哪里。
这种认识不那么全面,因为对任何使用数据拦截代理服务器的人来说,所有的数据都是暴露在外面的。
根据w3.org标准,http信息头完全是可选的。也就是,Referer属性也是可以变化的。
我们想当然的认为,如果我们可以判断这个页面来自管理员,那么就是可信任的,是可以操作的。
为了安全起见,我们把这个验证的信息不放在URL中,我们放在HTTP信息里,看起来很高大上吧。
运行一下:http://127.0.0.1:8080/webStudy/http_accept.jsp
结果:
因为我是直接访问链接的,因此没有referer属性,好像看起来很不错。
我另外写一个简单代码验证:
http_visit.jsp
访问:http://127.0.0.1:8080/webStudy/http_visit.jsp
显示:
其中,referer:http://127.0.0.1:8080/webStudy/http_visit.jsp
正是我们刚才访问的链接,非常好。测试很成功。 赞赞赞。
1、 简单说明
[code]在互联网中,大量的数据通过URL参数的方式进行传递,大部分的数据,是没有通过加密进行传输。在我所了解到的情况,大部分的数据是通过明码进行… 当然,现在大家都知道,URL参数,安全性不是特别高,于是http信息头(包含referer等属性)进入了大家的视野。
Referer用来表明,浏览器向 WEB 服务器表明自己来自哪里。
2、 观点:
不知道从什么时候起,相比起直接的URL参数,很多人都认为HTTP信息头有更加强悍的防攥改的能力。 很多开发者信任通过cookie和http信息头提交的数值,而对URL参数进行严格控制。这种认识不那么全面,因为对任何使用数据拦截代理服务器的人来说,所有的数据都是暴露在外面的。
根据w3.org标准,http信息头完全是可选的。也就是,Referer属性也是可以变化的。
3、 HTTP信息头的常见应用场景
比如有一个修改用户密码的页面,这个页面必须要管理员操作。我们想当然的认为,如果我们可以判断这个页面来自管理员,那么就是可信任的,是可以操作的。
为了安全起见,我们把这个验证的信息不放在URL中,我们放在HTTP信息里,看起来很高大上吧。
4、 通过http信息头认证信息的简单源代码
http_accept.jsp[code] <%@ page language="java" import="java.util.*,javax.servlet.http.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>看好你的门-阿饭同学</title> </head> <body> 如果不是来自超级管理员,那么我无法被访问(超级管理员是来自一个叫做admin.jsp的页面,保持在http头中的referer) <br> 地址:<%=(String)request.getRemoteAddr()%> <br> 编码:<%=(String)request.getCharacterEncoding() %> <br> <% //response.setHeader("referer","admin.jsp"); Enumeration<String> reqHeadInfos = request.getHeaderNames(); int i = 0; while (reqHeadInfos.hasMoreElements()) { String headName = (String) reqHeadInfos.nextElement(); String headValue = request.getHeader(headName);//根据请求头的名字获取对应的请求头的值 out.write(headName + ":" + headValue); out.write("<br/>"); if (headName.equals("referer") && (headValue.equals("admin.jsp"))){ i = 1; // 登陆成功 } } out.write("<br/>"); out.write(" <h3 style='color:red;'>"); if ( i == 1){ out.write("恭喜管理员,访问成功"); }else{ out.write("不是管理员,请从管理员页面进入"); } out.write("</h3>"); %> <br> </body> </html>
运行一下:http://127.0.0.1:8080/webStudy/http_accept.jsp
结果:
[code] 如果不是来自超级管理员,那么我无法被访问(超级管理员是来自一个叫做admin.jsp的页面,保持在http头中的referer) 地址:127.0.0.1 编码:null host:127.0.0.1:8080 connection:keep-alive accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 user-agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/537.36 accept-encoding:gzip,deflate,sdch accept-language:zh-CN,zh;q=0.8 cookie:JSESSIONID=2B927E8B22425D29CB623BD35970CF08 不是管理员,请从管理员页面进入
因为我是直接访问链接的,因此没有referer属性,好像看起来很不错。
我另外写一个简单代码验证:
http_visit.jsp
[code]<%@ page language="java" import="java.util.*,javax.servlet.http.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>看好你的门-阿饭同学</title> </head> <body> 我不是管理员,我只是来搞山寨的 <br> <a href="http_accept.jsp"> 点我访问http_accept.jsp</a> </body> </html>
访问:http://127.0.0.1:8080/webStudy/http_visit.jsp
显示:
[code]如果不是来自超级管理员,那么我无法被访问(超级管理员是来自一个叫做admin.jsp的页面,保持在http头中的referer) 地址:127.0.0.1 编码:null host:127.0.0.1:8080 connection:keep-alive accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 user-agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/537.36 referer:http://127.0.0.1:8080/webStudy/http_visit.jsp accept-encoding:gzip,deflate,sdch accept-language:zh-CN,zh;q=0.8 cookie:JSESSIONID=703D6301DAC606173E0118D0DD35BEA1 不是管理员,请从管理员页面进入。
其中,referer:http://127.0.0.1:8080/webStudy/http_visit.jsp
正是我们刚才访问的链接,非常好。测试很成功。 赞赞赞。
5、 被攻击
http信息头虽然没有显示在屏幕上,看起来用户也不能去修改。 但是客户端的一切最终操作都是用户控制,直接通过拦截代理服务器对数据进行修改就可以访问。相关文章推荐
- 看好你的门-客户端传数据(3)附录-http信息头说明
- 看好你的门-客户端传数据(4)-利用浏览器调整http的referer
- 看好你的门-客户端传数据(10)-不安全的HTML禁用元素
- 看好你的门-客户端传数据(6)-不安全的cookie
- 看好你的门-客户端传数据(8)-不安全的HTML表单限制
- 看好你的门-客户端传数据(2)-不安全的URL参数
- 看好你的门-客户端传数据(9)-不安全的js脚本限制
- 看好你的门-客户端传数据(10)-不安全的HTML禁用元素
- 看好你的门-客户端传数据(7)-不安全的固定加密
- 看好你的门-客户端传数据(1)-不安全的隐藏表单字段
- 安全检测ASP.net网站实例:用DBO操作数据库以获得信息和数据
- 定义一个网站全局的 HttpModule ,用来验证客户端是否重复提交数据和是否跨站点提交数据
- WCF消息安全模式之自定义用户名密码:Message CustomUserNamePassword wsHttpBinding 使用Windows Services宿主以及客户端免证书验证
- [WCF安全系列]绑定、安全模式与客户端凭证类型:BasicHttpBinding
- 江西省建设工程安全质量监督管理局全省工程安全质量信息数据维护升级存储及异地备份项目中标公告
- 客户端登录域出现“指定域的名称或安全标识SID与该域的信任信息不一致”的错误信息
- 通过信息隔离墙来提高Exchange数据安全,互联网营销
- 学习笔记之 WCF安全(1) SSL安全,无客户端验证(wsHttpBinding)
- 学习笔记之 WCF安全(6) 数字证书 自定义证书验证+ 客户端 证书验证(wshttpBinding)
- Android 客户端通过内置API(HttpClient) 访问 服务器(用Spring MVC 架构) 返回的json数据全过程