[HNCTF 2022 WEEK2]easy_include+[NCTF 2018]全球最大交友网站
https://www.ctfer.vip/problem/2948
大家好,这里是wl,很抱歉托更那么久,当然虽然有很多理由,但是自己也懒过一段时间,前段时间盲于甲流恢复和考研准备,这段时间正在补请假的课程和作业,很抱歉自己荒废了那么久,这是对自己的不负责也是对大家的不负责,再次抱歉。当然最近实验很多,自己在周更之外可能写wp的频率比较低,更多的是复习考研知识,然后学c(因为复试只考c),当然自己也不会落下学习ctf知识,在遇到比较有意思或者以前没提到过的知识时自己也会顺手写一下wp的。

言归正传,发现太久没上,nss平台多了很多新功能,感慨自己闲了太久了。
[HNCTF 2022 WEEK2]easy_include
hint:WEB 文件包含

这可能是新生赛?直接搜索的话确实能搜到payload,但是这里我们还是老实自己做一次看看有没有思路,那么看似比较简单的文件包含,过滤了诸多伪协议后其实并未剩下很多东西,这里涉及到一个以前没提过,或者提过我自己忘了的知识:
日志包含:
https://www.cnblogs.com/GTL-JU/p/16831597.html
日志包含漏洞属于是本地文件包含,同样服务器没有很好的过滤,或者是服务器配置不当导致用户进入了内网,本来常规用户是访问不了这些文件的,但由于发起访问请求的人是服务器本身,也就导致用户任意文件读取
apache服务器日志存放文件位置:/var/log/apache/access.log
nginx服务器日志存放位置:/var/log/nginx/access.log和/var/log/nginx/error.log
两者的回显并不相同,apache会存放我们的url参数在访问时回显,这使得我们可以在url后接一句话木马并执行。
而这道题是nginx服务器,可以看到回显的是ua报文头,同理,我们在ua头构造一句话木马
当然,这里执行的前提都是包含了对应的日志文件,且服务器有对应的漏洞。
大家也可以自己用phpstudy自行测试一下,直接构造命令执行也应该能起作用。

那么这里你抓包或者用hackbar工具这些也应该能行,这里也学到了小技巧,ctrl U进入源代码查看可以看的更明显,当然这里ls后直接看到了flag名字,直接抓就行了

"GET /?file=/var/log/nginx/access.log&wl=system(%27cat/ffflllaaaggg%27); HTTP/1.1" 200 510 "http://43.143.7.127:28304/" "flag=NSSCTF{5c942e8b-2e1d-49a0-98c3-65d39822929e}
这里再试验一下直接在ua头进行命令执行,这里命令太多于是重开一下环境:

看到一样执行成功,只不过在exec后要进行ctrl U然后刷新一下,或者在原网站刷新一下也行。

这道题还是比较简单,主要是提一下没讲过的日志文件包含。

靠,我发现有些题开题要金币了,我第一天签到只有25,还开不了
[NCTF 2018]全球最大交友网站
hint: WEB git泄漏

点开下面三个文件夹都没看到啥东西,下载a.zip看到了.git,那应该就是这个文件了。
这里再讲一下以前没讲的git泄露:
https://blog.csdn.net/wulanlin/article/details/122409259
首先了解一下git泄露原理:
Git是一个开源的分布式版本控制系统 ,我们简单的理解为Git 是一个内容寻址文件系统,也就是说Git 的核心部分是键值对数据库。 当我们向 Git 仓库中插入任意类型的内容(开发者们在其中做的版本信息修改之类的操作),它会返回一个唯一的键,通过该键可以在任意时刻再次取回该内容
攻击者利用该漏洞下载.git文件夹中的所有内容。如果文件夹中存在敏感信息(数据库账号密码、源码等),通过白盒的审计等方式就可能直接获得控制服务器的权限和机会!
当然要利用git泄露首先还是得了解一下git结构和一些命令:
GIT结构:
.git目录:使用git init初始化git仓库的时候,生成的隐藏目录,git会将所有的文件,目录,提交等转化为git对象,压缩存储在这个文件夹当中。
COMMIT_EDITMSG:保存最新的commit message,Git系统不会用到这个文件,用户一个参考文件
config:Git仓库的配置文件
description:仓库的描述信息,主要给gitweb等git托管系统使用
HEAD:这个文件包含了一个档期分支(branch)的引用,通过这个文件Git可以得到下一次commit的parent
hooks:这个目录存放一些shell脚本,可以设置特定的git命令后触发相应的脚本;在搭建gitweb系统或其他
git托管系统会经常用到hook script(钩子脚本)
index:这个文件就是我们前面提到的暂存区(stage),是一个二进制文件
info:包含仓库的一些信息
logs:保存所有更新的引用记录
objects:所有的Git对象都会存放在这个目录中,对象的SHA1哈希值的前两位是文件夹名称,后38位作为对象文件名
refs:这个目录一般包括三个子文件夹,heads、remotes和tags,heads中的文件标识了项目中的各个分支指向的当前commit
ORIG_HEAD:HEAD指针的前一个状态
git命令:
git init 初始化一个git仓库
git add && git commit //git 添加文件和提交文件
git status 查看当前仓库状态和内存状态
git ls-files -u 显示冲突的文件,-s是显示标记为冲突已解决的文件
git diff 对比工作区和stage文件的差异
git diff -cached 对比stage和branch之间的差异
git ls-files -stage 检查保存在stage的文件
git log 显示到HEAD所指向的commit为止的所有commit记录
git reset -hard HEAD放弃工作区和index的改动,HEAD指针仍然指向当前的commit
这里还是比较建议自己整个git自己搞来熟悉一下,当然你要用本题的git来试验也不是不行。
git泄露的几种题型:
普通git泄露:没有别的花里胡哨的操作,全是运用工具或脚本获取网站源码或者flag。
回滚git泄露:因为git版本更新啥的以前的flag文件可能就无了,而我们可以利用git reset命令查看git版本变化时每次提交的commit修改值查看修改的文件然后来回溯到对应版本
其他泄露:在.git/config文件夹中可能含有access_token信息,从而可以访问这个用户的其他仓库。
git分支:在每次提交时,git都会自动把它们串成一条时间线,这条时间线就是一个分支。而git允许使用多个分支,从而让用户可以把工作从开发主线上分离出来,以免影响开发主线。如果没有新建分支,那么只有一条时间线,即只有一个分支,git中默认为master分支。因此,我们要找的flag或敏感文件可能不会藏在当前分支中,这时使用“git log”命令只能找到在当前分支上的修改,并不能看到我们想要的信息,因此需要切换分支来找到想要的文件。
那么这里的类型是回滚git泄露
这里我发现我windows么安git,于是在kali上跑。
首先git log 查看版本,发现只有三个,还好,还有tag:1.0 难道意思是在第一个?

这里发现刚才看的博客有些问题,这里感谢:
https://www.ctfer.vip/note/set/604
git reset –-soft:回退到某个版本,只回退了commit的信息,不会恢复到index file一级。如果还要提交,直接commit即可;
git reset -–hard:彻底回退到某个版本,本地的源码也会变为上一个版本的内容,撤销的commit中所包含的更改被冲掉;
这里HEAD可能是因为看到了hint,读取一下提示

提示在tag1.0里,于是回溯:

这里直接看到了flag,当然为什么第一个可以直接用HEAD第二个却需要加commit值,这里还需要自己去了解一下,也把这个问题留给大家。
靠,这里flag不对,真flag在最后一个没看的版本,也就是时期在最早的版本,原来1.0是这个意思?我说为什么good中间那么多0

这段时间我看到了很多留言,有些留言是提示我的错误,有的则是没有仔细看我的wp,有的提出的疑惑由于时间已久我也有些不解但又觉得提的问题没什么必要再回去深究,因此留言并未一一回复,在这里感谢留言的朋友。
那么,感谢你的观看,希望你能学到一点东西。
我们下一题再见!