0x2C 腾讯
来源:https://github.com/vvmdx/Sec-Interview-4-2023
说明:本文件按原面经问题整理答题要点,答案为面试复习口径。
一面
1. 编写工具的具体思路,sql注入,xss
参考完整回答(XSS):
XSS 是用户可控内容被浏览器当成脚本执行。反射型常见于搜索参数或错误提示,存储型常见于评论、昵称、工单内容,DOM 型常见于前端从 location、hash、postMessage 中取值后写入页面。影响包括窃取用户信息、发起越权操作、劫持页面、钓鱼和横向传播。
修复要按输出上下文处理:输出到 HTML 文本要 HTML 编码,输出到属性要属性编码,输出到 JS 字符串要 JS 编码,输出到 URL 要限制协议并 URL 编码。富文本不能自己写黑名单,应该用成熟清洗库。Cookie 设置 HttpOnly、Secure、SameSite,降低被盗风险;CSP 可以限制脚本来源,作为纵深防御。
2. csrf的防御, referer验证,referer为空则防御(referer是浏览器特性,为空排除特性之外的问题则做防御验证),
参考完整回答(CSRF):
CSRF 的关键点是攻击者无法读取目标站响应,但可以诱导用户浏览器带着 Cookie 发起请求。如果用户已经登录,浏览器会自动携带 Cookie,导致转账、改密码、绑定邮箱等操作被伪造。
我会从三层防护回答:第一,关键状态变更请求必须校验 CSRF Token,Token 与会话绑定且不可预测;第二,校验 Origin/Referer,拦截跨站来源;第三,Cookie 设置 SameSite=Lax 或 Strict,HTTPS 下加 Secure。对于高危操作,还可以加二次确认、验证码或重新认证。只靠 GET 改状态是不安全的,状态变更应使用 POST/PUT/DELETE 并做服务端校验。
3. xxe无回显探测 dns验证,内部实体探测
参考完整回答(DNS安全):
DNS 的作用是把域名解析为 IP,常见过程是浏览器/系统先查缓存和 hosts,再问本地递归解析器,递归解析器从根、顶级域、权威 DNS 逐级查询并返回结果。安全问题包括 DNS 劫持、缓存投毒、域传送泄露、子域名接管、DNS 隧道、DGA 域名和解析记录暴露真实 IP。
防护上,权威 DNS 要关闭未授权 AXFR,合理配置解析记录和 TTL;重要域名开启 DNSSEC 能降低篡改风险;企业侧监控异常 DNS 查询、长随机子域名和 TXT 大流量;对子域名下线要同时回收云资源,避免子域名接管。
4. xss硬编码如何利用 前端dom型被js代码转义出来,比如\u003c,前提是返回在了js中,在html中除非具备某种标签,其特性可导致特殊编码执行,则能转义出来
参考完整回答(XSS):
XSS 是用户可控内容被浏览器当成脚本执行。反射型常见于搜索参数或错误提示,存储型常见于评论、昵称、工单内容,DOM 型常见于前端从 location、hash、postMessage 中取值后写入页面。影响包括窃取用户信息、发起越权操作、劫持页面、钓鱼和横向传播。
修复要按输出上下文处理:输出到 HTML 文本要 HTML 编码,输出到属性要属性编码,输出到 JS 字符串要 JS 编码,输出到 URL 要限制协议并 URL 编码。富文本不能自己写黑名单,应该用成熟清洗库。Cookie 设置 HttpOnly、Secure、SameSite,降低被盗风险;CSP 可以限制脚本来源,作为纵深防御。
5. java反序列化基础
参考完整回答(Java代码审计):
Java 审计我会从路由和鉴权开始,看 Controller、Filter、Interceptor、Spring Security/Shiro 配置和权限注解是否覆盖所有接口。数据访问层重点看 MyBatis 的 ${} 拼接、JPA 原生 SQL、排序字段拼接和多租户条件缺失。危险能力方面看反序列化、Fastjson/Jackson、SpEL/OGNL、模板引擎、文件上传下载、SSRF、XXE 和第三方依赖 CVE。
举例来说,审 SQL 注入时我会搜索 MyBatis XML 里的 ${},确认参数是否来自请求;如果是 order by,我会要求白名单字段映射。审越权时会看接口是否从 token 中取用户身份,并校验资源 owner,而不是直接使用请求里的 userId。
6. 白盒审计能力问题--这一点应该说可以自行拓展,对owasp10做过调试,对tp审计做过深入调试,对rmi反序列化做过调试,学习过一本书的样子
参考完整回答(Java代码审计):
Java 审计我会从路由和鉴权开始,看 Controller、Filter、Interceptor、Spring Security/Shiro 配置和权限注解是否覆盖所有接口。数据访问层重点看 MyBatis 的 ${} 拼接、JPA 原生 SQL、排序字段拼接和多租户条件缺失。危险能力方面看反序列化、Fastjson/Jackson、SpEL/OGNL、模板引擎、文件上传下载、SSRF、XXE 和第三方依赖 CVE。
举例来说,审 SQL 注入时我会搜索 MyBatis XML 里的 ${},确认参数是否来自请求;如果是 order by,我会要求白名单字段映射。审越权时会看接口是否从 token 中取用户身份,并校验资源 owner,而不是直接使用请求里的 userId。
7. 密码重置处的逻辑问题--第一二三步验证不统一,验证统一但后台返回的更改密码的token可被预测,枚举可猜解,返回敏感数据,后端与前端验证不一致,存在数据查询则可注入,xss编码问题
参考完整回答(Token安全):
Token 设计要看是否可伪造、可泄露、可重放和可撤销。如果是 JWT,Header 和 Payload 只是 Base64URL 编码,不是加密,不能放密码、身份证这类敏感信息;签名算法要固定,禁止 alg=none 和算法混淆;密钥要足够强;exp、iat、aud、iss 等字段要校验。
保护上,浏览器侧 Token 放 HttpOnly Secure SameSite Cookie 更能防 XSS 读取;如果放 localStorage,要重点防 XSS。服务端要支持过期、刷新、吊销和设备维度失效;关键操作可要求短期 Token 或二次认证;传输必须走 HTTPS。
返回安全面经目录