I have a jpg,i upload a txt.
小明发现,php将上传的jpg文件流写入一个txt中,再重命名后缀为jpg还可以正常读取,于是写了一段上传代码,会不会有什么漏洞呢?
http://139.129.108.53:3366/web-03
这道题出的非常有意思,难住了好多人
页面显示了源码:
通过审计发现do=rename并且re=一个值的时候,后缀是可以控制的 rename('./uploads/'.$rand.'.txt','./uploads/'.$rand.'.'.$rename);
[mw_shl_code=php,true]$re2=@unserialize(base64_decode(unKaIsA($re,6)));
foreach($re2 as $key=>$value)
{
if($key==0)
{
$rename=$value;
}[/mw_shl_code]
可以看到有个unKaIsA函数,但是这个函数我们看不到怎么算的,那怎么办?自己做实验吧,本地搭环境输出未加密的时候的值
[mw_shl_code=php,true]POSTDATA:filetype=png&filename=1212
serialize:a:2:{i:0;s:3:"png";i:1;s:4:"1212";}
Base64:YToyOntpOjA7czozOiJwbmciO2k6MTtzOjQ6IjEyMTIiO30=
KaIsA:EZisUhnjUdG7wtitUcPqvgwcU2e6SZntUdW6OdKsSZOcU30=[/mw_shl_code]
肯定和凯撒加密相关,那么就是移位,写个脚本判断一下:
[mw_shl_code=python,true]a='EZisUhnjUdG7wtitUcPqvgwcU2e6SZntUdW6OdKsSZOcU30='
b='YToyOntpOjA7czozOiJwbmciO2k6MTtzOjQ6IjEyMTIiO30='
for i in range(len(a)):
if ord(a) - ord(b)<0:
x=ord(a)-ord(b)+26
else:
x=ord(a)-ord(b)
print a,b,x[/mw_shl_code] 得到: [mw_shl_code=applescript,true]E Y 6
Z T 6
i o 20
s y 20
U O 6
h n 20
n t 20
j p 20
U O 6
d j 20
G A 6
7 7 0
w c 20
t z 20
i o 20
t z 20
U O 6
c i 20
P J 6
q w 20
v b 20
g m 20
w c 20
c i 20
U O 6
2 2 0
e k 20
6 6 0
S M 6
Z T 6
n t 20
t z 20
U O 6
d j 20
W Q 6
6 6 0
O I 6
d j 20
K E 6
s y 20
S M 6
Z T 6
O I 6
c i 20
U O 6
3 3 0
0 0 0
= = 0[/mw_shl_code]
也就是说大写字母是正常移位,小写字母是反向移位(20可以看做-6),其他不移位,那么改成将png改成php,如下:
cipher = "=0HWYl1SE5UQWFfN?I+PEo.UcshU"def decrypt(cipher): plain = list(cipher[::-1]) for i in range(0,(len(plain) / 2)): plain = chr(ord(plain) + 5) return ''.join(i for i in plain)print decrypt(cipher).decode("base64")