信息泄露
信息泄露:为什么黑客会知道你的代码逻辑?
为什么错误信息会泄露代码逻辑?
第一,错误信息反馈的是 Syntax error,即语法错误。在密码位置输入单个字母“g”肯定不会引起错误,所以,这个 SQL 语句是因为多了一个单引号导致的报错。而如果使用了 PreparedStatement 等方法,是不会产生这个错误的。因此,后台的 SQL 查询应该是直接采用的字符串拼接,且没有过滤单引号。
第二,错误信息中显示了部分的 WHERE 条件是username = '' and password = ''。这又是一个登录的逻辑,所以,只要用户名和密码正确,这个 SQL 语句会返回黑客需要的用户信息。因此,后台的 SQL 语句应该是形如 select from where 的格式。
根据这些信息,黑客很容易就可以发起 SQL 注入攻击了。
“黑盒(Black Box Testing,功能测试)”,就是在不获取代码的情况下,直接运行应用,然后对应用的请求和响应进行扫描。比如,在错误信息泄露的场景中,“黑盒”检测可以向应用发起一些必然会导致错误的请求(比如上述例子中的单引号),然后观察应用是返回完整的错误日志,还是返回某些经过处理的页面。
错误信息泄露属于一种间接的信息泄露方式。间接的信息泄露方式主要是通过拼凑各种零散信息,还原出代码整体的面貌,然后有针对性地发起攻击。
除了错误信息,还有什么地方会泄露代码逻辑?
返回信息泄露和注释信息泄露。
前端代码基本都不需要编译就可以展示在浏览器中,所以黑客很容易就可以看到前端代码中的注释信息。但是,如果这些注释信息中出现服务器 IP、数据库地址和认证密码这样的关键信息。一旦这些关键信息被泄露,将会造成十分严重的后果。
白盒(White Box Testing,结构测试)”,即直接获取到线上的源代码,然后对它进行扫描。“白盒”扫描注释信息的原理比较简单,因为每一种语言的注释都会带有特殊的标记(比如 Java 和 PHP 中的 /* 等),可以比较准确地被识别出来。除此之外,“白盒”检测通常还会被用来做一些检测代码漏洞或者逻辑漏洞的工作
服务端在请求一个图片地址的时候,会根据地址的“存活”情况和返回数据的类型,分别返回三种结果:“图片不存在”“格式错误”以及图片正常显示。而黑客正是通过服务端返回信息的逻辑,利用一个请求图片的 SSRF,摸清整个后端的服务“存活情况”。
当你在登录应用的时候,应用的返回逻辑可能是这样的:如果输入的用户名和密码正确,则登录成功;如果应用没有这个用户,则返回“用户名不存在”;如果输入的用户名和密码不匹配,则返回“密码错误”。
有哪些常见的直接泄露方式?
第一种泄露方式与版本管理工具中的隐藏文件有关。
SVN 会在项目目录中创建一个.svn 文件夹,里面保存了应用每一个版本的源文件信息,这也是 SVN 实现代码回滚的数据基础。如果 SVN 可以通过.svn 中的数据提取应用任意版本的代码,那黑客也可以。只要你没有在上线代码的时候删除其中的.svn 目录,那就代表黑客可以通过.svn 中的 URL 访问里面的所有文件。接下来,只需要通过执行简单的脚本,黑客就可以回溯出一个完整版本的代码了。
对于这种因为目录中额外内容(.svn/.git)导致的源码泄露,我们一方面需要对线上代码进行人工的代码审查,确保无关的文件和文件夹被正确地清除;另一方面,我们也可以在 HTTP 服务中对部分敏感的路径进行限制。
Git 除了是一个版本管理工具之外,还是一个很流行的代码管理工具。除了前面讲过的隐藏文件漏洞之外(Git 会生成.git,同样包含应用各种版本的文件信息),Git 还存在将代码上传到公开平台的问题。但是,使用 GitHub 上传代码通常属于个人行为,所以,我们很难从技术层面上进行预防。
公司应该从加强员工安全意识的培训、强化公司管理制度入手,避免员工私自上传代码。除此之外,公司还可以对 GitHub 发起巡检(比较知名的工具有Hawkeye),通过定期检索公司代码的关键字(比如常用的包名、域名等)来进行检测。通过这些方式匹配到的结果,很可能就是员工私自公开的代码。确认之后,我们就可以联系上传的人员进行删除了。
总结
基本上,所有攻击的第一步都是从信息泄露开始的。而且黑客没有办法攻击一个未知的系统,所以黑客会通过这些泄露的信息,去推断出应用的整体架构和逻辑。
信息泄露的方式和原因有很多,这其中,除了黑客主动发起攻击导致的信息泄露之外,有很多非技术原因导致的信息泄露。
- 屏蔽信息:通过技术手段,将不该被访问的资源进行屏蔽,从而避免信息泄露的产生;
- 代码检测:从“白盒”和“黑盒”两个方向,对代码、应用等进行检测,对可能的泄露进行预警;
- 人工审计:对于非技术原因造成的泄露,加强人工审计的工作。同时从公司制度上,去提高员工的安全意识。