文章

字节跳动 安全开发 一面记录

前言

BOSS直聘那边发消息,让我提供下详细简历,于是得到了这份字节的面试机会

比较突然,因此没怎么准备,特别是八股文什么的,不喜欢这些。可能以后会准备下八股文吧

面试录了屏,让AI转录了下,以下是具体面试过程

面试过程

面试官:同学你好,能听到吗?

面试者:可以听到。

面试官:好的好的,今天应该有两位面试官,但是另外一位面试官主要是旁听,主要是我来提问。

面试者:好的。

面试官:面试开始之前想先确认一下,你的实习时间是什么时候?

面试者:实习时间的话,大概要等到学校放假,大约七月中旬的样子可以过来,然后可以实习三个月以上。

面试官:好吧,我看你现在才大二对吧?你不用后面回学校上课之类的吗?

面试者:是要回的,但是可以申请一下。

(骗你的,学校不可能申请成功,我选择直接逃课)

面试官:好的,那我们就先开始吧,先请你做一个简单的自我介绍。

面试者:好的。我是来自XX大学的一名大二学生,目前主要是做CTF,方向是Web安全,是Nu1L战队的成员。就这样吧。

面试官:行,那我们就根据你简历上的项目先聊。XXXX是一家乙方公司吗?还是你在这个实习?

面试者:XXXX是(省略部分隐私内容)。会以公司的去名义去对接一些客户,所以我们需要设计一些题目。

面试官:好的,我明白了,你继续。

面试者:我们会出一些题目,好像是一些渗透的一些单点场景,主要就是各种各样的漏洞,每一个设计一个单点。还有一些多点的场景就比较复杂一点。比较的简单可能有一个两点,有一个入口,然后打通之后内网渗透一下。还设计了一个比较多点的网络,有二十个节点,设计了三重的网络,比较复杂的一点,是跟别人一起设计的。

面试官:行,那再说一下腾讯云的这个智能渗透挑战赛,你是独立参加的吗?

面试者:不是。我有个做Agent的学长,问我不想参加这个智能渗透挑战赛。我自己平时也在做渗透,但是对Agent不是特别了解,所以最后跟他一起做。大约比赛前一个月才开始准备,前两周先讨论Agent的核心架构构,纠结选单Agent还是多Agent。后来我们选择了分别一人做一个。我比较喜欢单Agent架构,学长平时做AI比较多,他做多Agent架构。其他的像Kali沙箱、离线的知识库还有技能都是我们一起整的。

比赛开始后,我这个单节点前期在发力,第一天打到了第五名。但多节点在渗透环境下当时测试得不多,我最初的想法是单节点由我的Agent做,多节点由他的Agent做。学长不是特别了解渗透,测试不充分,所以后面他的Agent的作用不是特别大。第一天的题目全是单节点题,我的Agent打到第五;后面上的全是多节点题,换了他的Agent,但是拿的分不是特别多,所以最后得到了第19名的成绩。

面试官:我确认一下,这场比赛是让你们的Agent去拿一些站吗?

面试者:不是,是他们预设的题目。分成四个赛区:第一赛区主要是基础的CTF Web题;第二赛区是CVE;第三赛区是比较基础的Linux多点渗透;第四赛区是比较复杂的域渗透。我负责一、二赛区。然后这些题目都是提前预设好的,Agent要完全自主运行。每天给你三次启动机会,在他们的服务器上部署后启动,启动后就没办法干预了,只能看最后有没有得到分。

面试官:那你们比赛用的基础模型是什么?是腾讯自己的吗?

面试者:我们肯定用的是中转站的一些模型,用了Opus4.6、DeepSeek、GLM等。

面试官:不限制用什么模型对吧?

面试者:对的,可以用中转站的。

面试官:那你有没有分析,你的Agent在CTF题上的表现怎么样?

面试者:那些单点的黑盒CTF题表现还行。

面试官:你指的单点,就是单一漏洞、只涉及一个资产的渗透对吧?

面试者:对,是一个节点,也可以有多个漏洞,但不涉及内网渗透。

面试官:如果让你去优化多节点的渗透,你打算怎么做?

面试者:首先是工具层面。我发现Kali沙箱里关于多节点(特别是域渗透和横向移动扫描)的工具不是很全。当时隧道建立的工具AI用不了,靶场内核不太一样导致用不了,所以先优化工具。其次,我打算做一个多Agent。现在因为单Agent在多节点的情况下可能会遗忘很多记忆。多Agent可以按“探测->利用->”后渗透”这样一直循环。针对不同的职责(例如域渗透和Linux渗透)分开一下,这样更专一一点。

面试官:你自己有实现过这个吗?

面试者:还没有。当时比赛打完后就没有再继续优化了,打算等下一次比赛开始再去优化。

面试官:行。那我们聊一下基础知识。我主要看你打Web方向,其他方向了解吗?

面试者:不是很了解,除了Web可能还会做一些Misc,其他的基本了不了解,因为要专精一个方向。

面试官:我们聊一下Web。先说一下SQL注入的原理、利用方式以及怎么防御。

面试者: (笑,内心OS:经典起手SQL注入)SQL注入主要是由于用户的输入没有正确的过滤。比如你写SQL语句SELECT ... FROM ... WHERE ... = '用户输入',如果是简单把参数拼接进去,例如用户输入里有单引号,就可以把单引号闭合掉。后面再插入的其他语句也可以执行,最后再用注释符注释掉避免语法报错。这样基本相当于可以执行任何SQL语句,通常会脱库找点敏感信息。如果条件允许,例如MySQL里有个 UDF 可以到RCE。

防御方面,最基础的是部署WAF去拦截敏感语句,但很容易被绕过。最好的防御是不要把用户的输入直接拼接到SQL语句里,使用参数化查询,ORM,这样就基本不会导致SQL注入了。偶尔ORDER BY有情况再额外防御一下。

面试官:你刚才说脱库,怎么知道对方数据库表里有哪些表结构呢?

面试者:用SQL语句去查。

面试官:如果没有返回完整回显信息(没有报错或者想要的信息),这个时候怎么办?

面试者:那就是盲注。分布尔盲注和时间盲注。如果有布尔型的回显,就可以一字节一字节地去泄露信息。如果连这个都没有,那就只能用时间盲注,用sleep这种延迟函数去制造时间的偏差来判断。

面试官:你刚才提到的参数化查询,原理是什么?为什么这样后就不会被注入了?

面试者:我印象中是因为它做了预编译。它先把SQL语句的结构给预编译好了,然后再把用户的输入按钮去。这样的话,用户无论输入什么,都不会影响SQL的结构和语法。

面试官:绕过WAF有哪些常见的思路呢?

面试者:看WAF写得怎么样。如果一般般,比如只是拦截空格,那可以用/**/这种注释去绕过。具体实战我没怎么打过,基本都是早期CTF里遇到过。

面试官:请求走私你了解吗?

面试者:我印象中是发一个HTTP包,去修改它的Content-Length,后面再接一个包,两个包当成一个包发过去。对面服务器由于解析不一致,会导致第二个包被当成独立的请求发到内网。CTF里没遇到太多。

(回答的比较烂,因为很少遇到)

面试官:说一下XSS的原理、利用方式以及防御。

面试者:主要是用户输入没有完成过滤。最简单的XSS就是把用户的输入直接插入到HTML里被浏览器解析。这种情况写一个<script>标签就可以偷Cookie。有点复杂一点的,比如把用户输入插入到了属性里,通过插入onfocusautofocus事件去执行语句。

防御的话,最简单的是做过滤,把左右尖括号和敏感词转义或拦截。但过滤可能被绕过,比如利用编码问题。我之前遇到过,利用日本的一个字符集让谷歌器认为后面的文本全都是该字符集,从而忽略掉单引号限制绕过过滤。更好的一点的防御是配置CSP(内容安全策略),设置script-src脚本来源,或者每次返回一个随机的nonce属性。另外,开发时使用Vue之类框架,只要不直接把用户输入当成HTML渲染时,一般不会导致XSS。

面试官: DOM型XSS和存储型XSS的区别是什么?

面试者:存储类型是把用户输入存到数据库里了,接下来访问这个页面就会处罚。DOM类型在CTF里见得比较少,通常是URL里有一个#(触发导航),页面上的JavaScript脚本直接去解析这个内容并插入到DOM里造成的。

(不太了解DOM型,,,没见过其实)

面试官:如果想通过XSS拿管理员标记HttpOnly属性的Cookie,应该怎么办?

面试者:有一个“三明治攻击”。设置一个CookieA带单引号,中间是我们要偷的带HttpOnly的Cookie,再设置一个CookieB把单引号关闭。通过调整Cookie出现的顺序,让请求发过去。如果中间正好有一个回显Cookie的接口,它就把Cookie原样输出,然后浏览器就会把中间那段HttpOnly的Cookie当做普通的文本给解析和关闭出来,我们就可以偷到了。除了这种我暂时想不到其他的。

面试官: Java反序列化你了解吗?

面试者:不太明白,Java入门要特别久。我只是稍微研究了一下CC链的前几条。反序列化就是重建类的过程中会有触发的链条。具体的我确实没法解释清楚

(回答的很烂,确实不太了解)

面试官:那聊一下内网渗透吧。如果你进入了一个Docker环境拿到了Shell,这个时候应该怎么办?

面试者:想办法拿宿主机。先看它有没有挂载一些奇怪的路径,或者是不是开通特权模式。还有就是看有没有挂载/proc目录,可以去修改当前运行中的进程信息。或者看有没有挂载docker.sock,如果挂载了,我可以直接向它发包建一个带特权的Docker容器,把挂载到另一个机根目录下,这样就拥有整个权限了。

面试官:如果这些都没有呢?

面试者:那就找CVE漏洞打。

面试官: CVE也没有怎么办?

面试者:如果目标是内网渗透,我也不一定非要逃到一台机器上,可以直接在容器里尝试对内网发包进行探测。

面试官:有时候你可以看看它的环境变量。

面试者:啊对,翻一翻环境变量里可能有一些关键内容。

(好朴实无华,,,,)

面试官:如果让你去管理一个云的AKSK,你会怎么做

面试官:这个不太了解

(我以为是啥高端的云安全,原来是AccessKey,AccessKey Secret的缩写,之前不知道有这个缩写)

面试官:说一下HTTPS的原理。

面试者:它是用TLS进行密钥交换。客户端发一个随机数据和公钥,服务端收到后确认,并返回一个随机数据和公钥。经过加密流程解密后确认双方身份,再发实际的密钥进行加密传输。具体的八股文已经记不清了。

(这里回答的很烂很烂,因为真不太清楚这些八股文)

面试官:用Burp抓包时导入证书到浏览器,浏览器会提示证书不安全,这是为什么?

采访者:因为我们为了解密HTTPS流量,在中间替换了它的证书。浏览器内置了权威机构的根证书,它去检测,发现我们替换的证书不是权威机构颁发的,就不一样了。

面试官:平时挖洞吗?

采访者:学校网站挖到了一些低危的信息泄露,比如改个学号能看到别人的信息。公网没授权不太敢动。

面试官:一个登录注册页面,您觉得可能存在哪些安全问题?

面试者:先测弱口令爆破,比如admin。不行的话测一下基础的SQL注入或者其他注入什么的。之前遇到一道题,其他端口留有账号密码。如果有注册功能,测一下能不能重复注册,或者如果有恢复账号功能,看看能不能替换邮箱收验证码。还通过指纹识别可以找是不是老CMS,历史漏洞,或者扫描一下有没有后台。

面试官:做域渗透时想重启一个Shell,但是常见的命令(如nc、python、perl)都被取消了怎么办?

面试者:可以写一个C2的脚本去反连。或者写一个原始的Socket脚本去传。

面试官:如果这些常见的都被删除,C2被EDR检测到呢?

面试者:非要反弹Shell的话,我可以在服务器上开SSH之类的后门连上去。其他暂时想不到了。

面试官:打过域渗透吗?

面试者:没有实战打过,只在Hack The Box靶场上学了一点。

面试官:像大模型应用(比如DeepSeek之类的),可能有哪些安全风险?

面试者: DeepSeek之前爆出过XSS,输入恶意内容前端渲染时过滤不好。如果是中转站API的话,风险比较多。可以对模型投毒,比如篡改区块链地址。中转站能看到对话过程,可能会偷用户的私钥。如果是普通的网页版本,主要可能是Markdown渲染库处理链接时的XSS风险。另外就是AI自动读取分析项目时可能读取到注入的提示词,或者是Skill插件被投毒。

面试官: OpenClaw了解吗?你觉得有什么安全问题?

面试者:那个安全风险很大,给的权限太高了。刚开源就爆出了十几个CVE。它的Web UI如果能公网访问,有CVE就直接被打通了。加载的技能插件,SKILL可能被投毒(比如遇到过Skill直接执行Drop Database)。另外模型输出具有随机性,例如让它清理文件可能把整个系统给删了。我在服务器上部署过一次,觉得太危险了。

面试官:如果一定要使用,你是什么样的防御手段?

面试者:一定要容器化部署,即使出事也不至于把宿主机机整没。然后去正规商店下载技能,或者自己去审核。做好沙箱隔离。不要把重要的凭据硬编码给它。

面试官:我没有其他问题了,你还有什么问题想问我的吗?

面试者:想问一下这个工作具体都是做一些什么类型的?

面试官:我们主要是做实战下的攻防。比如传统的SDLC,测试Web系统、API,还有一些的红蓝测试。

面试者:这其实是我第一次面试,能请您评价一下我的表现吗?

面试官:具体评价现在不方便说。可以给你一些建议:你简历里写了一些打CTF的经历,可以多讲一些有意思的题,这样会更好一些。

面试者:好的,明白。

面试官:那我们今天面试就先到这里,拜拜。

面试者:拜拜。

后记

感觉除了有八股文以外都还好,字节这边感觉更看重真实的攻防思路、实操经验,而不完全是去记住这些八股文。而且面试官人也挺好,整体面试氛围还是比较轻松的

字节这边效率挺快,面完20min就告知结果,说一面过了

作为人生的第一场面试,在没有太多准备的情况下能有这个结果,也挺满意了

许可协议:  CC BY 4.0