山东省新一代攻防赛wp

前言

打聊城的比赛,又白给了,拿了参与奖,做出来两个misc,剩下两个misc都做了快一半,没思路了,特来复现。

web

web1

打开之后是一个登陆页面,查看源码发现了测试账号test/test

查看robots.txt 发现php.php 发现是phpinfo。

登录之后发现可能存在LFI,然后上了下扫描器,扫到了一些文件,尝试包含info.php,得到源码,然后发现了include了template/info.html,于是访问。查看源码发现了hint m4nageee.php。然后读manage的源码,在源码中发现包含了2333.html,于是访问。

查看源码时发现了php代码,尝试PHP session文件包含。

但是需要session的存放位置,于是通过扫描到的php.php查看session日志的存放位置/var/lib/php5,遂包含之。

在m4nageee里面写nickname到session文件里面,利用LFI包含getshell。

当前我的phpsessid为0u335c2ud2h9gjq0lq6nos1i72

所以session文件就是/var/lib/php5/sess_0u335c2ud2h9gjq0lq6nos1i72,包含即可。

nikename里面写

1
2
3
4
5
6
7
8
 <?php system("cat fla*"); ?>
即可绕过对flag的过滤

或者这样写

<?php system("cat fl\ag_0ba7bc92fcd57e337ebb9e74308c811f"); ?>

等等。。

web2 web3

题目提示使用sqlmap注入,但是我注入巨拉跨。。而且数据库是sqlite的,我只会一点mysql的注入。。当时没做出来,赛后复现下。

这题是使用cookie注入。我明确地知道自己不会用sqlmap进行cookie注入。

不会 跟官方的思路没复现出来,等wp。

这里放下济大师傅的web2 web3的payload:

Cookie: PHPSESSID=da55nb2kgsge2luvc5m53k5r90; username=test; password=test’ OR 1=1 LIMIT 1 OFFSET 1 –

password=test’ OR 1=1 LIMIT 1 OFFSET 1 – ; userinfo=eyJ1c2VybmFtZSI6InRlc3QiLCJwYXNzd29yZCI6InRlc3QnIE9SIDE9MSBMSU1JVCAxIE9GRlNFVCAxIC0tICJ9Cg%3D%3D

misc

ez_decode

简单的编码转换:

1
&#54;&#54;&#54;&#99;&#54;&#49;&#54;&#55;&#55;&#98;&#54;&#54;&#51;&#57;&#54;&#52;&#54;&#54;&#51;&#53;&#51;&#52;&#51;&#48;&#51;&#49;&#51;&#48;&#51;&#48;&#51;&#56;&#51;&#51;&#54;&#50;&#51;&#48;&#54;&#54;&#51;&#49;&#54;&#54;&#51;&#50;&#51;&#51;&#54;&#49;&#51;&#51;&#54;&#53;&#54;&#49;&#54;&#53;&#54;&#51;&#54;&#51;&#51;&#53;&#54;&#52;&#51;&#53;&#54;&#49;&#51;&#55;&#54;&#51;&#55;&#100;

html实体编码->hexo2string->flag

flag{f9df54010083b0f1f23a3eaecc5d5a7c}

qr_code:

打开很多二维码,盲猜扫出来内容转0和1

比赛的时候有个简单的读二维码的工具,但是批量不会写脚本。。就读了两个,看哪个是0哪个是1,然后bin2ascii就可以了。

用脚本的做法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#  -*-coding:utf8 -*-
import os
import zxing
import binascii
import base64
reader=zxing.BarCodeReader()
asc=''
path="C:\\Users\\Administrator\\Desktop\\聊城\\qrcode"
files=os.listdir(path)
for i in range (0,len(files)-1):
# try:
# content=reader.decode(file).raw
# if content=="zero":
# asc+=str(0) #这是识别二维码的方法
# if content=="one":
# asc+=str(1)
# except:
# pass
size=os.path.getsize(str(i)+".png")
#这是使用filesize做的方法
if size==3409:
asc+='0'
else:
asc+='1'
asc=int(asc,base=2)
print(asc)
asc=hex(asc)
asc=asc[2:]
print(binascii.a2b_hex(asc).decode())

flag{duyoulikeit}

relax

打开是个.flag结尾的文件,丢进010editor看见是PK开头,考虑zip,解压出来一个flag.txt 一个音频。

flagtxt里面的base64解出来啥也不是,于是继续看音频。

考虑音频隐写,在文件详细信息里面发现了一串base64,解码后打开mp3stego,输入这个密码,得到了一串fakeflag:

fakeflag{same_length_with_true_flaghh}

和真的长的一样呢,真真假假

后面就没思路了。

后来看师傅的wp说需要讲该字符串与之前解出来啥也不是的base64异或就可以得到flag。草。

上脚本:

1
2
3
4
5
6
7
8
9
10
import  base64
with open("flag.txt") as f:
str1=f.readline()
str1=base64.b64decode(str1)
fakeflag="fakeflag{same_length_with_true_flaghh}".encode()
flag=""
for i in range (len(fakeflag)):
tmp=fakeflag[i]^str1[i]
flag+=chr(tmp)
print( flag)

这里需要注意的是:encode()方法是str类型提供的,将其转换为byte类型。decode()方法是将byte类型转化为str类型。之前我都是出错了就直接瞎encode,decode,咋对咋弄。。今天终于知道了。

flag:flag{9ff3a239027a7089237686b384862d33}

base64

base64套娃,光想着basecrack,结果直接卡死。。就是没想起来自己写脚本。

附上hxd的脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import base64
with open ("base.txt","rb") as f:
content=f.read()
while True:

try:
content=base64.b16decode(content).decode()
print("b16")
print(content)
except:
try:
content=base64.b32decode(content).decode()
print("b32")
print(content)

except:
try:
content=base64.b64decode(content).decode()
print("b64")
print(content)

except:
try:
content=base64.b85decode(content).decode()
print("b85")
print(content)

except:
break;

flag:flag{4b057431c3ee0c4f56d4dad18c352375}