背景
应同学的要求,帮忙刷票。我上去看了一下,对方网站做了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成功!
http://blog.csdn.net/intel80586/article/details/8906779
相关推荐
标题“Chrome插件:X-Forwarded-For Header”揭示了本文将深入探讨一个专门针对Google Chrome浏览器的扩展应用,该插件的主要功能是处理和设置HTTP头中的`X-Forwarded-For`字段。`X-Forwarded-For`(简称XFF)头是一...
例如,"X-Forwarded-For: client1, proxy1, proxy2" 这样的格式表明client1是客户端的IP,proxy1和proxy2分别是两个代理服务器的IP。 XFF的主要作用在于: 1. **识别客户端IP**:在多层代理环境中,服务端无法直接...
结合HTTP扩展请求头 X-Forwarded-For 可以对客户端IP进行伪造 X-Forwarded-For 是一个 HTTP 扩展头部,用来表示HTTP请求端真实 IP,HTTP/1.1 协议并没有对它的定义,但现如今X-Forwarded-For已被各大 HTTP 代理、...
《X-Forwarded-For与Nginx反向代理中的IP追踪详解》 在现代互联网环境中,由于代理服务器和负载均衡器的广泛应用,追踪HTTP请求的真实来源变得复杂。此时,`X-Forwarded-For`头部字段就显得尤为重要。本文将深入...
这篇教程将深入探讨如何在Python中编写一个简单的脚本来利用`X-Forwarded-For`字段绕过IP限制访问页面。 `X-Forwarded-For`(XFF)是一个非标准但广泛使用的HTTP扩展头部,主要用于记录客户端的真实IP地址。在负载...
首先,它允许恶意用户通过设置X-FORWARDED-FOR头部伪造自己的IP地址。因为HTTP_X_FORWARDED_FOR是客户端或其代理设置的,服务器端无法验证头部信息的真实性。这就造成了一旦使用了HTTP_X_FORWARDED_FOR来获取IP地址...
攻击者可能通过伪造X-Forwarded-For头部信息来进行IP欺骗。因此,在需要高安全性验证的场景下,依赖X-Forwarded-For头部信息时应当谨慎,并结合其他安全措施一起使用。 总之,正确地获取客户端真实IP地址对于Web...
在这个例子中,`1.php`设置了`X-FORWARDED-FOR`和`CLIENT-IP`来伪造IP,并设置了`CURLOPT_REFERER`来伪造来源页。`2.php`则通过`getClientIp()`函数获取IP,并直接读取`$_SERVER["HTTP_REFERER"]`获取`referer`信息...
- **IP伪造**: 通过构造HTTP请求的头部信息,攻击者可以轻易地伪造`HTTP_X_FORWARDED_FOR`和`HTTP_CLIENT_IP`的值,从而冒充任意IP地址。 - **安全漏洞**: 如果服务端直接将获取到的IP地址信息用于安全控制(如IP...
- 在处理`X-Forwarded-For`头部时,需要特别注意可能存在的伪造问题。恶意用户可能会修改这个头部,使得系统无法准确识别客户端的真实IP地址。 - 在实际应用中,还需要考虑到多层代理的情况,即客户端的请求可能经过...
- 代理和X-Forwarded-For标头:在通过代理服务器访问Web应用时,请求可以携带X-Forwarded-For标头,用以表明原始的访问者IP地址。 - 通过代理绕过IP限制:通过合理配置HTTP请求头中的X-Forwarded-For、X-Forwarded...
用协议头欺骗服务器,来造成伪造IP地址的效果!
在get_client_ip()函数中,我们可以看到获取的X_real_ip、X_Forwarded_For是用户可控的,存在客户端IP地址可伪造的风险。 rules目录中的whiteip.rule的默认配置为[{"Id":74,"RuleType":"whiteip","RuleItem":"8.8....
例如,如果 `X-Forwarded-For` 的值为 `"192.168.1.1, 192.168.1.2, 192.168.1.3"`,那么原始客户端的 IP 地址是 `"192.168.1.1"`。 #### 安全性考虑 - **防止伪造**:客户端可以设置这些头部,因此不能完全信任...
通过设置`X_FORWARDED_FOR`和`CLIENT_IP`字段来伪造IP地址。 #### 注意事项 - 在实际应用中,伪造IP地址和HTTP_REFERER可能会受到服务器端的安全策略限制,因此这种方法可能并不总是有效。 - 大多数现代网站都会...
日志中提到伪造这两个字段,特别是`X-Forwarded-For`设为特定IP地址,并且`Referer`必须来源于谷歌,这可能是防御机制的一部分。 5. **Webshell**: Webshell是一段植入到服务器上的恶意代码,通常用于远程控制。...
- **X-Forwarded-For**: 该字段主要用于代理服务器,在转发请求时会附加原始客户端的IP地址。通过设置该字段,可以在不直接更改`REMOTE_ADDR`的情况下欺骗服务器认为请求来自不同的IP地址。 #### 知识点三:使用PHP...
'X-Forwarded-For: 192.168.1.1', // 伪造的IP地址 'Client-IP: 192.168.1.1' // 同样的,也可以用这个头部 )); $response = curl_exec($ch); curl_close($ch); // 处理响应... ?> ``` 此外,`CSDN.NET.url`可能...
1. `request.getHeader("x-forwarded-for")`: 这是常见的负载均衡器或反向代理服务器(如Nginx、Apache等)添加的头字段,用来传递原始客户端IP。如果使用了这些中间设备,这个字段通常会包含真实IP。 2. `request....
这样,在服务器端,可以通过 `request.getHeader("x-forwarded-for")` 获取到伪造的 IP 地址。 需要注意的是,伪造 IP 地址并不是真正地修改了客户端的 IP 地址,而是通过修改 HTTP 请求头中的信息来欺骗服务器端。...