从认证管理、授权管理、输入输出验证、会话管理、密码管理、调试接口、日志审计、运行环境、第三方组件等多个方面梳理了代码审计需要关注的重点。让你的代码无懈可击!

一、测试工具

1.1 反编译java类

如果项目中未提供所有java源代码,只提供编译后的class文件,可以运行jd-gui,选择菜单File—Open File,对class文件进行反编译

选择class文件或者jar包,点击打开按钮,即可查看反汇编后的java源代码

1.2 Eclipse环境审计

使用Eclipse的Import功能将程序代码导入workspace,打开任一java源文件,选择Source Analyse菜单下的条目进行关键方法搜索,搜索结果在窗口下面显示,然后进行人工分析。

 

二、认证管理

2.1 图形验证码

2.2 认证实现

较安全的做法为先校验验证码,再检查用户名,最后比对密码的密文

用户注销时是否清理了当前用户会话

在统一认证SSO模式下,有的实现并非使用Token来交换认证信息,而是通过客户端直接传递账号、密码,这种情形下有可能在URL中直接传递明文密码。

统一用户名和密码错误提示,可以降低账号、密码被猜解的风险

三、授权管理

3.1 授权实现

明确用户的角色定义、授权访问的范围,分析哪种情况下可能会导致越权

大部分的大型应用都会采用统一的权限控制模块

识别出需要和无需权限控制的页面/功能,逐一进行验证。验证过程中需要考虑到用户的角色划分。

部分应用的权限控制(模块)的使用上存在缺陷,攻击者可能通过一些隐蔽的途径绕过鉴权,访问非授权资源

3.2 授权管理

分析系统高权限用户(例如:管理员用户)的分配情况及密码复杂度等

分析系统是否存在默认用户、密码,密码复杂度等。

四、输入/输出验证

4.1 SQL注入防护

过滤器配置、过滤函数等

请求是否都按要求经过过滤器处理

初期检查可以依据PHPIDS的规则库,后期根据收集的情况予以补充

预查询是指在将数据传入SQL语句前明确指定传输数据的类型,以执行必要的转换。在Java中预查询的调用方式为prepareStatement。

某些特殊的查询(特别复杂的组合查询)难免用到SQL语句拼接,遇到这种情况,就需要检查拼接是否有可能导致注入。

4.2 跨站攻击防护

某些情况下可能存在两种输出,文本输出和富文本(HTML)输出,要强制文本输出,只需要调用HTMLEncode()对内容进行编码后输出即可;但是富文本本身就需要使用html来进行格式的控制,简单的编码就无法使用,这时需要在此类内容从客户端输入(用户提交)或输出给客户端(显示)时进行危险代码过滤。

4.3 CSRF攻击防护

可以从测试环境来检查生成的验证码是否符合复杂性要求,如是否有干扰线/点、字符变形等。

如果在操作时不严格区分GET和POST,在没有Token(或验证码)的辅助下很容易导致CSRF的发生。

4.4 文件上传防护

以白名单形式指定允许上传的扩展名;以黑名单形式指定禁止上传的文件名

重命名操作是否安全,防止重命名过程中产生二次风险

4.5 文件下载防护

文件下载功能中是否对用户的权限进行了检查。

4.6 重定向与转发保护

五、会话管理

5.1 Session管理

通过应用服务器的配置检查

从代码部分、从配置部分检查,需要根据应用实际使用的验证方式

认证成功后是否强制刷新用户使用的SessionID

检查Session的超时时间设置是否符合要求,默认是20~30分钟

5.2 Cookie管理

如果生存时间在20~30分钟左右,使用Session方式会更加安全

六、密码管理

6.1 加密安全

6.2 密码安全

可以采用哈希算法或者RSA等加密算法将密码加密后传递,或者是使用SSL来做传输层加密。

第三方途径主要有电子邮件、手机短信等。这些途径应该是找回密码前预留的。

部分应用的找回密码功能是直接将原密码发送到密码保护邮箱,这种方式存在一定的安全风险。

至少包含数字和字母,长度最少6位,避免用户输入弱口令

七、调试&接口

7.1 异常处理

详细的错误输出可能会导致SQL查询泄露、程序源代码泄露、物理路径泄露等。

备注:某些异常可能是致命的,但是如果程序捕获了异常,可能会导致程序绕过一些重要的步骤而直接执行后续的操作。

7.2 数据接口

例如:axis2,http://localhost:8080/axis2/axis2-admin/,默认用户名/密码:admin/axis2,密码在webapps\axis2\WEB-INF\conf\axis2.xml里配置

例如:axis2,http://localhost:8080/axis2/axis2-web/HappyAxis.jsp,会暴露物理路径

例如:使用WSS4J对SOAP报文体进行身份认证

例如:使用WSS4J对SOAP报文体进行加密

例如:Webservice应用对特殊字符的处理,是否会在报错信息中泄露数据,参考http://www.soapui.org/About-SoapUI/features.html#security-testing

7.3 硬编码

如:调试帐号、外部接口帐号/密码、数据加/解密密钥等

八、日志审计

8.1 日志记录

九、运行环境

9.1 应用配置

页面包括应用服务器的默认页面、管理后台、测试页面、备份文件等;帐号指Web应用服务器的运行帐户

如SVN版本信息文件、调试工具/页面、功能模块中的调试接口等

如数据库连接配置、其它接口连接配置等

9.2 自定义错误

9.3 日志管理

是否记录了客户端地址、请求的方法、请求的URL、提交的参数(GET、POST、COOKIE参数)、请求的状态等

十、第三方组件

分析应用使用的框架及引用的第三方组件,分析其是否存在各种已知漏洞,且当前环境漏洞是否可以重现

10.1 框架

10.2 编辑器

10.3 上传组件

10.4 安全功能

十一、安全功能

对于比较重要的业务系统,例如:支付系统,可以参考以下条目,进行检测

11.1 登录认证

11.2 数据操作

源链接

Hacking more

...