代码中被植入了恶意删除操作,太狠了!
开发者(KaiFaX)
面向全栈工程师的开发者
专注于前端、Java/Python/Go/PHP的技术社区
背景
在交接的代码中做手脚进行删库等操作,之前只是网上听说的段子,没想到上周还真遇到了,并且亲自参与帮忙解决。
事情是这样的,一老板接手了一套系统,可能因为双方在交接时出现了什么不愉快的事情,对方不提供源代码,只是把生产环境的服务器打了一个镜像给到对方。
对方拿到镜像恢复之后,系统起来怎么也无法正常处理业务,于是就找到我帮忙看是什么原因。经过排查,原来交接的人在镜像中做了多处手脚,多处删除核心数据及jar包操作。下面来给大家细细分析排查过程。
排查过程
由于只提供了镜像文件,导致到底启动哪些服务都是问题。好在是Linux操作系统,镜像恢复之后,通过history命令可以查看曾经执行了哪些命令,能够找到都需要启动哪些服务。但服务启动之后,业务无法正常处理,很多业务都处于中间态。
原本系统是可以正常跑业务的,打个镜像之后再恢复就不可以了?这就奇怪了。于是对项目(jar包或war)文件进行排查,查看它们的修改时间。
在文件的修改时间上还真找到了一些问题,发现在打镜像的两个小时前,项目中一个多个项目底层依赖的jar包被修改过,另外还有两个class文件被修改过。
于是,就对它们进行了重点排查。首先反编译了那两个被修改过的class文件,在代码中找到了可疑的地方。
在两个被修改的类中都有上述代码。最开始没太留意这段代码,但直觉告诉我不太对,一个查询业务里面怎么可能出现删除操作呢?这太不符合常理了。
于是仔细阅读上述代码,发现上述红框中的代码无论何时执行最终的结果都是id=1
。你是否看出来了?问题就出在三目表达式上,无论id是否为null,id被赋的值都是1。看到这里,也感慨对方是用心了。为了隐藏这个目的,前面写了那么多无用的代码。
但只有这个还不是什么问题,毕竟如果只是删除id为1的值,也只是删除了一条记录,影响范围应该有限。
紧接着反编译了被修改的jar包,依次去找上述删除方法的底层实现,看到如下代码:
原来前面传递的id=1
是为了配合where
条件语句啊,当id=1
被传递进来之后,就形成了where 1=1
的条件语句。这个大家在mybatis中拼接多条件语句时经常用到。结果就是一旦执行了上述业务逻辑,就会触发删除T_QUART_DATA
全表数据的操作。
而T_QUART_DATA
表中是用于存储触发定时任务的表达式,到这里也就明白了,为啥前面的业务跑不起来,全部是中间态了。因为一旦在业务逻辑中触发开关,把定时任务的cron表达式全部删除,十多个定时任务全部歇菜,业务也就跑步起来了。
找到了问题的根源,解决起来就不是啥事了,由于没有源代码,稍微费劲的是只能把原项目整个反编译出来,然后将改修改地方进行了修改。
又起波折
本以为到此问题已经解决完毕了,没想到第二天又出现问题了,项目又跑不起来了。经过多方排查和定位,感觉还有定时任务再进行暗箱操作。
于是通过Linux的crontab命令查看是否有定时任务在执行,执行crontab -e
或crontab -l
,还真看到有三个定时任务在执行。跟踪到定时任务执行的脚本中,而且明目张胆的起名deleteXXX:
而在具体的脚本中,有如下执行操作:
这下找到为什么项目中第二天为啥跑不起来了,原来Linux的定时任务将核心依赖包删除了,并且还会去重启服务。
为了搞破坏,真是煞费苦心啊。还好的是这个jar包在前一天已经反编译出来了,也算有了备份。
小结
原本以为程序员在代码中进行删库操作或做一些其他小手脚只是网络上的段子,大多数人出于职业操守或个人品质是不会做的。没想到这还真遇到了,而且对方为了隐藏删除操作,还做了一些小伪装,真的是煞费苦心啊。如果有这样的能力和心思,用在写出更优秀的代码或系统上或许更好。
当然,不知道他们在交接的过程中到底发生了什么,竟然用这样的方式对待昔日合作的伙伴。之所以写这篇文章,是想让大家学习如何排查代码问题的过程,毕竟用到了不少知识点和技能,但这并不是教大家如何去做手脚。无论怎样,最起码的职业操守还是要有的,这点不接受反驳。
1. 回复“m”可以查看历史记录;
2. 回复“h”或者“帮助”,查看帮助;
开发者已开通多个技术群交流学习,请加若飞微信:1321113940 (暗号k)进开发群学习交流
说明:我们都是开发者。视频或文章来源于网络,如涉及版权或有误,请您与若飞(1321113940)联系,将在第一时间删除或者修改,谢谢!
开发者:KaiFaX
面向全栈工程师的开发者
专注于前端、Java/Python/Go/PHP的技术社区
代码中被植入了恶意删除操作,太狠了!相关推荐
- 【转】html 代码中 table 跨行跨列的操作
例1 跨2列: <table border="1"><tr><td colspan="2" align="center& ...
- php 删除相对应的id,PHP 在下面这个留言板代码中加入删除按钮,每一个删除按钮删除相对应一行数据,这怎么弄...
匿名用户 1级 2014-07-15 回答 看看这样如何,其中response_foo.php为响应页, 可以写到每一行中间 追问: 不是啊 我想要点一个删除 那一行的数据全部没有 我这个是循环留言板 ...
- 将C/C++代码中的注释删除
题目: 将C/C++代码中的注释通过程序删除. 分析: C/C++中的代码注释,包括如下形式://, /* */. 当然,在""和''中的//, /* */是无效的,不应删除. 因 ...
- 数据结构学习笔记:顺序表的删除操作及其演化题目总结
目录 前言 例题 类似题目1 类似题目2 类似题目3 类似题目4 类似题目5 结语 前言 文章代码皆在Dev-C++ 5.11中测试,主要是总结一些方法,从而总结一些规律使自己进一步地深化学习内容,仅 ...
- java实现基于AmazonS3文件上传、下载、删除操作
1.创建工具类 AwsS3Utils import com.amazonaws.AmazonServiceException; import com.amazonaws.SdkClientExcept ...
- winform代码:关联窗体数据更新,删除dataGridview中选中的一行或多行
一.关联窗体数据更新 关联窗体数据修改时,如果一个为总体数据显示窗体A,另一个为详细修改窗体B,从A进入B,在B中对数据进行修改,然后返回A,这时A窗体的数据需要更新. 我采用最简单的方法,首先保证每 ...
- ArrayList中元素的删除操作
ArrayList中元素的删除操作 在聊 ArrayList 的删除删除操作之前,先来说说它的遍历方法. 一个 list 的遍历方法主要有三种: Iterator 迭代器遍历 遍历下标 for 循环遍 ...
- 代码随想录Day04 | LeetCode24. 两两交换链表中的节点、LeetCode19. 删除链表的倒数第N个节点、LeetCode160. 链表相交、LeetCode142. 环形链表Ⅱ
LeetCode24. 两两交换链表中的节点 力扣题目链接 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点.你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换). 示例 ...
- 浅析B树、B+树插入删除操作(附代码实现)
首先自平衡树是为了解决二叉搜索树在有序数据中退化为链表的问题(即查找时间退化为 O(n) 级别). 自平衡树中,B树.B+树可以说是最简单的,没有旋转.变色等操作.我们可以拿多路平衡查找树和同样是自平 ...
最新文章
- vue-cli脚手架(框架)
- html不支持css3,ie不支持css3吗?
- Lumen配置文件按需加载出现的坑
- 2012年11月14日学习研究报告
- Mysql ERROR 145 (HY000)
- @autowired注解_SpringBoot常用注解大全
- Scala语言将加入宏指令
- union all动态表_Excel VBA——动态显示图表
- 设计模式建议学习顺序
- java中的的一些生命周期,Java中对象的生命周期
- 关于Linux内核的一些问题
- winform获取appconfig配置文件得配置
- Atitit.部分错误 设计模式,异常处理框架atiPartErr 的总结
- 小游戏市场被微信点燃,社交平台蜂拥而至谁能分到蛋糕?
- JAVASE第5天笔记
- Windows10远程桌面登录——Teamviewer
- vmware14安装黑苹果max ox x 10.13懒人版教程
- wetool企业微信营销管理系统开发
- VB MsgBox 函数 了解一下
- Layui表单复选框验证