背景

应同学的要求,帮忙刷票。我上去看了一下,对方网站做了IP限制,一天之内一个IP只能投一票,并没有使用cookie校验,验证码校验等技术,总体来说这个网站的情况是比较常见的,常见的解决办法有两个:

使用大量的真实IP刷票

如果你使用的是一个拨号上网的网络,每次的拨号都能随机分配IP,这种情况下,可以使用投票一次,拨号一次的方法来实现刷票,但这个方案有两个问题:
1. 编程稍微复杂,而且运行效率低。由于涉及到拨号上网的编程,以及断开网络链接到重新拨号上网是需要相对很长的时间的,因此编程复杂而且效率不高。
2. 由于每个ISP的IP分配池都是有限的,当你所在的IP池容量较小时,你能够分配的IP也是很少的,因此可能无法大量刷票,这个也是潜在的风险。

伪造IP刷票

如何做到伪造IP是个难题。TCP/IP层级别的伪造,我是不会的(至少目前如此)。因此只能想着在应用层伪造了。上网查了一下资料,发现通过使用HTTP的X-Forwarded-For头可以成功欺骗多数应用程序。

认识X-Forwarded-For

X-Forwarded-For(XFF)是用来识别通过HTTP代理或负载均衡方式连接到Web服务器的客户端最原始的IP地址的HTTP请求头字段。 Squid 缓存代理服务器的开发人员最早引入了这一HTTP头字段,并由IETF在Forwarded-For HTTP头字段标准化草案中正式提出。
这一HTTP头一般格式如下:

X-Forwarded-For: client1, proxy1, proxy2

其中的值通过一个 逗号+空格 把多个IP地址区分开, 最左边(client1)是最原始客户端的IP地址, 代理服务器每成功收到一个请求,就把请求来源IP地址添加到右边。 在上面这个例子中,这个请求成功通过了三台代理服务器:proxy1, proxy2 及 proxy3。


关于X-Forwarded-For的详细资料,可以参考wiki

应用程序为何会上当受骗

很多知名的大型的PHP软件中都使用了类似下面的代码:

        if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) { $onlineip = getenv('HTTP_CLIENT_IP'); } elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) { $onlineip = getenv('HTTP_X_FORWARDED_FOR'); } elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) { $onlineip = getenv('REMOTE_ADDR'); } elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) { $onlineip = $_SERVER['REMOTE_ADDR']; }     

这段代码充分考虑了PHP兼容性/平台兼容性/中间代理等诸多情况,不愧是大家之作。一般的程序员比如我,就不知道这里的getenv('HTTP_X_FORWARDED_FOR')这个是什么意思,虽然现在知道了,但是突然觉得这段代码还是有问题的,这里的getenv('HTTP_X_FORWARDED_FOR')只能正确的处理单个中间HTTP代理的情况,当多个代理出现时,这个获得的IP将是一个多个IP组成的字符串(IP之间有逗号分隔开)。

这段代码优先考虑了有代理情况下,如何获取真实IP的情况,本身思考的非常周全,但是由于HTTP_X_FORWARDED_FOR的头伪造起来很容易,所以伪造IP起来也就容易多了,以下是一个Python的示例,用于显示如何利用HTTP_X_FORWARDED_FOR伪造IP:

        import sys, httplib, urllib, random params = "value=xxx" ipAddress = "10.0.0.1" headers = { "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Encoding":"gzip, deflate", "Accept-Language":"zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3", "Connection":"keep-alive", "X-Forwarded-For":ipAddress, "Content-Length":"31", "Content-Type":"application/x-www-form-urlencoded", "User-Agent":"Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko/20100101 Firefox/11.0" } con2 = httplib.HTTPConnection("10.0.0.2") try: con2.request("POST", "/xxx.php", params, headers) except Exception, e: print e sys.exit(1) r2 = con2.getresponse() print r2.read()     

这个请求在应用程序中获得的IP将会是上面ipAddress变量的值,因此伪造IP成功!

伪造 X-Forwarded-For相关推荐

  1. [Web/IP]真实IP获取原理/客户端IP伪造测试

    真实IP获取和客户端IP伪造 近期比赛又做到了用户IP伪造的题目,想来不如就总结一下. 为什么要确认IP? 在Web应用下,部分逻辑需要确认用户的客户端IP.如对大量频繁发送危险请求的IP进行封禁. ...

  2. Spring security防止跨站请求伪造(CSRF防护)

    因为使用了spring security 安全性框架 所以spring security 会自动拦截站点所有状态变化的请求(非GET,HEAD,OPTIONS和TRACE的请求),防止跨站请求伪造(C ...

  3. 所有表单对象_Laravel 表单方法伪造与 CSRF 攻击防护

    1.表单方法伪造 有时候,我们可能需要手动定义发送表单数据所使用的 HTTP 请求方式,而 HTML 表单仅支持 GET 和 POST 两种方式,如果要使用其他的方式,则需要自己来定义实现. HTTP ...

  4. WordPress qTranslate插件跨站请求伪造漏洞

    漏洞名称: WordPress qTranslate插件跨站请求伪造漏洞 CNNVD编号: CNNVD-201306-058 发布时间: 2013-06-07 更新时间: 2013-06-07 危害等 ...

  5. Google Duplex语气自然流利,外媒却质疑其演示通话录音是伪造的

    译者 | 尚岩琦 出品 | AI科技大本营(公众号ID:rgznai100) 上周,Google CEO 桑达尔·皮查伊( Sundar Pichai )在 Google 年度开发者大会上发布了 Go ...

  6. 利用CNN来检测伪造图像

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 随着像Facebook和Instagram这样的社交网络服务的出现 ...

  7. 局域网伪造源地址DDoS***解决方法

    [故障现象]伪造源地址***中,***机器向受害主机发送大量伪造源地址的TCP SYN报文,占用安全网关的NAT会话资源,最终将安全网关的NAT会话表占满,导致局域网内所有人无法上网. [快速查找]在 ...

  8. 微软北大联合提出换脸 AI 和脸部伪造检测器,演绎现实版「矛与盾」?

    2020-01-07 18:28 导语:一个致力于造假,一个专注于打假 雷锋网 AI 开发者按:近日,微软研究院与北京大学的研究小组共同提出了一种全新的 AI 换脸框架 FaceShifter,以及一 ...

  9. 《每周CV论文》人脸识别难题:遮挡年龄姿态妆造亲属伪造攻击

    人脸识别系统已经大规模商业化应用,但这并意味着它就发展到顶了,剩下的都是一些难题,包括遮挡/年龄/姿态/妆造/亲属/伪造攻击等. 作者&编辑 | 言有三 1 遮挡人脸检测与识别 遮挡人脸的检测 ...

  10. 「每周CV论文推荐」 初学深度学习活体与伪造人脸检测必读的文章

    活体检测在安防与金融等使用人脸识别技术的领域中是一项非常重要的技术,本次我们介绍初学深度学习活体检测与伪造检测领域需要读的文章. 作者&编辑 | 言有三 1 Learning CNN 这是最早 ...

最新文章

  1. pandas索引和选择数据
  2. 服务器如何删除所有磁盘信息,关于怎样删除EFI分区,简单省事,很多换下来的硬盘都有这个分区...
  3. 《编程题》找出数组中出现次数超过一半的数(时间复杂度O(n),空间复杂度为O(1))
  4. 光纤铜缆测试安装的基础知识你都了解了吗?
  5. 【今日CV 计算机视觉论文速览 第109期】Wed, 1 May 2019
  6. ATM柜员机JAVA课程设计_JAVA课程设计报告银行ATM机系统.doc
  7. What's New in Qt 5.5 5.4,以及5.5 所有module
  8. 关于Ext checkboxfiled 获取值为 on的解决办法
  9. AX2012 R2安装
  10. 课程体系包括哪些要素_课程建设包括哪些内容_以课程建设为抓手,促进专业团队的发展...
  11. Window10 开启卓越性能模式
  12. 分门别类刷leetcode——二叉树和图(C++实现)
  13. 表空间的空间管理算法
  14. iQOONeo6SE和iQOONeo5SE区别 哪个好 iQOONeo6SE和iQOONeo5SE哪个值得买 两者配置对比
  15. 计算机应用技术英语音标,英语国际音标
  16. 验证性分析---相关
  17. 日历签到 java_android自定义可签到日历
  18. 高中生学python培养思维能力_python学习(七周七第二章结构化思维及如何学习)...
  19. long long 类型的网络字节顺序转换
  20. HDR学习之旅(四)—HDR10+

热门文章

  1. opencv的多图拼接
  2. HTTP/2 基础教程
  3. Matlab:逗号分隔的列表
  4. 计算机接口实验0832,0832 DA转换器实验.doc
  5. Docker安装及配置镜像加速器(一)
  6. 分享:广电用户服务大数据解决方案
  7. 线阵CCD和面阵CCD
  8. MySQL数据瘦身_mysql 案例 ~ 瘦身mysql系列(1)
  9. 大虫罗德曼的打球视频
  10. 求任一正整数的各位数字的平方和。