显错注入

发布于 2022-03-16  410 次阅读


0x00 Rank 1

首先打开靶场页面,通过get传参,进行注入。这里直接就可以看到sql的查询语句。比较简单,咱们先假装不知道!!!

image-20211128230910098

首先尝试加一个单引号测试一下

image-20211128231215348

可以看到没有结果,猜测可能存在sql注入漏洞

进行类型判断

and 1=1判断

image-20211128231826256

回显正常,

image-20211128231855236

查询失败,判断是数字型注入

接下来order by判断一下列字段数

image-20211128232054651
image-20211128232108488

判断有3列,因为每次id值不同,对应的值也不同,可以使用union联合查询注入,当然也可以使用其他注入方式

UNION联合注入

image-20211128235503896

可见回显位是2,3

开始构造语句,因为是第一关,所以写的详细一点!

首先了解一下mysql自带的information_schema表

information_schema数据库是MySQL系统自带的数据库,它提供了数据库元数据的访问方式。其实information_schema是一个虚拟数据库,本地并不存在,库中的表也实际上是视图。

image-20211129000013779
mysql> show tables;
+---------------------------------------+
| Tables_in_information_schema          |
+---------------------------------------+
| CHARACTER_SETS                        |
| COLLATION_CHARACTER_SET_APPLICABILITY |
| COLLATIONS                            |
| COLUMN_PRIVILEGES                     |
| COLUMN_STATISTICS                     |
| COLUMNS                               |
| ENGINES                               |
| EVENTS                                |
| FILES                                 |
| INNODB_BUFFER_PAGE                    |
| INNODB_BUFFER_PAGE_LRU                |
| INNODB_BUFFER_POOL_STATS              |
| INNODB_CACHED_INDEXES                 |
| INNODB_CMP                            |
| INNODB_CMP_PER_INDEX                  |
| INNODB_CMP_PER_INDEX_RESET            |
| INNODB_CMP_RESET                      |
| INNODB_CMPMEM                         |
| INNODB_CMPMEM_RESET                   |
| INNODB_COLUMNS                        |
| INNODB_DATAFILES                      |
| INNODB_FIELDS                         |
| INNODB_FOREIGN                        |
| INNODB_FOREIGN_COLS                   |
| INNODB_FT_BEING_DELETED               |
| INNODB_FT_CONFIG                      |
| INNODB_FT_DEFAULT_STOPWORD            |
| INNODB_FT_DELETED                     |
| INNODB_FT_INDEX_CACHE                 |
| INNODB_FT_INDEX_TABLE                 |
| INNODB_INDEXES                        |
| INNODB_METRICS                        |
| INNODB_TABLES                         |
| INNODB_TABLESPACES                    |
| INNODB_TABLESPACES_BRIEF              |
| INNODB_TABLESTATS                     |
| INNODB_TEMP_TABLE_INFO                |
| INNODB_TRX                            |
| INNODB_VIRTUAL                        |
| KEY_COLUMN_USAGE                      |
| KEYWORDS                              |
| OPTIMIZER_TRACE                       |
| PARAMETERS                            |
| PARTITIONS                            |
| PLUGINS                               |
| PROCESSLIST                           |
| PROFILING                             |
| REFERENTIAL_CONSTRAINTS               |
| RESOURCE_GROUPS                       |
| ROUTINES                              |
| SCHEMA_PRIVILEGES                     |
| SCHEMATA                              |
| ST_GEOMETRY_COLUMNS                   |
| ST_SPATIAL_REFERENCE_SYSTEMS          |
| STATISTICS                            |
| TABLE_CONSTRAINTS                     |
| TABLE_PRIVILEGES                      |
| TABLES                                |
| TABLESPACES                           |
| TRIGGERS                              |
| USER_PRIVILEGES                       |
| VIEWS                                 |
+---------------------------------------+

这里我只解释几个常用的表,如果之后遇到其他的表可以直接使用搜索引擎

  • SCHEMATA(schemata表提供了当前mysql实例中所有数据库的信息) 该表下有schema_name等字段
  • TABLES( tables表提供了关于数据库中的表的信息(包括视图) 该表下有table_schema,table_name,table_type等字段
  • COLUMNS( columns表提供了表中的列信息。) 该表下有column_name,table_name,schema_name,data_type,column_type等字段
  • STATISTICS(提供了关于表索引的信息。)
  • USER_PRIVILEGES((用户权限)表给出了关于全程权限的信息。)

了解完基本表,开始构造语句

基本信息查询

  • version()——MySQL版本
  • user()——数据库用户名
  • database()——数据库名
  • @@datadir——数据库路径
  • @@version_compile_os——操作系统版本
image-20211129002850833

查出

- version()                  5.7.33 
- user()                     nf2019@10.42.231.137
- database()                 error 
- @@datadir                  /var/lib/mysql/
- @@version_compile_os       Linux

查数据库,当然已经知道了用户信息存储在error数据库中

image-20211129003343063

查error库中的表

image-20211129003653921

查看error_flag表中字段

image-20211129003825658

存在flag字段,爆字段!

image-20211129003919710

得到flag。

核心代码分析

$username = '';
$password = '';
@$id = $_GET['id']; // 从get传参获取id值
@$sql = 'select *from user where id='.$id; // 查询语句
mysqli_select_db($conn,'****');// 不想让你们知道库名 数据库连接语句
$result = mysqli_query($conn,$sql); // 执行数据库查询语句,即$sql
while ($row = mysqli_fetch_array($result)){ // 判断是否查询到数据
$username = $row['username']; // 变量赋值
$password = $row['password']; 
}
// 输出用户信息
echo 'Your Login name:'.$username;
echo 'Your Password:'.$password;

0x01 Rank 2

第二关,依然是字符型注入,闭合方式为单引号

还是假装不知道!尝试寻找注入点

单引号尝试,没查询结果

image-20211129004453358

猜测存在sql注入,尝试判断类型

and 1=1 ,回显正常

image-20211129004726005

and 1=2,还是一样的结果

image-20211129004810471

尝试'and '1'='1

image-20211129004937874

'and '1'='2

image-20211129004958442

显示查询没结果,故应该为单引号闭合的字符型注入

加注释,构造语句,与第一关做法相同

order by 判断仍然是3列

image-20211129005201988

回显位还是2,3

image-20211129005229851

直接爆数据

0x02 Rank 3

第三关仍然是字符型,闭合方式为('id')

?id=1') union select 1,group_concat(flag),3 from error_flag--+
image-20211129005719792

0x03 Rank 4

第四关也是字符型,闭合方式为("id")

?id=1") union select 1,group_concat(flag),3 from error_flag--+
image-20211129005820649