代码审计,属于白盒测试,审查代码检查是否有安全问题,核心就两点:跟踪用户输入数据+敏感函数参数回溯。
代码审计
1. 密码硬编码(密码明文存储)——即将密码直接以明文的形式写在代码中,既不安全,也难以维护:password,pass,pwd,jdbc等
2. 反射型XSS——从用户那儿获取参数中的值,未经检查参数合法性的情况下,直接输出在js代码中,产生脚本攻击:getParameter,<%=,param等
3. 存储型XSS——指非法数据存入到数据库中,每次加载都会执行恶意代码产生攻击。为了检查代码是否有该漏洞,需从数据库的插入语句中回溯参数的来源,如果整个流程都没有对参数进行过滤,且没有全局过滤器,则判断存在存储型XSS:insert,save,update等
4. SQL注入——sql语句中出现+,Append,$(),#等拼接字眼且没有配置SQL过滤文件,则存在sql漏洞。根本解决办法是预编译,也就是sql语句事先编译好了,随后传入参数填坑,不会重新再编译,也就不会有sql注入:select,update,delete,insert等
5. 任意文件下载——整个流程中没有对用户请求的文件名进行合法性检查,导致用户能够下载一些配置文件:fileName,filePath,getFile,getWriter等
6. 任意文件删除——同样也是没有对用户请求的参数进行过滤,导致输入参数拼接以能够删除重要文件:delete,deleteFile,fileName,filePath等
7. 任意文件上传——未过滤用户输入文件名,导致能够上传恶意可执行文件。需注意有没有配置文件上传白名单,是否有检查后缀名,配置文件是否设置了白名单或者黑名单:upload,write,fileName,filePath等
8. 命令注入——判断是否直接拼接外部传来的值:getRuntime,exec,cmd,shell等
9. 缓冲区溢出——直接拷贝或*,未考虑大小:strcpy,strcat,scanf,memcpy,memmove,memeccpy,Getc(),fgetc(),getchar,read,printf等
10. XML注入——在导入配置、数据传输接口等场景,留意XML解析器是否禁用外部实体:DocumentBuilder、XMLStreamReader、SAXBuilder、SAXParser、SAXReader 、XMLReader、SAXSource 、TransformerFactory 、SAXTransformerFactory 、SchemaFactory等
11. 日志记录敏感信息——由于日志文件保存位置有一定要求,一般不在考虑范围之内(不结合其他漏洞一起考虑的情况下):log.info,logger.info等
12. URL跳转——注意是否配置了url跳转白名单:sendRedirect,setHeader,forward等
13. 敏感信息泄露及错误处理——查看配置文件是否配置了统一错误页面,如果有则不存在此漏洞,如果没有则搜索定位看是否泄露敏感信息:Getmessage,exception等
14. 反序列化漏洞——当输入的反序列化的数据可被用户控制,那么攻击者即可通过构造恶意输入,让反序列化产生非预期的对象,在此过程中执行构造的任意代码:
ObjectInputStream.readObject,ObjectInputStream.readUnshared,XMLDecoder.readObject,Yaml.load,XStream.fromXML,ObjectMapper.readValue,JSON.parseobject
15. 不安全组件暴露——通过查看配置文件 AndroidManifest.xml,查看属性有没有配置 false。
1. CSRF(Cross Site Request Forgery, 跨站域请求伪造)——查看配置文件有没有配置csrf全局过滤器,如果没有则看每个操作前有没有添加token的防护机制。
2. SSRF(Server-Side Request Forgery:服务器端请求伪造)——查看用户可控输入链接有没有过滤机制。
3. 越权漏洞——重点关注用户操作请求时是否有对当前登陆用户权限做校验或者权限框架的配置文件以及实现方法。
4. 敏感数据弱加密——看数据传输中的加密方法,一般写在工具类util中。
5. 短信验证码——时间限制防止可爆破,次数限制防止对手机产生攻击,可否自定义防止发送不良信息。