事件起因
经客户联系,说公司sqlserver服务器的密码忘记了,希望重置密码,又不清楚账号,在远程指导使用sa/服务器密码后返回18456错误,说明账号或密码错误。
尝试使用windows身份认证后依然出现同样的错误
因为确实没见过这种情况,所以我们猜测是服务器工作组用户名称被修改导致无法登录,在尝试新建用户登录未果后,查询资料发现了一个‘-m’参数,通过脱机登录方式登录数据库,修改sa密码。
重置密码
1.打开sqlserver配置管理器
2.选中sqlserver服务,点击属性
3.点击高级选择启动参数,在最后加入“;-m”
4.重启服务
5.选择windows身份认证登录
6.选择安全性-登录名-用户名,并修改密码
7.退出数据库,右键服务选择属性,进入高级选项并删除“;-m”
8.重启服务后,即可使用账号密码登录
引出事端
本以为事情就这么结束了,但是心里总觉得忘了什么,正在思考的时候,客户突然来消息说他们的站点突然都登录不上了。我内心一紧,坏了,原来他们的站点都是使用sa账户连接的数据库,而客户由于一些原因和开发方有些矛盾,无法获得网站源码,又缺少运维,同样也没有拿到数据库密码,也是因为这个原因才会找我们来重置密码,客户的网站为C#编写的,并编译成了动态链接库文件,咨询了朋友后发现只能通过反编译dll文件,获取绑定数据库的账号密码,并将数据库密码修改回去。
反编译
1.C#反汇编工具
我对C#编写的网站本就很少接触到,之前学习逆向时用到的也都是IDA和OllyDebug之类的工具,经过查询资料得知了一款好用的软件:DNSPY
2.可行性尝试
从客户拿来了一个文件先做可行性尝试,打开一个文件后第一时间是懵的,我就打开了一个怎么这么多资源,后来观察资源名猜测,大概是系统内置的动态链接库
查看文件引用大概能证实这一观点
查看内容后发现了源代码,虽然代码编写方式不一定一样,但实现原理应该不会有问题,证实了此方法可行,于是向客户要来了一套系统的dll资源,开始反汇编的实验
3.反汇编
DNSPY打开全部文件,打开后第一眼是混乱的,毕竟这么多文件不能一行行去找,第一步需要知道C#连接数据库的方式以及引用的内部文件名,再次查询资料得知,C#连接数据库需要引用System.Data以及System.Data.SqlClient库,调用SqlConnection对象,这就方便了,我开始查看每个文件的引用,寻找引用了System.Data的资源,最终筛选出了五个资源。
之后就开始代码审计,与其说代码审计不如说代码查找,在每个文件中查找调用了SqlConnect对象代码,但是好几个文件下来居然没有找到,正在心慌的时候突然看到一个函数名很显眼,SqlParameter是代码在使用参数化执行语句的时候,使用该对象对执行语句中的参数赋值,既然有sql执行语句,要传入参数,那就肯定要连接数据库,果然,把这几个文件从头看到尾终于发现了存放数据库账号密码的字符串
至此总算结束了,也算是获得了一次宝贵的项目经验
总结
这次事件,或者说是事故还是给我们提了个醒,对数据库的操作需要尤其谨慎,考虑要全面,不是每次都有这样的好运气。而且通过这次不能算逆向又不能算代码审计的一次实验来看,需要学习的内容还很多,算是对自己的一次的告诫和勉励吧。
团队介绍
点击关注银河护卫队super
原文始发于微信公众号(银河护卫队super):记一次sqlserver密码重置引出的C#网站代码简单逆向
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论