IP是Internet Protocol(网际互连协议)的缩写,是TCP/IP体系中的网络层协议。设计IP的目的是提高网络的可扩展性:一是解决互联网问题,实现大规模、异构网络的互联互通;二是分割顶层网络应用和底层网络技术之间的耦合关系,以利于两者的独立发展。根据端到端的设计原则,IP只为主机提供一种无连接、不可靠的、尽力而为的数据报传输服务。
$remote_addr
是nginx与客户端进行TCP连接过程中,获得的客户端真实地址. Remote Address 无法伪造,因为建立 TCP 连接需要三次握手,如果伪造了源 IP,无法建立 TCP 连接,更不会有后面的 HTTP 请求
在这道“管理员系统中”,涉及了http协议的深层知识,看到本博客的小伙伴们请自主搜索并下载相关书籍,如有需要可以评论,我会将我所学的相关书籍分享出来。
在本题中以下为我所收集的考点知识。
X-Real-IP
是一个自定义头。X-Real-Ip 通常被 HTTP 代理用来表示与它产生 TCP 连接的设备 IP,这个设备可能是其他代理,也可能是真正的请求端。需要注意的是,X-Real-Ip 目前并不属于任何标准,代理和 Web 应用之间可以约定用任何自定义头来传递这个信息
X-Forwarded-For
X-Forwarded-For 是一个扩展头。HTTP/1.1(RFC 2616)协议并没有对它的定义,它最开始是由 Squid 这个缓存代理软件引入,用来表示 HTTP 请求端真实 IP,现在已经成为事实上的标准,被各大 HTTP 代理、负载均衡等转发服务广泛使用,并被写入 RFC 7239(Forwarded HTTP Extension)标准之。
本题利用X-Forwarded-For:127.0.0.1伪造IP地址,具体原理可以看相关书籍学习。
接下来是实际操作的截图,
f12后可以发现有一段base64,解码后为test123。
首先,尝试将test作为用户名,123作为密码**,行不通。
后将test123作为密码尝试,用户名任意,发现添加X-Forwarded-For:127.0.0.1头发送请求运行后,出现了上图所示。那么密码就是正确的,接下来**用户名就行了。
过程如下,
之后在用**出来的用户名通过X-Forwarded-For:127.0.0.1伪IP发送请求就可以解出flag了。
如下。