我们构造恰当的 EL 表达式(注意各种转义,下文的输入参数相对比较明显在做什么了,实际上还有更多黑科技,比如各种二进制转义编码啊等等),就能直接执行输入代码,例如:可以直接执行命令,“ls -al”,返回了一个 UNIXProcess 实例,命令已经被执行过了 。

文章插图
比如,我们执行个打开计算器的命令,搞个计算器玩玩~

文章插图
我录制了一个动图,来个演示可能更生动一些 。

文章插图
这还得了吗?这相当于提供了一个 webshell 的功能呀,你看想运行啥命令就能运行啥命令,例如 ping 本人博客地址(ping www.tanglei.name),下面动图演示一下整个过程(从运行 ping 到 kill ping) 。

文章插图
岂不是直接创建一个用户,然后远程登录就可以了 。后果很严重啊,别人想干嘛就干嘛了 。
我们跟踪下对应的代码,看看内部实现,就会“恍然大悟”了 。

文章插图

文章插图
经验教训幸亏这个漏洞被扼杀在摇篮里,否则后果还真的挺严重的 。通过这个案例,我们有啥经验和教训呢?那就是作为程序员,我们要对每一行代码都保持“敬畏”之心 。也许就是因为你的不经意的一行代码就带来了严重的安全漏洞,要是不小心被坏人利用,轻则……重则……(自己想象吧)
此外,我们也应该看到,程序员需要对常见的安全漏洞(例如XSS/CSRF/SQL注入等等)有所了解,并且要有足够的安全意识(其实有时候研究一些安全问题还挺好玩的) 。例如:
- 用户权限分离:运行程序的用户不应该用 root,例如新建一个“web”或者“www”之类的用户,并设置该用户的权限,比如不能有可执行 xx 的权限之类的 。本文 case,如果权限进行了分离(遵循最小权限原则),应该也不会这么严重 。(本文就刚好是因为是测试环境,所以没有强制实施)
- 任何时候都不要相信用户的输入,必须对用户输入的进行校验和过滤,又特别是针对公网上的应用 。
- 敏感信息加密保存 。退一万步讲,假设攻击者攻入了你的服务器,如果这个时候,你的数据库账户信息等配置都直接明文保存在服务器中 。那数据库也被拖走了 。
毕竟我不是专业研究Web安全的,以上说的可能也不一定对,如果你有不同意见或者更好的建议欢迎留言参与讨论 。
推荐阅读
- Python 100个样例代码
- 工行9920代码必须销户吗?
- word宏病毒代码 word中宏病毒了怎么处理
- 十几行Python代码轻松实现txt转xls,方便快捷
- 给Python代码加上酷炫进度条的几种姿势
- 高级程序员最爱用的8款代码编辑器,你用哪几个?
- 淘宝店铺关联代码在哪里找 阿里巴巴店铺关联快递的代码在哪
- 永远不要在代码中使用“User”这个单词
- 低代码和零代码火了,十大利器推荐
- 某团购CMS的SQL注入漏洞代码审计
