Integer-based SQLI
最近更新:2025-10-20   |   字数总计:1.2k   |   阅读估时:4分钟   |   阅读量:
  1. 寻找注入点
  2. 构造特殊sql语句查询数据
    1. 查明当前表的列数
    2. 获得当前数据库的名称
    3. 查询Metadata以获得当前数据库的更多信息
    4. 查询表的列信息
    5. 查询表内的数据
  3. 总结

本文记录ctfhub技能树web分支下的整数型sql注入的过程。

SQL 注入攻击的原理是利用应用程序对用户输入数据的处理不当。当应用程序没有对用户输入进行充分验证和过滤时,攻击者可以在输入字段中注入特殊的 SQL 语句片段,使得应用程序在处理这些恶意输入时,错误地将其当作合法的 SQL 代码执行。

寻找注入点

1

当输入id为1+1时,网页返回id=2的结果,这表明当前页面存在sql漏洞,可以在此页面上进行注入。

我们可以通过构造特殊的sql查询语句获得数据库中的其他重要信息。

构造特殊sql语句查询数据

查明当前表的列数

构造sql语句使其执行order by命令,发现 order by 2时可以正常返回结果,但order by 3不行。

所以当前表的列数为2

2

获得当前数据库的名称

目前已知该表有2列,所以可以使用union构造联合查询。此时使左查询为空,则页面会显示右查询的结果。而右查询可以根据我们的需求构造。

使用database()函数获得当前数据库的名称。

1
select -1 union select 1,database();

3

查询Metadata以获得当前数据库的更多信息

目前已知当前数据库的名称为sqli,我们还需要知道当前数据库中存有哪些表。

在 MySQL 中,information_schema 用于存储数据库的元数据(metadata),包含了一系列系统表,这些表提供了有关数据库、表、列、索引、用户权限等信息。通过查询 information_schema 中的表,可以获取关于数据库结构和其他元数据的详细信息,用于进行数据库管理和查询优化等操作。

information_schema 数据库中,存在 TABLES 表和 COLUMNS 表,它们是用来存储有关数据库中表和表的列的元数据信息的。

  1. TABLES 表:
    • TABLES 表包含有关数据库中所有表的信息,比如表名、表类型(如表、视图、系统表等)、表所属的数据库、表的引擎类型等。
    • 通过查询 TABLES 表,您可以获取数据库中所有表的列表和相关信息。
    • 表结构示例:
      • TABLE_CATALOG: 表所属的数据库名称
      • TABLE_SCHEMA: 表所属的模式(数据库的命名空间)
      • TABLE_NAME: 表名
      • TABLE_TYPE: 表类型,如 ‘BASE TABLE’ 表示普通表,’VIEW’ 表示视图
  2. COLUMNS 表:
    • COLUMNS 表包含有关数据库表中所有列的信息,如列名、数据类型、是否允许为 NULL、列的位置等。
    • 通过查询 COLUMNS 表,您可以了解表的列结构和相关属性信息。
    • 表结构示例:
      • TABLE_CATALOG: 表所属的数据库名称
      • TABLE_SCHEMA: 表所属的模式(数据库的命名空间)
      • TABLE_NAME: 表名
      • COLUMN_NAME: 列名
      • ORDINAL_POSITION: 列在表中的位置
      • DATA_TYPE: 列的数据类型
      • IS_NULLABLE: 列是否允许为空(’YES’ 或 ‘NO’)

那么我们可以构造执行以下sql语句,查询sqli数据库中的所有表的名称

1
select group_concat(table_name) from information_schema.tables where table_schema = 'sqli'

在注入点上使用union构造:

4

查询表的列信息

目前已知sqli数据库中的有两个表: flag news

在本次注入的情况下,flag表里储存的是重要信息,我们在要查询flag表就必须知道表中有哪些列。

这也同样可以通过查询information_schema数据库获得。

sql语句如下

1
select group_concat(column_name) from information_schema.columns where table_schema = 'sqli' and table_name = 'flag'

在注入点上使用union构造:

5

显示的结果表明flag表中只有1列,该列的名称为flag

查询表内的数据

到此步就很简单了,直接构造查询语句即可。

1
select flag from flag

在注入点上使用union构造:

6

成功获得flag表中的数据。

总结

要完成手工的sql注入,需要识别注入点,还需要对sql语句有简单的了解,比如说order by语句和union联合查询的用法,这样才能成功构造sql语句。

最重要的是如何从information_schema中获得数据库和表的详细信息,这就要求渗透者要了解储存元数据表的结构。(MySQL是使用information_schema数据库中的各种表来储存元数据,不同的数据库有差异)

此外,还可以使用sqlmap脚本进行注入,脚本注入的方法比较简单就不再赘述。