前两天,阿敏亲戚公司的网站管理后台无法登陆了,老是提示“验证码错误”,于是向阿敏求助。不想写毕设论文的我,就去凑了个热闹。最终解决了问题,下面描述一下详细的过程:

  1. 使用提供的帐号和密码在本地进行了多次尝试,遇到同样的错误。

  2. 查看验证码图片的生成路径,猜测其验证码生成方式和我们自己做项目时生成验证码的方式是一样的,单独的一个文件,调用PHP的GD库生成包含随机字符串的图片,每次生成的时候将随机字符串存储在SESSION中,与用户提交表单后的验证码进行比对,相同的话继续执行登陆过程。

  3. 怀疑是否是在存储随机字符串到SESSION中的时数据出错(我们此前曾遇到这个问题),但是我们没有托管空间的帐号,无法接触到代码,不可能进行调试验证猜测。

  4. 尝试单独刷新验证码,输入前一次验证码的字符串,还是提示“验证码错误”。

  5. 使用Firebug查看页面源码,发现该站点的登陆页面不是表单(Form),而是在点击登陆按钮的时候,通过JS获取相应字段的数据,然后发送Ajax请求执行登陆过程。

  6. 查找处理登陆过程的JS代码,分析后感觉可以绕过其验证码的登陆过程,但是怎样绕过呢?于是将该页面下载到本地,修改对应的JS文件,屏蔽了其验证码验证的过程,尝试了几次登陆过程,最终还是失败。难道分析结果不对?

  7. 在JS代码中添加alert语句,确认代码停止执行的位置,结果是,代码都执行了呀。

  8. 意识到可以在Firebug中执行JS代码,于是将处理用户名和密码验证的JS代码复制过去执行,发现返回的数据有警告信息,大意是磁盘空间不够,SESSION文件无法写入,这应该就是症结所在了。

  9. 获取站点的IP地址,咨询万网(网站托管在万网机房)的技术支持,的确是磁盘空间已满造成的,需要升级服务或者删除一些文件腾出些空间。

  10. 因为站点很久没人维护,就花费了些时间获取万网会员的账户和密码,然后登陆进去。通过FTP访问并不能茶找到报错信息中显示的文件夹,但是既然是空间满了,阿敏决定删除写文件来释放些空间。

  11. 找到一个比较大的文件,备份到本地,然后删除掉线上的数据,此时能够登陆进去了。阿敏和其亲戚交流了下,事情告一段落。

  12. 我手痒,在Firebug下跑了下此前分析的可能绕过验证码验证过程的JS登陆过程。刚开始一直停留在登陆页面,以为自己的设想是错误的呢,看代码,发现是漏掉了一条跳转语句,添加后,成功登陆到后台。当然这是在我们知道用户名和密码的过程中。

  13. 既然这样可以绕过,那么在不知道密码的情况下,写个脚本暴力破解是可能的。(突然想到也许该站点还存在注入漏洞,当时没有尝试,找时间可以尝试一下,不过我是不会做坏事的啦^_^)

以上就是这次事件的经过了,哈好,我是个黑客了吗?

另外,在登陆到空间管理后台时,我查看了下数据库数据,发现所有的密码都是明文存放的,网站的代码也是乱七八糟的,和我们初学PHP时的项目有的一拼的说。

我提议阿敏建议他亲戚对重新开发一下站点,外包给我,基于Drupal实现一个更优秀与健壮的站点,但是没有下文了。不过这确提醒了我,以后确实可以通过接些外包的活连连手,赚点外快的说。

PS:站点就不说出来了,免得他人过去进行破坏,不过很希望他们愿意进行再次开发,外快啊!!!

Gonna Sailing 😉 ==END==