本文记录ctfhub技能树web分支下的整数型sql注入的过程。
SQL 注入攻击的原理是利用应用程序对用户输入数据的处理不当。当应用程序没有对用户输入进行充分验证和过滤时,攻击者可以在输入字段中注入特殊的 SQL 语句片段,使得应用程序在处理这些恶意输入时,错误地将其当作合法的 SQL 代码执行。
当输入id为1+1时,网页返回id=2的结果,这表明当前页面存在sql漏洞,可以在此页面上进行注入。
我们可以通过构造特殊的sql查询语句获得数据库中的其他重要信息。
构造sql语句使其执行order by命令,发现 order by 2时可以正常返回结果,但order by 3不行。
所以当前表的列数为2
目前已知该表有2列,所以可以使用union构造联合查询。此时使左查询为空,则页面会显示右查询的结果。而右查询可以根据我们的需求构造。
使用database()函数获得当前数据库的名称。
1 | select -1 union select 1,database(); |
目前已知当前数据库的名称为sqli,我们还需要知道当前数据库中存有哪些表。
在 MySQL 中,information_schema
用于存储数据库的元数据(metadata),包含了一系列系统表,这些表提供了有关数据库、表、列、索引、用户权限等信息。通过查询 information_schema
中的表,可以获取关于数据库结构和其他元数据的详细信息,用于进行数据库管理和查询优化等操作。
在 information_schema
数据库中,存在 TABLES
表和 COLUMNS
表,它们是用来存储有关数据库中表和表的列的元数据信息的。
TABLES
表:TABLES
表包含有关数据库中所有表的信息,比如表名、表类型(如表、视图、系统表等)、表所属的数据库、表的引擎类型等。TABLES
表,您可以获取数据库中所有表的列表和相关信息。TABLE_CATALOG
: 表所属的数据库名称TABLE_SCHEMA
: 表所属的模式(数据库的命名空间)TABLE_NAME
: 表名TABLE_TYPE
: 表类型,如 ‘BASE TABLE’ 表示普通表,’VIEW’ 表示视图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构造:
目前已知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构造:
显示的结果表明flag表中只有1列,该列的名称为flag
到此步就很简单了,直接构造查询语句即可。
1 | select flag from flag |
在注入点上使用union构造:
成功获得flag表中的数据。
要完成手工的sql注入,需要识别注入点,还需要对sql语句有简单的了解,比如说order by语句和union联合查询的用法,这样才能成功构造sql语句。
最重要的是如何从information_schema中获得数据库和表的详细信息,这就要求渗透者要了解储存元数据表的结构。(MySQL是使用information_schema数据库中的各种表来储存元数据,不同的数据库有差异)
此外,还可以使用sqlmap脚本进行注入,脚本注入的方法比较简单就不再赘述。