题目:
访问靶机:http://node4.buuoj.cn:27543/
解题:
1:查看网页源代码
浏览页面,没有发现有用信息,查看源代码发现:Secret.php
2:尝试访问/Secret.php
It doesn't come from 'https://www.Sycsecret.com',即提示要增加Referer值为'https://www.Sycsecret.com'。
HTTP Referer
Http Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器借此可以获得一些信息用于处理。比如从我主页上链接到一个朋友那里,他的服务器就能够从HTTP Referer中统计出每天有多少用户点击我主页上的链接访问他的网站。
Referer作用:
(1)防盗链:比如某个网站的图片是保存在图片服务器或者云端,假如地址为:http://static.yun.com/img.jpg,我们可以在此图片服务器检查referer的值是否为http://example.com/,是就通过,不是就拒绝访问。这样子的话,只有从http://example.com/中链接过来的请求才可以访问此图片。
(2)访问统计:比如www.hao123.com中有好多门户官网的链接;当我们点击“京东”的时候,京东的服务端就可以发现当前该用户请求是从www.hao123.com中链接过来的,就可以很方便的统计到用户来源。
一般以下几种情况是不会发送Referer:1、用户手动输入网址或是从收藏夹/书签中访问。2、页面从Https跳转到Http。
3:增加Referer
利用Burp Suite抓取http://node4.buuoj.cn:29928/Secret.php链接请求信息,并增加Referer:https://www.Sycsecret.com,点击Send。
发现响应信息提示:Please use "Syclover" browser,即需要增加User-Agent。
HTTP User-Agent
User-Agent会告诉网站服务器,访问者是通过什么工具来请求的,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。
通用格式:Mozilla/5.0 (平台) 引擎版本 浏览器版
例 如:User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3100.0 Safari/537.36
Mozilla/5.0:由于历史上的浏览器大战,当时想获得图文并茂的网页,就必须宣称自己是 Mozilla 浏览器。导致如今User-Agent里通常都带有Mozilla字样。
平台:可由多个字符串组成,用分号分开。Windows NT 10.0是指我使用的操作系统的版本为win10,Win64; x64是指我的操作系统是64位的。
引擎版本:AppleWebKit/537.36 (KHTML, like Gecko),浏览器使用的主流渲染引擎有:Gecko、WebKit、KHTML、Presto、Trident、Tasman等。
浏览器版本:Chrome/60.0.3100.0 Safari/537.36,显示浏览器的真实版本信息,格式为:浏览器/版本信息。
4:增加User-Agent
增加:User-Agent:Syclover
发现提示信息:“No!!! you can only read this locally!!!”,即需要增加X-Forwarded-For:127.0.0.1。
HTTP X-Forwarded-For
X-Forwarded-For 是一个 HTTP 扩展头部,用来表示 HTTP 请求端真实 IP。与之相关的有X-Real-IP、 $remote_addr。
X-Real-IP 是一个自定义头。X-Real-Ip 通常被 HTTP 代理用来表示与它产生 TCP 连接的设备 IP,这个设备可能是其他代理,也可能是真正的请求端。需要注意的是,X-Real-Ip 目前并不属于任何标准,代理和 Web 应用之间可以约定用任何自定义头来传递这个信息。
$remote_addr 是nginx与客户端进行TCP连接过程中,获得的客户端真实地址。Remote Address 无法伪造,因为建立 TCP 连接需要三次握手,如果伪造了源 IP,无法建立 TCP 连接,更不会有后面的 HTTP 请求。
格式:X-Forwarded-For: client, proxy1, proxy2 (client是离服务端最远的设备 IP,proxy1,proxy2是每一级代理设备的 IP。)
例如:如果一个 HTTP 请求到达服务器之前,经过了三个代理 Proxy1、Proxy2、Proxy3,IP 分别为 IP1、IP2、IP3,用户真实 IP 为 IP0,那么按照 XFF 标准,服务端最终会收到以下信息:X-Forwarded-For: IP0, IP1, IP2。
流程:(1)用户IP0---> 代理Proxy1(IP1),Proxy1记录用户IP0,并将请求转发个Proxy2时,带上一个Http Header,X-Forwarded-For:IP0
(2)Proxy2收到请求后读取到请求有 X-Forwarded-For:IP0,然后proxy2 继续把链接上来的proxy1 ip追加到 X-Forwarded-For 上面,构造出X-Forwarded-For:IP0, IP1,继续转发请求给Proxy 3。
(3)同理,Proxy3 按照第二部构造出 X-Forwarded-For:IP0, IP1, IP2,转发给真正的服务器,比如NGINX,nginx收到了http请求,里面就是 X-Forwarded-For: IP0, IP1, IP2 。所以Proxy 3 的IP3,不会出现在这里。
(4)nginx 获取proxy3的IP 能通过remote_address就是真正建立TCP链接的IP,这个不能伪造,是直接产生链接的IP。$remote_address 无法伪造,因为建立 TCP 连接需要三次握手,如果伪造了源 IP,无法建立 TCP 连接,更不会有后面的 HTTP 请求。
5:增加X-Forwarded-For
增加:X-Forwarded-For:127.0.0.1
得到flag。