天下武功唯快不破

来源:互联网 发布:新型数字滤波算法 编辑:程序博客网 时间:2024/04/28 23:54
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,:

查看源码也能得到这句话:注释的重要性:<!-- please post what you find with parameter:key -->==$0

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

3.看看报文


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

import requestsimport base64url = 'http://ctf5.shiyanbar.com/web/10/10.php's = requests.session()response = s.get(url)head = response.headersflag = 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来控制访问了。