许多客户在网站,以及APP上线的同时,都会提前的对网站进行全面的渗透测试以及安全检测,提前检测出存在的网站漏洞,以免后期网站发展过程中出现重大的经济损失,前段时间有客户找到我们SINE安全公司做渗透测试服务,在此我们将把对客户的整个渗透测试过程以及安全测试,发现的漏洞都记录下来,分享给大家,也希望大家更深地去了解渗透测试。
在对客户的网站进行服务的同时,我们首先要了解分析数据包以及网站的各项功能,有助于我们在渗透测试中发现漏洞,修复漏洞,综合客户网站的架构,规模,以及数据库类型,使用的服务器系统,是windows还是linux,前期都要收集信息,做到知彼知己百战不殆。只有真正的了解了网站,才能一层一层地找出漏洞所在。网站使用的是php语言开发,采用是mysql数据库,客户服务器用的是linux centos系统,用phpstudy一键环境搭建,PHP的版本是5.5,mysql数据库版本是5.6.客户网站是一个平台,采用会员登录,功能基本都是一些交互性的,会员资料修改,银行卡添加,充值与提现,在线反馈等等。
下面开始我们的整个渗透测试过程,首先客户授权我们进行网站安全测试,我们才能放开手的去干,首先检测的是网站是否存在SQL注入漏洞,我们SINE安全在检测网站是否有sql注入的时候都会配合查看mysql数据库的日志来查询我们提交的SQL语句是否成功的执行,那么很多人会问该如何开启数据库的日志,如何查看呢?首先连接linux服务器的SSH端口,利用root的账号密码进服务器,打开mysql的配置文件mysqld.cnf编辑general_log_file=(log日志的地址),general_log=1,在服务器里输入tail -f (log地址),来查看实时的数据库语句执行日志。当我们SINE安全技术在测试SQL注入漏洞的时候,就会实时的看到是否有恶意的SQL语句执行成功,如果有那么数据库日志就会出现错误提示,在渗透测试中是很方便的,也更利于查找漏洞。
这里不详细的分析代码了,我们在测试中发现平台的后台管理页面存在SQL注入漏洞,当管理员登录后台的时候我们看到guanlilogin.php里POST到guanlicheck.php来对管理员的账号密码进行验证,在验证的过程中guanlicheck.php并没有对传入过来的参数进行安全校验,导致SQL注入漏洞的产生,具体代码如下
代码里的getenv参数是获取前端用户的https头信息,通过数据比对,如果头信息大那么久返回0值然后再将IP赋值进去,通俗来讲就是没有任何的安全校验与拦截,直接将变量的IP带入到mysql据库。所以造成了SQL注入漏洞的产生。那么渗透测试中发现SQL注入漏洞就是高危漏洞,带来的危害较大,可以篡改数据,修改数据库,可以将管理员的密码重置,或者是获取所有的用户账号密码等信息。发生用户信息泄露,利用数据库的权限修改管理员密码登录后台进行下一步的提权操作,上传webshell,控制网站代码。
接下来还得检测网站的各项功能以及APP功能是否存在逻辑漏洞,越权漏洞,水平垂直等等,我们SINE安全技术详细的对每一个功能都测试很多遍,一次,两次,多次的反复进行,在用户重置密码功能这里发现有漏洞,正常功能代码设计是这样的流程,首先会判断用户的账号是否存在,以及下一步用户的手机号码是否与数据库里的手机号一致,这里简单地做了一下安全校验,但是在获取手机号验证码的时候并没有做安全校验,导致可以修改post数据包,将手机号码修改为任意手机号来获取验证码,利用验证码来修改重置密码。
如何修复渗透测试中的SQL注入漏洞呢?
在对前端输入过来的值进行安全判断,确认变量值是否存在,如果存在将不会覆盖,杜绝变量覆盖导致掺入恶意构造的sql注入语句代码在GET请求,以及POST请求里,过滤非法字符的输入。 '分号过滤 --过滤 %20特殊字符过滤,单引号过滤,%百分号, and过滤,tab键值等的的安全过滤。逻辑漏洞的修复办法,对密码找回功能页面进行安全校验,检查所属账号的身份是否是当前的手机号,如果不是不能发送验证码,其实就是代码功能的逻辑设计出了问题,逻辑理顺清楚了,就很容易的修复漏洞,也希望我们SINE安全分享的这次渗透测试过程能让更多的人了解渗透测试,安全防患于未然。