第125章 南京之旅

作者:Selmon 更新时间:2026/5/20 2:16:11 字数:4014

125

协议签好之后的第三个星期,周正平发来了消息。

“南京有个项目,客户做金融系统的,代码审计。两天能搞定。你方便吗?周五下午出发,周日回来。”

雨晴查了一下日历。周五下午第二节是体育课,可以请假。她回了个“可以”。

跟班主任请假的时候,班主任拿着请假条看了两眼。“又去工作?”

“嗯。南京。”

班主任签了字,没多问。

林听夏晚上来的时候,雨晴正在收拾行李箱。换洗衣服、充电器、笔记本、身份证、几包橘子皮的小鱼干——不是给橘子皮带的,是她自己路上吃的。林听夏靠在门框上看她。

“谁跟你去?”

“张远。上次那个。”

“上次哪个?”

“就上海面试那次,带我上楼的那个。”

林听夏想了想,大概没想起来,但她没再问了。“注意安全。”

“嗯。”

雨晴把行李箱拉好,站起来。林听夏走过来,从口袋里拿出一包东西递给她。暖宝宝。四月底了,南京和郑州差不多温度,用不上暖宝宝。但雨晴没拒绝,塞进了行李箱。“到了发消息。”林听夏说。

周五下午,雨晴打车去高铁站。

张远已经在候车厅了,穿着一件黑色冲锋衣,背着双肩包,手里拿着一杯咖啡。看到雨晴,他站起来挥了挥手。“这边。”雨晴走过去,他从包里掏出一瓶水递给她。“车上喝。”雨晴接过来,说了声“谢谢”。

检票,上车。两个人的座位挨着,靠窗。火车开了之后,张远把笔记本打开,调出一个文档,转过来给她看。“客户的代码量不小,大概两万多行。重点看支付和用户数据相关的模块。安全要求高,因为是金融系统,涉及到资金流转。”

雨晴看着文档上的模块列表。支付接口、用户中心、订单管理、后台管理。她在备忘录里记了几个关键词。

“两天能看完吗?”她问。

“看得完。不用逐行看,重点看敏感功能。”张远合上笔记本。“你之前做过代码审计吗?”

“没有。渗透测试做过。”

“思路差不多。渗透是从外往里打,代码审计是从里往外看。你知道漏洞长什么样,反过来看代码就更容易找到问题。”

雨晴点了点头。

到南京的时候下午五点多。客户公司来了一个年轻男人接站,戴眼镜,穿着格子衬衫,自称姓刘,叫刘伟。刘伟帮他们拿行李,安排了酒店。房间不大,两张床,雨晴和张远各一间。刘伟说“晚上一起吃饭”,张远说“不用了,我们自己解决”。刘伟没坚持,走了。

酒店安顿好之后,雨晴躺在床上,拿出手机。群里慕瑶在问:“到了吗?”

雨晴回:“到了。住下了。”

慕瑶:“明天晚上有空吗?新街口有家奶茶店不错。”

雨晴:“看情况。干完活应该能出来。”

慕瑶发了一个期待的表情。小叶子冒出来了:“面基!面基!”洛神发了一个捂脸的表情,“你激动什么,又不是你面”。小叶子:“我替慕瑶激动不行吗”。深海发了一张猫在窗台上看风景的图。

雨晴没再回。她洗了澡,躺在床上,给林听夏发消息:“到了。”

林听夏回了一个“嗯”。

周六上午九点,刘伟来酒店接他们。客户公司在南京南边一个园区里,写字楼不高,六层,电梯很慢。办公室不大,二十来个人,工位之间隔得很近。刘伟把他们带到一间小会议室,桌上摆着两台显示器,电源线已经插好了。

“代码在服务器上,这是访问地址,账号和密码发你们微信了。”刘伟指了一下墙上的白板。“有问题随时叫我,我在外面工位。”

张远打开笔记本,连上服务器,开始拉代码。雨晴坐在旁边,看着他操作。代码拉下来之后,张远分了模块。“你看用户中心和支付接口。我看订单管理和后台。下午交换。”

雨晴打开IDE,开始看代码。用户中心的功能很常规——注册、登录、修改密码、绑定手机、查看个人信息。她先从登录模块看起。Controller层接收用户名和密码,调用Service层查询数据库。她一路跟到DAO层,看到那行SQL的时候停下来了。

String sql = "SELECT * FROM user WHERE username='" + username + "' AND password='" + password + "'";

拼接。没有预编译,没有参数化查询。标准的SQL注入。

她把代码截了图,在备忘录里记下来。继续往下看。密码处理——password = MD5(password)。MD5,没有加盐。这个问题比SQL注入轻一点,但也是问题。继续看。修改密码功能——需要输入旧密码和新密码。旧密码校验的SQL也是拼接的,同样存在注入。绑定手机功能——发送验证码,校验验证码的时候没有绑定会话,一个验证码可以用多次。她一个一个地记。

看到支付接口的时候,她花了很长时间。支付接口的代码比用户中心复杂得多——签名生成、回调处理、订单状态更新。她一行一行地看。签名生成那段没问题,用了HMAC-SHA256,密钥从配置文件读取。回调处理那段,问题来了。

String callbackSign = request.getParameter("sign");

String localSign = generateSign(orderNo, amount, status);

if(callbackSign.equals(localSign)){

// 更新订单状态

}

没有验签。它只是把客户端传上来的sign和自己生成的sign做比较,但没有用密钥。攻击者可以自己构造sign,伪造任何回调通知。这是一个严重的漏洞——支付回调接口没有签名校验。她写了段测试代码验证了一下,果然可以伪造。

她把代码截了图,在备忘录里标了“高危”。

中午刘伟带了盒饭来。雨晴和张远在小会议室里吃,吃到一半张远问她“找到什么了”。雨晴把SQL注入、MD5、验证码会话绑定、支付回调没验签几个问题说了一遍。张远听到支付回调的时候放下筷子。“这个重点写。金融系统,钱的事,不能马虎。”

下午交换模块。雨晴看订单管理和后台管理。订单管理模块比用户中心写得好,没什么大问题,只有一个越权——订单详情接口从URL传orderId,没有校验当前用户是否有权限查看。她试了一下,用A用户的token访问B用户的订单,成功。记下来。后台管理模块问题更多——日志打印了完整的请求参数,包括用户的身份证号、手机号、银行卡号。她把那段代码截了图。信息泄露。还有一个上传功能,只在前端限制了文件类型,后端没有校验。和之前OA系统的问题一样。

下午五点,雨晴和张远把发现的问题汇总了一下。SQL注入、MD5、验证码会话绑定缺失、支付回调没验签、越权、日志泄露、文件上传绕过。一共七个,两个高危,三个中危,两个低危。

张远说“可以了。今天到这儿,明天上午写报告。”

回到酒店,雨晴洗了个澡,换了身衣服。白色T恤,深蓝色薄卫衣,黑色休闲裤——和昨天穿的一样,没别的衣服了。她对着手机前置摄像头看了看,头发有点油,又洗了一遍。

六点半,她打车去新街口。

奶茶店在一个商场的一楼,门面不大,里面坐了不少人。雨晴推门进去,扫了一圈。角落靠窗的位置坐着一个女生,穿着卡其色风衣,头发染成深棕色,披在肩上。面前放着一杯奶茶,正在看手机。她走过去。

“慕瑶?”

女生抬起头。眼睛不大,但很亮,皮肤很白。她笑了,“陈雨晴?比我想象的还小。”

雨晴坐下。慕瑶把菜单推过来,“喝什么,我请”。雨晴点了芋泥波波。等奶茶的时候,两个人面对面坐着,有一搭没一搭地聊。

慕瑶说她真名叫陆遥,南京本地人,二十三岁,在房产中介做文员。“每天复印材料整理合同,偶尔带客户看房。工资不高,够活。”她说这话的时候语气很平,没抱怨,也没炫耀。雨晴问她“做多久了”,她说“一年多”。

“家里知道吗?”雨晴问。

慕瑶摇了摇头。“不知道。没敢说。我妈身体不好,怕她受不了。”她喝了一口奶茶。“你呢?你家里怎么同意的?”

“闹了一顿。离家出走。后来查出来染色体是女的,他们就接受了。”

慕瑶看着她。“你还离家出走了?”

“嗯。十三岁。一个人跑到郑州。”

“不害怕?”

“怕。但怕也没用。”

慕瑶沉默了一会儿。“你真勇敢。”

雨晴没接话。她不是勇敢。是没有别的路走。

两个人聊了一个多小时。慕瑶说她去年开始吃药的,在南京的一家医院,医生人不错,问什么答什么。攒了一年多的钱,才攒了两万多,离手术还差得远。“不急。”她说,“慢慢来。”

雨晴没劝她,说“嗯,慢慢来”。

走的时候,两个人交换了微信。慕瑶说“下次来南京再约”,雨晴说“好”。出了奶茶店,慕瑶往左走,雨晴往右走。她回头看了一下,慕瑶的背影在人群里,卡其色风衣,深棕色头发,走得很快。

回到酒店,她给林听夏发消息:“见了群里一个南京的。”

林听夏过了几分钟才回:“男的?”

“女的。”

林听夏发了一个句号。雨晴知道这个句号的意思——她放心了。

周日,上午写报告。雨晴把昨天发现的七个漏洞按严重程度排好,每个都有详细的代码截图、复现步骤、修复建议。SQL注入的修复建议写了三种方式:预编译、白名单过滤、ORM框架。支付回调没验签的那个,她写了两段示例代码,演示如何正确验签。张远看了说“可以,就这样”。

下午客户确认报告。刘伟坐在会议室里,一页一页地看。看到支付回调的问题时,他皱了皱眉。“这个严重吗?”

张远说“严重。不验签的话,攻击者可以伪造回调通知,把未支付的订单改成已支付。”

刘伟沉默了几秒。“知道了。我报上去。”

雨晴听到“知道了”三个字,想起深海鱼说的——甲方说知道了,等于知道了但不一定会修。她没说话。

傍晚,刘伟送他们到高铁站。

返程的火车上,雨晴靠着车窗,拿着手机。群里慕瑶发了一条消息:“面完了。清泉比我想象的还厉害。”小叶子说“羡慕”,洛神说“我也想面”,深海发了一张猫羡慕的图。雨晴没回。她翻到和林听夏的聊天记录,最后一条是那个句号。她打了几个字:“晚上到。何意味来接。”

林听夏回:“嗯。”

到郑州的时候晚上八点多。何意味站在出站口,穿着那件浅蓝色卫衣,手里举着一张纸,上面写着“陈雨晴”。雨晴看着他,觉得有点丢人,走过去把纸拿过来折了。“你干嘛写这个?”

“怕你看不到我。”

“我又不是不认识你。”

何意味笑了一下,接过她的行李箱。

“姐,南京好玩吗?”

“没玩。干活。”

“那下次去玩。”

“嗯。”

打车回去的路上,雨晴靠着车窗,有点累。何意味坐在前面,回过头看了她一眼。“姐,你群里那个面基的人,长得好看吗?”

“还行。”

“有照片吗?”

“没拍。”

何意味没再问了。

到家的时候橘子皮蹲在门口。雨晴一进门它就蹭过来,叫得很大声,好像在说“你怎么又走了”。雨晴蹲下来摸了摸它的头。

何意味把行李箱放在客厅,站了一下。“姐,那我走了。”

“嗯。路上慢点。”

门关上了。雨晴换了鞋,先去洗了个澡。洗完躺在床上,橘子皮跳上来在她脚边盘成一团。

她拿起手机。群里小叶子还在聊,“清泉姐回来了吗”。雨晴回了个“到了”。小叶子发了一个欢迎回来的表情。洛神说“好好休息”。深海发了一张猫盖被子的图。

雨晴没再回。她把手机放到枕头旁边,关了灯。橘子皮的呼噜声在房间里响着。她摸了摸猫的背。

明天周一。有课。报告还要发给周正平。项目做完一个,还有一个。

她翻了个身,闭上眼睛。

设置
阅读主题:
字体大小:
字体格式:
简体 繁体
页面宽度:
手机阅读
菠萝包轻小说

iOS版APP
安卓版APP

扫一扫下载