天下武功唯快不破

http://www.shiyanbar.com/ctf/1854
天下武功唯快不破
看看响应头
格式:CTF{ }
解题链接: http://ctf5.shiyanbar.com/web/10/10.php


解:

题目提示:看看响应头
1.在软件开发中,我们有时会需要查看某网页请求的头部数据。尤其是POST方法的数据。使用POST方式怎么看报文:

http://jingyan.baidu.com/article/a3761b2b8458321576f9aaf8.html按F12找到network---》F5刷新得到数据流点开====》找到header

      2. 点击链接后按了F12,:

查看源码也能得到这句话:注释的重要性:==$0

这句话的意思就是,请post参数那就是key.==flag

3.看看报文

天下武功唯快不破_第1张图片

Connection:Keep-Alive
Content-Length:216
Content-Type:text/html
Date:Fri, 18 Aug 2017 01:54:00 GMT
FLAG:UDBTVF9USElTX1QwX0NINE5HRV9GTDRHOnVqdUJRellhNQ==
Keep-Alive:timeout=5, max=100
Server:Apache/2.4.18 (Win32) OpenSSL/1.0.2e PHP/5.2.17
X-Powered-By:PHP/5.2.17
 flag=UDBTVF9USElTX1QwX0NINE5HRV9GTDRHOlY1QTBiWHg0eA==
4.   Base64解码:发现了一个FLAG参数是用base64编码的,解码后内容是:P0ST_THIS_T0_CH4NGE_FL4G:Hrd54sRiP尝试几次不行,原来FLAG是随机生成。你自己刷新就知道。怎么办,既然他提示的是快速post提交参数key,首先想到的就是写py脚本构造请求头,脚本如下:

import requests
import base64

url = 'http://ctf5.shiyanbar.com/web/10/10.php'
s = requests.session()
response = s.get(url)
head = response.headers
flag = base64.b64decode(head['FLAG'])
print(flag)
flag=flag.split(b':')[1]
print(flag)
data = {'key': flag}
result = s.post(url=url, data=data)
print(result.text)


参考别人实践:https://www.cnblogs.com/sherlock17/p/6707136.html
想了想他的后台操作应该是这样的:客户端get请求该地址,服务端收到请求会随机生成一个的字符串,加密后作为返回报文的FLAG字段,即base64加密的key值, 同时,后台会将加密前的该值存入数据库,这里会有一个时间判断,超过3s会从数据库中删除,若客户端在3s内获取key值并将他作为参数post后,后台会从数据库中取出 进行匹配,匹配成功将会获取flag,但是,从数据库中取出时需要分辨是哪个用户在什么时候的(同一个用户可以做连续多次的get请求),所以这里在数据库中的一定有 一个ip字段做索引,即做请求操作的ip与对应生成的随机字符串存入数据库,当用户post后会根据该用户的ip来取对应的字符串,与post的字符串做匹配,这样,就可以不 用session来控制访问了。

天下武功唯快不破_第2张图片




你可能感兴趣的:(天下武功唯快不破)