攻防世界题目练习——Web引导模式(三)(持续更新)

题目目录

1. mfw

进去看到网页和页面内容如下:

看到url的参数 ?page=about ,我以为是文件包含什么的,反复试了几次,想用 .../.../.../.../etc/passwd ,但是发现.似乎被过滤了,实在不知道怎么做了,于是找了几篇解题博客:
攻防世界-mfw-(详细操作)做题笔记
攻防世界----mfw

看了博客才知道,存在一种git源码泄露漏洞,相关知识见博客:WEB安全-常见源码泄露 | wh1te

git源码泄露是:

当在一个空目录执行 git init 时,Git 会创建一个 .git 目录。 这个目录包含所有的 Git 存储和操作的对象。

利用方式:

github上的githack可以把整个.git备份的文件下载下来。它能解析 .git/index 文件,并找到工程中所有的:文件名和文件 sha1,然后去 .git/objects/ 文件夹下下载对应的文件,通过 zlib 解压文件,按原始的目录结构写入源代码。

于是用url/.git访问,可以看到显示了许多文件,可能是源代码文件。

看了几个目录没有看到flag相关的。

博客说用githacker下载文件,于是我按照博客攻防世界-mfw-(详细操作)做题笔记中使用githacker下载文件时的路径在我的kali中找githacker,没找到,于是参考别的博客去下载githack:
GitHack在kali Linux环境下的下载与安装

下载完成后,因为看到前面的参考博客里是用的__init__.py文件来下载,于是在我下载的githacker-master的目录下的lib目录中找到了这个文件,按照那篇博客上的命令还是没法下载。想到那篇教下载的博客上最后的步骤:

bash 复制代码
python2 GitHack.py http://challenge-efb678740fb6553d.sandbox.ctfhub.com:10800/.git

用的是python2 GitHack.py url/.git,于是用这个命令尝试,终于成功了,下载存放的位置在GitHacker-master的dist目录下,为了方便我把文件夹更名为了GitHack,如下图:

可以看到里面有一个文件flag.php,打开看里面什么都没看到。里面唯一有有价值信息的就是index.php文件(和templates文件夹在同一目录下,上图未展示),打开查看如下:

可以看到红框框出的部分是两个assert断言,其中第一个的注释"I heard '...' is dangerous!",以及assert中将 '$file' 和 '...' 做匹配,可以解释我在一开始发现的.被过滤掉了的情况,第二个assert是判断文件是否存在。

我们直接访问flag.php的话是可以访问的,但是没有内容显示。

我们要绕过第一个assert的判断。

在源码中可以看到如下:

php 复制代码
$file = "templates/" . $page . ".php";

assert("strpos('$file', '..') === false") or die("Detected hacking attempt!");

将$file的值代入进去就是:

php 复制代码
assert("strpos('templates/$page.php', '..') === false") or die("Detected hacking attempt!");

我们需要让后面和 '...'进行比较的部分失效,就需要用到 // 将后面的内容注释掉,并用')来与strpos()函数的前半部分('templates/进行闭合。

这里我将几篇参考博客结合起来看:

博客1:攻防世界----mfw

博客2:【攻防世界】十八、mfw

在博客3讲的拼接不是很详细,没太懂这样构造之后在代码中是怎么拼接的,于是看了博客1.

博客1对于拼接的替换构造讲的挺清楚,但是我不理解为什么这个博主构造的拼接内容templates前面为什么会有两个单引号:

于是我又查看了博客2,这个构造的拼接后的内容和我理解的一样:

在博客3的评论区中我了解到,这里的.是链式拼接:

在返回的源码中可以看到flag:

在linux下没法直接看到flag.的内容,猜测可能是因为php文件有些内容要在网页中才能显示?

再来尝试一下用or system('cat templates/flag.php');//,发现用or system只显示了一次flag,如下图:

博客1对于这个的解释是这样的,但我还是没看懂为什么:

但是我仍然有个疑问,在page=').system('cat templates/flag.php');//拼接之后,assert的")也被注释掉了,这样为什么可以正常执行后面的system命令呢。

所以我想试试page=')) or system('cat templates/flag.php');//,用两个括号,把assert也闭合掉看看。

失败了,不行诶,有点没搞懂。

又仔细看了看博客1,说的是 "利用assert()函数执行cat ./template/flag.php获得flag" 。但是注释符不是会把后面的内容全部注释掉吗,这样的话怎么利用assert()函数呢,真的迷惑,后面再好好思考一下吧。

2.

3.

4.

5.

相关推荐
遂心_2 分钟前
用React Hooks + Stylus打造文艺范的Todo应用
前端·javascript·react.js
轻语呢喃6 分钟前
<a href=‘ ./XXX ’>,<a href="#XXX">,<Link to="/XXX">本质与区别
前端·react.js·html
用户3802258598246 分钟前
vue3源码解析:watch的实现
前端·vue.js·源码
F2E_Zhangmo10 分钟前
第一章 uniapp实现兼容多端的树状族谱关系图,创建可缩放移动区域
前端·javascript·uni-app
鹏程十八少11 分钟前
3. Android 第三方框架 Okhttp, Retrofit 的动态代理和适配器模式深度解读三
前端
阿怼丶11 分钟前
🚶‍♂️基于 Three.js 的自定义角色漫游系统实战:支持碰撞检测与动画控制
前端·three.js
写字楼里看日出13 分钟前
Electron入门教程:零基础手把手教你将网页打包成桌面应用
前端·javascript
张志鹏PHP全栈15 分钟前
TypeScript 第七天,TypeScript和webpack如何搭配使用
前端·typescript
前端付豪15 分钟前
19、高并发与大数据量下的前端架构优化
前端·javascript·架构
前端付豪16 分钟前
20、模块拆分、包管理与微前端架构实战
前端·javascript·架构