3376 words
17 minutes
2025 字节跳动安全攻防实习生面试

#

前几天从群友手上嫖到了字节的内推,遂投递「安全攻防实习生-安全与风控」岗位,但是我一开始没有想起来面试的是「字节跳动」公司,而是默认当乙方安研在准备。面了一个小时,很明显,感觉他们更想要的是 SDL 一类的,更像安全顾问、提供安全支持的,怎么说呢,我答的更偏向红队,有点抽象了。

一面,都问些了什么?#

主观题#

  1. 自我介绍一下吧。

    • 日常自我介绍,实习经历,校园经历,项目经历等。
  2. 你在 CTF 这边主要是做的什么方向?举一个曾经打过的印象深刻或者难度较高的题目?

    • 因为第一份实习是偏二进制,估计是处于这个原因,面试官问了这个问题。当时一下子没太想得起来什么题目,就给他讲了一下自己之前出过的一个综合度较高的题目。
  3. 你刚刚提到了 MD5 长度扩展攻击,谈谈原理?

    • 原理讲解,略。
  4. 关于 SQL 注入,在你熟悉的语言里面如何防护?假设你的应用方写了很多的 SQL 注入漏洞,你怎么进行修复?或者如何规避这个问题?

    • 我自己谈到的是套一个 WAF,或者做引流一类的,对于开发层面则是使用 ORM 进行开发,不过在后面反问的环节中,面试官提到甲方这边修复漏洞的话主要是这些:
      • 如何在开发不知情的条件下,我能改就悄悄给他修复了。
      • 教开发做事,教他怎么把这个漏洞修复。
      • 给开发组提供更安全的 SDK,让其能够在开发上就规避漏洞。
      • 从后渗透角度出发,让攻击者就算能找到这个漏洞,也难以利用,对于这种情况进行针对性的防护。
      • 结合业务实际场景给出方案。
  5. 使用 ORM 一定能够防御 SQL 注入吗,有没有使用了 ORM 但是仍然存在 SQL 注入的可能?

    • 我回答的是比如 SQLite 中使用 MATCH 子句的时候,如果出现非法的 FTS 语法,可能导致预期之外的结果,不过看上去面试官更希望答 order by,后面我了解到 order by 后面不能进行参数化,可能会在这个地方导致注入。
  6. 「order by」 这个操作能够通过 ORM 防住吗?

    • 我不是很清楚能不能完全防住,有点可惜当时忘了扯 Django 的 CVE-2021-35042。我给出的解决方案是白名单,比如只能限制特定的字段等。
  7. 有没有研究过主流的 ORM 框架是如何得到一个安全的 SQL 的?ORM 是怎么防止 SQL 注入的?

    • 我主要扯了预编译这些,以及我是怎么理解这个编译的,还带了一些 sqlalchemy 中的 compile 装饰器等。但我感觉还有更深层次的原理需要理解(已加入 TODO)。
  8. 宽字节注入的原理能讲讲吗?

    • 主要原理在编码转换导致的单引号逃逸,其余的没有扯太多,个人用这种手法的次数很少。
  9. 你刚刚提到了参数化,参数化是发生在 SQL 引擎中还是客户端 SDK / Driver 端?

    • 有一说一,当时感觉有点不知所云,我的理解是「把代码变为参数化查询发生在哪个地方实现的」所以回答的是 Driver 端。但是复盘的时候感觉他问的可能是「SQL参数化查询是在哪里进行的」,但是比起这个,我还是觉得他问的应该是「在哪里生成参数化查询语句的」。
  10. 聊聊在 CTF 中不太常用的一些漏洞吧,比如 XSS 很难利用。如果在现实生活中遇到 XSS,你如何提高它的危害性?

    • 唉唉唉,思维没有打开啊,当时只聊了获得 admin 的 cookie 并进行更进一步的利用,以及钓鱼等操作。后面面试官补充到还可以进行蠕虫攻击一类的。
  11. 你刚刚提到盗用 cookie 一类的,阻止 XSS 读取 cookie 的一个属性是什么?

    • 服了,脑子里面想的是 CORS 跨域资源共享,绷。
  12. (面试官呃呃呃ing…)HttpOnly 属性了解过吗?

    • 玩几把蛋,本来就不会 XSS,听过这个属性,但是了解甚少,甚至当时都不知道这玩意干嘛的,后面通过 MDN 了解到 「使用 HttpOnly 属性可防止通过 JavaScript 访问 cookie 值」,我是铸币。
  13. XSS 中,假设无法获取到 cookie,你还能进行怎样的利用?

    • 钓鱼,弹窗引导到钓鱼界面,但是感觉面试官不是很满意。
  14. 如何去防护或者缓解 XSS,你的一些思路?

    • 转义、使用一些现成的 JS 库。服了,前几天才看的 vue 的一些写法可以防住 XSS,面试的时候就搞忘了。
  15. 你对除了三大件以外的前端框架,比如 Vue、React 这些,有没有做过代码审计,其中一些可能造成 XSS 的点是什么?

    • 我会个锤子前端,开摆,只能扯一扯 Vue 泄露路由进而利用未授权一类的。后面一想还是想得起来 Vue 的一些 danger 属性一类的,怼着 Vue 文档的「安全 | Vue.js」模块一顿翻就行了。
  16. 你刚刚提到了 CORS,你能讲讲什么是 CORS,以及它可能存在的漏洞吗?

    • 嘿嘿,自己挖坑自己跳,我是傻逼。
    • CORS 概念上没有问题,然后给他扯我是如何在 FastAPI 中配置 CORS 的,漏洞则不清楚,猜了一个错误配置的 CORS 可能导致非预期的访问,例如未授权。后续查了一下,有点偏 CSRF 的感觉,错误的的配置会导致 Web 应用对用户的 Origin 头校验不严格,从而导致用户访问攻击者恶意构造的网站,造成敏感信息泄露等,参考「第40篇:CORS跨域资源共享漏洞的复现、分析、利用及修复过程」这篇文章。
  17. 你刚刚提到了配置 CORS,你是在代码层面还是在中间件(如 Nginx)层面进行配置的?

  18. 在 CORS 以前,采用的是 JSONP 来解决跨域的问题,你了解 JSONP 存在哪些问题吗?

  19. 我们还是聊回服务端吧(汗),有做过后渗透吗?例如你现在有一个容器的低权,如何横向?能谈谈你在容器逃逸这一方面的知识积累吗?

    • 容器大坑啊大坑,感觉扯了 Docker 后面就是 k8s,哈人,但是问题是我也不会太多,也就只能打个哈哈。
    • 回答了利用 Docker 的特权模式和 CVE 来进行逃逸,然后读取敏感文件来做后渗透,其余是真的不会,做的太少了,开摆。
  20. 那现在不考虑容器,普通的 Linux 机器,你获得了低权,有没有一些横向、提权的方法?

    • 答了 suid 提权,读取敏感文件进行横向,拿到 root 后可以发 ping 进行更深层次的扫描了。然后就是用 CVE 如 CVE-2021-4034 提权,当时记错编号说成了 2501,傻逼,真是 250。
  21. 你提到了 suid,能解释一下 suid 这种机制为什么能造成提权风险?

    • 答了一个使用 suid 的场景进行说明,并解释造成提权风险的是 suid 的滥用。
  22. 你了解 linux 中除了 suid 还有什么机制能够防止这种权限过粗的情况吗?

    • 没答上来,记得有,一下子想不起来了,哈哈。后续查了一下,有 SGID、SBIT、Capabilities 等权限提升方案。
    • SUID 仅对二进制文件有效,用户在执行该文件的时候可以在进程上指定 euid 为 root,优先级高于 SGID
    • SGID 主要作用于目录上,可以让程序或者目录拥有所属用户组的权限。
    • SBIT 仅能作用于目录,用于阻止该目录下非文件所有者删除文件,也就是我创的文件只能我和 root 删,你删不了。
    • Capabilities 是粒度更细的线程属性,其把每一个功能单元进行进行独立区分,具有相似功能的内核调用被分配到同一组中。假设线程的权限不为 root,于是检查线程是否具有相对应的 Capabilitiy 属性,从而决定是否执行特权操作。
  23. 普通用户之所以无法发 ping 包,是因为 ping 要发 raw sockets 包需要 root 权限。因为普通用户一般来讲,只能发送传输层以上的包,但是 raw socket 是网络层或数据链路层中,普通用户无法发送。后面(Linux 内核 2.2 以后)引入了 Capabilities。你可以介绍一下 Capabilities 这种机制吗?

    • 当时不了解,开摆,哈哈。不过一些介绍在上一个问题的复盘中已经写了。
  24. 在服务端中发现 SSRF 漏洞,你能谈谈其利用吗?

    • 答了 SSRF 探测内网,然后结合 mysql、 redis 等进行攻击,可以使用 gopher 协议等,讲了一下具体打法。
    • 不过突然想起我居然忘了回答 file 协议?读文件很重要的说……
  25. 聊聊 DNS Rebinding?

    • 瞎扯了一些,主要在 DNS 污染上,甚至说改 HOSTS 等。感觉应该答 DNS Rebinding 的攻击原理和手段,不过个人实操的次数过少,忘得差不多了。
    • 原理应该是利用的浏览器的同源策略,参考「DNSRebind攻击」这篇文章。

代码题#

  1. (一些讲解)写一个 XSS 过滤器,把一些危险的事件(如 onload)过滤掉。

    • 我直接笑飞了,面试官在出题的时候他那边一直弹异常,我这边就是直接看不到,我后面问他示例输入输出是什么,我看不到,先前面试官还在猜测是不是面试平台有 XSS,最后鉴定为可能被 WAF 拦下来了,难顶,就换了一个题。
  2. 在路径穿越中,我们可以使用「../」来穿越到上一个目录。写一个函数,用于输出用户的真实路径是否在「/tmp」目录下。

    • 本来打算使用 pathlib 来解析,以为会有真实路径,结果还是要自己手搓。整体思路就是使用 pathlib 解析后,把 parents 做一个 list,遍历到「..」、且 index != 0,parents_list[0] != ’/’ 就直接把前面一个 index 给 pop 掉,最后 join 起来就没问题了。

反问环节#

  1. 这个岗位具体上是做什么的,以及其运作模式我希望了解一下。

    • 实习生不会去长期跟进一个项目,做的是短期、独立的任务,比如开发一些提效工具、实现一些爬虫、一些对于某个功能的渗透测试任务这些,偏向日常和独立的工作。转正后会跟进具体的业务线,负责整体 SDL 的工作。
  2. 安全这边对 Golang 的要求怎么样?

    • 安全这边没有什么特别要求。
  3. 请面试官对我的面试做一个整体评价。

    • 提一些建议:
      • 打 CTF 和在甲方这边做业务不一样,在 CTF 上涉及较少的漏洞(如 XSS)在业务上则很有可能涉及,需要多了解了解,主要是能够根据面向业务提出一个专业的解决方案,所以侧重点不仅在如何打、如何利用,更是在漏洞的原理上,成因上进行修复和防御思路。
      • 对于综合性的环境还需要加强了解,以及利用方案,例如 docker、k8s、云环境等。
  4. 以 XSS 为例,从防御角度下了解你们一般怎么做的?

    • 其实在上面的第 4 个问题的复盘中已经写了一些了,这里就只给出 XSS 的修复策略。
    • 除了 CSP(内容安全策略)以外,我们还可以去防止其加载恶意 JS 的请求等,防止造成进一步的影响,达到缓解漏洞的思路。
    • XSS 的危害,可能造成蠕虫攻击,在移动端上 XSS 可以调用 WebView 顶层接口,具体一下有没有可能触发 Chrome 的一些 0day 和 nday 漏洞。
    • 对于上述的防护,可以在采用 innerHTML、前端框架中的 dangerous html 方法等,也可以给研发提供一些更安全的 SDK,来支持转义和 JS 过滤。

二面,都问些了什么?#

等通知,真的能活到二面吗?

#

面完我的感觉是,对面好专业,也学到了不少东西,比起那些上来就八股文的厂好太多了。针对甲方的厂子面试的侧重点还不太一样,需要结合业务进行考虑,毕竟人家想的是维持业务稳定,不然谁没事找个人来打自家的东西。

2025 字节跳动安全攻防实习生面试
https://kihanahare.github.io/HanahareHeaven/posts/interview-experience-of-bytedance2025/
Author
KiHanahare
Published at
2025-02-27