Day4 CTFhub

Day4 CTFhub

放一个大佬解答(带python解答版本):https://www.jianshu.com/p/2e67c69cbb0c

常规参考:https://blog.csdn.net/xmd213131/article/details/105310006?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162359362016780271511054%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=162359362016780271511054&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-4-105310006.first_rank_v2_pc_rank_v29&utm_term=ctfhub+sql%E6%B3%A8%E5%85%A5&spm=1018.2226.3001.4187

需要对应复习补充SQL注入相应知识,结合具体实践。(书+总结)

SQL知识:https://blog.csdn.net/weixin_43915762/article/details/87909751

sqli-labs之sql注入基本知识总结:https://www.cnblogs.com/backlion/p/7344548.html


1.SQL注入

1.SQL知识

SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。

1.1 数字型注入

存在一条 URL 为:HTTP://www.aaa.com/test.php?id=1
可以对后台的 SQL 语句猜测为:
SELECT * FROM table WHERE id=1

判断数字型漏洞的 SQL 注入点
① 先在输入框中输入一个单引号 ' 页面异常

② 在输入框中输入 and 1 = 1 正常

③ 在数据库中输入 and 1 = 2 返回数据与原始异常

以上三个步骤全部满足,则程序就可能存在数字型 SQL 注入漏洞。

1.2. 字符型注入

当输入参数为字符串时,则可能存在字符型注入漏洞。

数字型与字符型注入最大的区别在于:数字型不需要单引号闭合,而字符型一般需要使用单引号来闭合。

字符型注入最关键的是如何闭合 SQL 语句以及注释多余的代码

假设后台的 SQL 语句如下:
SELECT * FROM table WHERE username = 'admin'

① 还是先输入单引号 admin' 来测试

页面异常 。

② 输入:admin' and 1 = 1 --

注意:在 admin 后有一个单引号 ',用于字符串闭合,最后还有一个注释符 --(两条杠后面还有一个空格!!!)

SQL 语句变为:
SELECT * FROM table WHERE username = 'admin' and 1 = 1 --

页面显示正确。

③ 输入:admin' and 1 = 2 --

页面错误。

1.3. 其他类型(前两类的变形)

下是一些常见的注入叫法:

  • POST注入:注入字段在 POST 数据中
  • Cookie注入:注入字段在 Cookie 数据中
  • 延时注入:使用数据库延时特性注入
  • 搜索注入:注入处为搜索的地方
  • base64注入:注入字符串需要经过 base64 加密
1.4 常见数据库的注入

攻击者对于数据库注入,无非是利用数据库获取更多的数据或者更大的权限,利用的方式可以归结为以下几类:

  • 查询数据
  • 读写文件
  • 执行命令

攻击者对于程序注入,无论任何数据库,无非都是在做这三件事,只不过不同的数据库注入的 SQL 语句不一样罢了。

这里介绍三种数据库的注入:Oracle 11g、MySQL 5.1 和 SQL Server 2008。

SQL Server

  1. 利用错误消息提取信息

SQL Server 数据库是一个非常优秀的数据库,它可以准确地定位错误信息,这对攻击者来说是一件十分美好的事情,因为攻击者可以通过错误消息提取自己想要的数据。

① 枚举当前表或者列

假设选择存在这样一张表:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-upc4wviE-1623596509789)(C:/Users/13602/Desktop/小本本o/Day3 CTFhub.assets/image-20210613215319048.png)]

查询 root 用户的详细信息
,SQL 语句猜测如下:
SELECT * FROM user WHERE username = ‘root’ AND password = ‘root’

攻击者可以利用 SQL Server 特性来获取敏感信息,在输入框中输入如下语句:
’ having 1 = 1 –
最终执行的 SQL 语句就会变为:
SELECT * FROM user WHERE username = ‘root’ AND password = ‘root’ HAVING 1 = 1 –

那么 SQL 的执行器可能会抛出一个错误:

在这里插入图片描述

攻击者就可以发现当前的表名为 user、而且存在字段 id。

攻击者可以利用此特性继续得到其他列名,输入如下语句:
’ GROUP BY users.id HAVING 1 = 1 –
则 SQL 语句变为:
SELECT * FROM user WHERE username = ‘root’ AND password = ‘root’ GROUP BY users.id HAVING 1 = 1 –

抛出错误:

在这里插入图片描述

由此可以看到包含列名 username。可以一次递归查询,知道没有错误消息返回位置,这样就可以利用 HAVING 字句得到当表的所有列名。
注:Select指定的每一列都应该出现在Group By子句中,除非对这一列使用了聚合函数

②. 利用数据类型错误提取数据
如果试图将一个字符串与非字符串比较,或者将一个字符串转换为另一个不兼容的类型,那么SQL 编辑器将会抛出异常。

如下列 SQL 语句:
SELECT * FROM user WHERE username = 'abc' AND password = 'abc' AND 1 > (SELECT TOP 1 username FROM users)

这就可以获取到用户的用户名为 root。因为在子查询 SELECT TOP 1 username FROM users 中,将查询到的用户名的第一个返回,返回类型是 varchar 类型,然后要跟 int 类型的 1 比较,两种类型不同的数据无法比较而报错,从而导致了数据泄露。

利用此方法可以递归推导出所有的账户信息:
SELECT * FROM users WHERE username = ‘abc’ AND password = ‘abc’ AND 1 > (SELECT TOP 1 username FROM users WHERE not in (‘root’))。
通过构造此语句就可以获得下一个 用户名;若把子查询中的 username 换成其他列名,则可以获取其他列的信息,这里就不再赘述。

  1. 获取元数据

SQL Server 提供了大量视图,便于取得元数据。可以先猜测出表的列数,然后用 UNION 来构造 SQL 语句获取其中的数据。

如:
SELECT *** FROM *** WHERE id = *** UNION SELECT 1, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
若当前表的列数为 2,则可以 UNION 语句获取当前数据库表。具体怎么猜测当前表的列数,后面进行描述。

一些常用的系统数据库视图:

数据库视图 说明
SYS.DATABASES SQL Server 中的所有数据库
SYS.SQL_LOGINS SQL Server 中的所有登录名
INFORMATION_SCHEMA.TABLES 当前用户数据库中的所有数据表
INFORMATION_SCHEMA.COLUMNS 当前用户数据库中的所有列
SYS.ALL_COLUMNS 用户定义对象和系统对象的所有列的联合
SYS.DATABASE_PRINCIPALS 数据库中每个权限或列异常权限
SYS.DATABASE_FILES 存储在数据库中的数据库文件
SYSOBJECTS 数据库中创建的每个对象 (包括约束、日志以及存储过程)

  1. ORDER BY 子句猜测列数

在 Oracle 和 MySql 数据库中同样适用此方法。

  1. UNION 查询

UNION 关键字将两个或多个查询结果组合为单个结果集,大部分数据库都支持 UNION 查询。但适用 UNION 合并两个结果有如下基本规则:

  • 所有查询中的列数必须相同
  • 数据类型必须兼容

① 用 UNION 查询猜测列数

可以通过递归查询,直到无错误产生,就可以得知 User 表的查询字段数:
UNION SELECT 1,2UNION SELECT 1,2,3

② 联合查询敏感信息

在得知列数为 4后,可以使用一下语句继续注入:
UNION SELECT ‘x’, null, null, null FROM SYSOBJECT WHERE xtype=‘U’ (注:xtype=‘U’ 表示对象类型是表)

若第一列的数据类型不匹配,数据库会报错,那么可以递归查询,直到语句兼容。等到语句正常执行,就可以将 x 换为 SQL 语句,查询敏感信息。

  1. 利用SQL Server 提供的系统函数

SQL Server 提供了非常多的系统函数,利用该系统函数可以访问 SQL Server 系统表中的信息,而无需使用 SQL 查询语句。

如:

SELECT suser_name():返回用户的登录标识名
SELECT user_name():基于指定的标识号返回数据库用户名
SELECT db_name():返回数据库名
SELECT is_member(‘db_owner’):是否为数据库角色
SELECT convert(int, ‘5’):数据类型转换

  1. 存储过程

存储过程 (Stored Procedure) 是在大型数据库系统中为了完成特定功能的一组 SQL “函数”,如:执行系统命令、查看注册表、读取磁盘目录等。

攻击者最常使用的存储过程是 “xp_cmdshell”,这个存储过程允许用户执行操作系统命令。

例如:http://www.aaa.org/test.aspx?id=1 中存在注入点,那么攻击者就可以实施命令攻击:
http://www.aaa.org/test.aspx?id=1;exec xp_cmdshell ‘net user test test /add’

最终执行的 SQL 语句如下:

分号后面的那一段语句就可以为攻击者在对方服务器上新建一个用户名为 test、密码为 test 的用户。
注:并不是任何数据库用户都可以使用此类存储过程,用户必须持有 CONTROL SERVER 权限。

SELECT * FROM table WHERE id=1; exec xp_cmdshell 'net user test test /add'

分号后面的那一段语句就可以为攻击者在对方服务器上新建一个用户名为 test、密码为 test 的用户。
注:并不是任何数据库用户都可以使用此类存储过程,用户必须持有 CONTROL SERVER 权限。
另外,任何数据库在使用一些特殊的函数或存储过程时,都需要特定的权限。

  1. 动态执行
    SQL Server 支持动态执行语句,用户可以提交一个字符串来执行 SQL 语句。

如:

exec('SELECT username, password FROM users')

也可以通过定义十六进制的 SQL 语句,使用 exec 函数执行。大部分 Web 应用程序和防火墙都过滤了单引号,利用 exec 执行十六进制 SQL 语句可以突破很多防火墙及防注入程序.

MySQL

前面详细讲述了 SQL Server 的注入过程,在注入其他数据库时,基本思路是相同的,只不过两者使用的函数或者是语句稍有差异

MySQL 支持以下 3 中注释风格:

  • “#”: 注释从 “#” 到行尾
  • "-- " :注释从 “-- ”序列到行位,需要注意的是使用此注释时,后面需要跟上空格
  • /**/:注释从 /* 到 */ 之间的字符

2.CTFhub -SQL注入

1.整数型

判断存在数字注入——判断字段——查看数据库——表——列——数据项

img

sqli-labs基本知识:https://www.cnblogs.com/backlion/p/7344548.html

group_concat()函数

在有group by的查询语句中,select指定的字段要么就包含在group by语句的后面,作为分组的依据,要么就包含在聚合函数中。(有关group by的知识请戳:浅析SQL中Group By的使用)

1、功能:将group by产生的同一个分组中的值连接起来,返回一个字符串结果。

2、语法:group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator ‘分隔符’] )

说明:通过使用distinct可以排除重复值;如果希望对结果中的值进行排序,可以使用order by子句;separator是一个字符串值,缺省为一个逗号。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tEqbXMFR-1623596509794)(Day4 CTFhub.assets/image-20210613224513028.png)]

限制:

1.用了group_concat后,select 里如果使用了 limit 是不起作用的

2.用group_concat连接字段的时候是有长度限制的,并不是有多少连多少。但你可以设置一下。

3.使用group_concat_max_len系统变量,你可以设置允许的最大长度。

4.系统默认的分隔符是逗号

【字符串连接函数】

函数具体介绍: http://www.cnblogs.com/lcamry/p/5715634.html

  1. concat(str1,str2,…)——没有分隔符地连接字符串
  2. concat_ws(separator,str1,str2,…)——含有分隔符地连接字符串
  3. group_concat(str1,str2,…)——连接一个组的所有字符串,并以逗号分隔每一条数据

【名称&&命令】

column_name:列的名称
information_schema.columns:表示所有列的信息(在整个mysql里面)
(information_schema:表示所有信息,包括库、表、列)
(information_schema.tables:表示所有表的信息)
table_schema:数据库的名称
table_name:表的名称

猜数据库

select schema_name from information_schema.schemata

猜某库的数据表

select table_name from information_schema.tables where table_schema=‘xxxxx’

猜某表的所有列

Select column_name from information_schema.columns where table_name=‘xxxxx’

获取某列的内容

Select *** from ****

【万能密码】

Select * from admin where username='admin' and password=''or 1=1#'

在sql中,我们and的运算优先级大于or的元算优先级。(or其一为真则为真)

a and b = false,第一个条件和第二个条件执行and后是假,再与第三个条件or运算,因为第三个条件1=1是恒成立的,所以结果自然就为真了。因此上述的语句就是恒真了。

①Select * from users where id=1 and 1=1;

②Select * from users where id=1 && 1=1;

③Select * from users where id=1 & 1=1;

上述三者有什么区别?①和②是一样的,表达的意思是 id=1条件和1=1条件进行与运算。

③的意思是id=1条件与1进行&位操作,id=1被当作true,与1进行 & 运算 结果还是1,再进行=操作,1=1,还是1(ps:&的优先级大于=)

Ps:此处进行的位运算。我们可以将数转换为二进制再进行与、或、非、异或等运算。必要的时候可以利用该方法进行注入结果。例如将某一字符转换为ascii码后,可以分别与1,2,4,8,16,32.。。。进行与运算,可以得到每一位的值,拼接起来就是ascii码值。再从ascii值反推回字符。(运用较少)

1=1;

③Select * from users where id=1 & 1=1;

上述三者有什么区别?①和②是一样的,表达的意思是 id=1条件和1=1条件进行与运算。

③的意思是id=1条件与1进行&位操作,id=1被当作true,与1进行 & 运算 结果还是1,再进行=操作,1=1,还是1(ps:&的优先级大于=)

Ps:此处进行的位运算。我们可以将数转换为二进制再进行与、或、非、异或等运算。必要的时候可以利用该方法进行注入结果。例如将某一字符转换为ascii码后,可以分别与1,2,4,8,16,32.。。。进行与运算,可以得到每一位的值,拼接起来就是ascii码值。再从ascii值反推回字符。(运用较少)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值