前些天在论坛上看到一人在问,为什么使用注入ASP+ACCESS数据库的网站时爆不出管理员的表名,遇到这种问题通常的回答就是管理员的表名比较“非主流”,因此很难猜测到,但我突然又萌生了一个想法:或许管理员密码根本就没有在数据库里。那么密码还有可能在哪里呢?比如假设管理员密码存放在一个ASCII文件里,在需要的时候就使用FSO提取出来。
既然数据库中根本就没有管理员帐户密码,那么注入ASP+ACCESS这样的网站对于攻击者来说也就是毫无意义的了。但是ASCII文件的本质是文本流,而不是数据库,如果管理员帐户有很多,那么想要读取最后一条记录就必须先要把前面的所有内容都读取完,这样显然是不科学的,况且频繁调用FSO也是非常消耗资源的。
为解决这个问题,我们可以把用户名和密码存放在一个ASP文件里,将所有帐号密码用特定字符串连接,赋值给一个变量,需要更改或者增加管理员密码的时候再调用FS0通过修改这个文件来改变这个变量的值。
想“画瓢”的朋友请参考下面的“葫芦”模型:以下是存放管理员帐号和密码的admin.asp文件,用户名和密码使用“&”连接,不同的帐号使用“,”隔开。将这个字符串赋值给变量name_psw,这个重要的变量将贯穿整个模型:<%name_psw="namel&pswl.nama2&psw2"%>。
下面是具体的代码,作用就是根据提交的表单来判断该用户是否为管理员:
因为在核对帐户的时候只是检测了提交帐号是否为name_psw的子串,所以帐号不能为空,而且要用md5加密,否则用户提交空数据或者帐号的一部分就可以通过检测。
下面的代码是添加管理员帐号的,通过修改admin.asp中的赋值代码来修改name_psw的值:
大家在使用时一定不要省略过滤一句话的部分,切记!下面的代码起着修改帐号的作用,其顺序是先删除user_psw中的原始账号,然后再追加新帐号:
如果大家仍然觉得这样不够安全,那更隐蔽的做法就是将管理员帐号放在application变量中,application是服务器级别的变量,只要IIS不关闭,该变量就不会被释放,是真正意义上的全局变量。我们可以使用appliction("uer_psw")=request(¨new_name")&"&"&reuest("new_psw")的方式来赋值,这样一来,别说SQL注入找不到管理员帐号,就算是在磁盘中也找不到的。但这样做也有个缺陷,如果服务器意外关闭,那么当其恢复之后我们需要在第一时间重新设置帐号,倘若在我们不知情的情况下攻击者DDOS我们的服务器,那么重启以后攻击者有可能先于我们进入后台。所以我的程序模型规定如果aplcation("uer_psw")为空,则禁止任何人登录后台,这样来强制管理员用FTP上传ASP文件并执行它来给application("user_psw")赋值,如果攻击者连FTP都拿到了,那也就没有必要去找管理员帐号了,可以说这样的设计已经完美的多了。这种方法比起上面的要简单得多,因为省去了FSO,也不用过滤一句话木马了,限于篇幅,也为了方便大家更好的理解,我把文章中涉及到全部代码都已经收录了,里面有详细的注释。
这样处理后,我们就可以放心的删除数据库中的用户名和密码列了(不要删除管理员表,否则程序可能会出错的)。但我们毕竟是学黑的,与普通的网管不同,因此我并不建议大家删除它们,只要将用户名或密码修改成一个假的,然后修改后台登录页面,如果对方输入了假的帐号,那就直接跳转到我们事先准备好的页面上去。好了,现在大家就可以放心的撤销你网站上的一切防注入措施了。
本文为网络安全技术研究记录,文中技术研究环境为本地搭建或经过目标主体授权测试研究,内容已去除关键敏感信息和代码,以防止被恶意利用。文章内提及的漏洞均已修复,在挖掘、提交相关漏洞的过程中,应严格遵守相关法律法规。