首页提示:

You'll be rewarded with a flag if you can make it over some /hurdles.

修改url,尾后加上/hurdles,提示:

I'm sorry, I was expecting the PUT Method.

这个还挺简单的,让我们修改请求方式为PUT,抓包修改:

I'm sorry, Your path would be more exciting if it ended in !

这个提示有点离谱,但是肯定是和路径(path)有关,想让输入的路径,刺激(?)一点?

但直接输入任何非“/hurdles”的路径又会报:

You'll be rewarded with a flag if you can make it over some /hurdles.

所以再加一个目录,以”!“结尾:

在”!“后构造get=flag:/hurdles/!?get=flag

I'm sorry, I was looking for a parameter named &=&=&

传入”&=&=&“之前需要对其进行url编码,得%26%3D%26%3D%26,最后加上任意值:

I'm sorry, I expected '&=&=&' to equal '%00
 '

这里的提示是其实仔细观察可以发现是两行,阴滴狠。%2500进行URL解码之后就是%00,最后加上换行符%0a

I'm sorry, Basically, I was expecting the username player.

提示希望有用户名,涉及到的知识点是HTTP基础认证:

HTTP中,基本认证(英語:Basic access authentication)是允许http用户代理(如:网页浏览器)在请求时,提供用户名 和口令 的一种方式。

使用curl工具进行认证,使用-u参数填入用户名和密码,填入的时候输入username错了很久,最后反应过来应该是用户名player密码player:

curl -X PUT 'http://node3.buuoj.cn:25896/hurdles/!?get=flag&%26%3D%26%3D%26=%2500%0a' -u 'player':'player'

这个提示很明显的,想要的密码的值为md5(”open sesame“):

curl -X PUT 'http://node3.buuoj.cn:25896/hurdles/!?get=flag&%26%3D%26%3D%26=%2500%0a' -u 'player':'54ef36ec71201fdf9d1423fd26f97f6b'

提示:

I'm sorry, I was expecting you to be using a 1337 Browser.

这个比较简单,修改UA,curl工具中,-A参数用来指定客户端的浏览器。

curl -X PUT 'http://node3.buuoj.cn:25896/hurdles/!?get=flag&%26%3D%26%3D%26=%2500%0a' -u 'player':'54ef36ec71201fdf9d1423fd26f97f6b' -A 1337

提示:

I'm sorry, I was expecting your browser version (v.XXXX) to be over 9000!

需要额外修改XFF,增添参数-H 'X-Forwarded-For:1.1.1.1',填入一个会回显:

I'm sorry, I was eXpecting this to be Forwarded For someone through another proxy!

查找资料:

标准格式如下:X-Forwarded-For: client1, proxy1, proxy2。从标准格式可以看出,X-Forwarded-For头信息可以有多个,中间用逗号分隔,第一项为真实的客户端ip,剩下的就是曾经经过的代理或负载均衡的ip地址,经过几个就会出现几个。

这里连踩三个坑:

添加Cookie使用的参数是-b,值为Fortune

curl -X PUT 'http://node3.buuoj.cn:25896/hurdles/!?get=flag&%26%3D%26%3D%26=%2500%0a' -u 'player':'54ef36ec71201fdf9d1423fd26f97f6b' -A 1337v.9000 -H 'X-Forwarded-For: 13.37.13.37,127.0.0.1' -b 'Fortune=1'

提示:

I'm sorry, I was expecting the cookie to contain the number of the HTTP Cookie (State Management Mechanism) RFC from 2011.

需要Cookie中包含2011年的RFC编号,谷歌一下是6265^^

希望只接受纯文本(MIME)形式的请求:

I'm sorry, I expect you to accept only plain text media (MIME) type.

和XFF那个一样,加个-H参数:

curl -X PUT 'http://node3.buuoj.cn:25896/hurdles/!?get=flag&%26%3D%26%3D%26=%2500%0a' -u 'player':'54ef36ec71201fdf9d1423fd26f97f6b' -A 1337v.9000 -H 'X-Forwarded-For: 13.37.13.37,127.0.0.1' -b 'Fortune=6265' -H 'Accept:text/plain'

最后居然出来了俄语0.0:

Я ожидал, что вы говорите по-русски.(我希望你会说俄语。)

添加参数:-H ‘Accept-Language:ru’

Origin Header 存在于请求中,用于指明当前请求来自于哪个站点。

最后希望Referer是https://ctf.bsidessf.net/challenges,继续加-H:

curl -X PUT 'http://node3.buuoj.cn:25896/hurdles/!?get=flag&%26%3D%26%3D%26=%2500%0a' -u 'player':'54ef36ec71201fdf9d1423fd26f97f6b' -A 1337v.9000 -H 'X-Forwarded-For: 13.37.13.37,127.0.0.1' -b 'Fortune=6265' -H 'Accept:text/plain' -H 'Accept-Language:ru' -H 'Origin:https://ctf.bsidessf.net' -H 'Referer:https://ctf.bsidessf.net/challenges'

返回只有”Congratulations!“,猜测flag隐藏在响应头中,使用-i参数查看响应头具体信息:

总结:

  • %2500进行URL解码之后就是%00
  • curl工具使用-u参数进行基本验证。
  • curl工具中使用-A参数指定浏览器。
  • curl工具中使用-H参数增加请求头。
  • curl工具中使用-b参数添加Cookie。
  • 请求头中,Origin指明当前请求来自于哪个站点。
  • curl工具中使用-i参数显示响应头信息。