再谈web系统安全

再谈web系统安全

最近被推到了网络攻防的第一线,虽然运行的是一个不那么大的系统,竟然两次招贼,碰到了网络攻击事件。这纯Internet果然是非常不安全的,处于非常原始的黑暗森林状态,各种各样的黑客机器人在Internet上面到处乱窜,寻找着自己的猎物,一不小心就从漏洞钻进来咬一口。防不胜防,烦不胜烦。

下面就入侵问题粗略的谈一下,记录以供自己与朋友们参考。

1 入侵的伤害形式:

系统入侵之后,从结果来说,大致分为对服务器的伤害,与对访问服务器的用户客户端的伤害。

1.1 服务器端脚本/代码执行。

对服务器的伤害基本就是恶意程序直接在服务器本身执行。比如攻击的第一步,webshell,各种一句话木马就属于此类。在上传了恶意代码之后,用webshell来作为管道,发送黑客的各种命令,并把结果传给黑客。

1.1.1 服务器信息泄露

服务器信息泄露算是黑客里面比较善意的了。黑客只是在你不同意的情况下把你的东西偷走,并没有在你的服务器里面乱砍乱砸,是不是应该感谢这种善意?:)

服务器的信息泄露,可以通过sql注入,获得数据库的权限进行倒库。也可以在不破坏规则的情况下,发现从后端拿到的数据的规律,进行统计,然后进行倒库操作。(这和国民党当时的“中统”,“军统”的职责有异曲同工之妙,所谓“统计”,其实就是干的这个工作,但是国民党的这两个部门的文职人员的水平太差,结果这两个部门名不符实,让后人只知道他们的武行,暗杀,而忘记了所谓“统计”部门的真实功能。)

那么对于这种漏洞,主要就是要防范sql注入与各种有规律的数据的主键,而且把这种主键暴露出来。当然,这是非常初级的知识,我相信大部分的专业选手不至于栽在这上面。

1.1.2 服务器被控制

服务器被控制是服务器入侵的终极形式。一般情况下,服务器在被上传webshell之后,黑客会想尽办法寻找各种系统漏洞,系统的运行轨迹进行提权操作。一旦到达这一步,那么这台服务器已经完全落入黑客之手,可以被用作肉鸡进行二次攻击,可以任意修改系统来羞辱对手。不一而足。

应对之道:服务器被控制的入口都是文件木马上传。那么应对之道,也就集中在了对文件上传接口的控制。基本原则就是可写的目录不可执行,可执行的目录不可写。另外就是定时巡检,看看服务器是否多了莫名其妙的文件。当然,现在的服务器杀毒软件,服务器防火墙会处理大部分的工作,但是也不能完全靠这个,毕竟是先有了入侵,这些软件才能升级。肯定是先有矛再有盾的。

另外就是对于脚本执行的禁止。其实这也是脚本语言的天然劣势。无论是asp,php,aspx,jsp,都是通过服务器来解释执行的。从安全性考虑,不妨放弃这些方案,直接采取其他的技术来实现web后台,不依赖这些脚本的执行,那么黑客上传了脚本,获得了执行权限,也要为如何执行这些脚本大费周章,让他们知难而退。

1.2 客户端恶意代码执行。

客户端恶意代码的执行,是入侵的另一种形式。也就是黑客在无法获得“服务器端脚本执行”的目标情况下,退而求其次,想办法入侵访问此服务器的客户端的情况。

客户端的入侵,基本分为如下情况:

1.2.1 Xss

Xss 是 cross site scripting 的简称,指的是把JS代码存入目标服务器,然后其他客户端在访问服务器的时候,就会在客户端执行恶意JS,从而达到入侵或者盗取客户端信息的目的。

XSS基本可以分为反射型,存储型,DOM型。

反射型一般是发送一个url给受害者,骗取用户点击,然后恶意代码就会在客户端执行。所以这也是为什么我们不能随意点击邮件里面的,或者不明目的的网站里面的链接的原因。

存储型XSS是在服务器的输入端,插入自己的恶意代码,然后把这些代码提交到服务器端。而后其他的客户端在访问服务器时,就会在客户端执行。因为现在很多的输入是接收富文本编辑框输入的,服务器端没有过滤的话存储型XSS更容易实现。

DOM型XSS是从另一个维度对XSS进行划分,反射型,或者存储型XSS都可以是DOM型的。它的特征就是恶意代码是通过操作DOM来达到恶意目的的而已。

1.2.2 Crsf

Csrf指的是 cross site request forgery 请求欺骗。指的是恶意代码,盗取用户的身份信息,然后利用此敏感信息发起对服务器的访问,获取有价值的信息,甚至盗取用户的银行信息。

下图基本讲述了此攻击的过程,黑客通过一些手段,让受害者执行恶意脚本。盗取用户身份信息,冒充用户发起对服务器的访问。

现在应付crsf有很多种方式,我觉得最好的还是客户端token方式,对token的属性进行甄别,以判断是否是真正的用户请求。

2 入侵的方式

入侵的方式基本如下,黑客的根本目的就是让服务器执行自己的恶意代码,要达到此目的,必须想方设法把恶意数据提交到服务器,或者通过代码的方式提交,或者通过恶意文件的上传。

2.1 数据的提交。

黑客会尝试服务器的各个提交代码的机会,普通的输入框,富文本编辑框等等。Sql注入,xss等都要想方设法提交各种稀奇古怪格式的,编码的字符串,以跳过服务器端的各种检测。防守之道也是对这种输入进行各种判断。比如对纯文本类型的,富文本的。纯文本的就比较简单,过滤各种不会出现的特殊字符即可。富文本的话,就是要禁止js代码。但是各种各样的代码漏洞,还有浏览器的漏洞,让这些工作做起来并不容易。

2.2 入侵url的发送

黑客会想方设法多撒网,以希望自己的恶意url被点击,这是入侵的第一步,也是隐藏黑客真实地址,真实身份的手段。初级的黑客,会在入侵的服务器留下各种蛛丝马迹,甚至会掉入服务器专门设置的陷阱里面。而进阶的黑客就知道隐藏自己的行踪的重要性。每次行动都会刻意抹去各种日志,或者仅仅抹去自己的行动日志。让反侦察行动很难下手。

2.3 文件上传

文件的上传对于服务器入侵是必须的。各种木马,webshell都要为黑客打开通道,因此,文件上传漏洞对于运维人员是致命的。要定时巡检,寻找可疑的文件。定期对服务器文件系统进行拍照,对比早先的快照以发现可疑文件。

2.4 不是漏洞,黑客就是用DDOS攻击你。

这是最粗暴的攻击,既然不能攻破你,就让你的服务器无法服务,黑客调用自己控制的肉鸡机器,对目标服务器发起高压力的访问,导致服务器无法响应正常的访问。

应对之法就是细调防火墙参数,以及对恶意访问IP的封堵。这算是最基本的,粗暴的攻击了。

3 漏洞的种类:

3.1 逻辑或者代码漏洞

这是系统开发者需要特别注意的地方。代码逻辑里面的各种没有覆盖完全的情况,开发者遵守各种review的流程。都可以尽量的避免这种代码漏洞。

3.2 非代码漏洞:应用软件或者操作系统漏洞

这是运维人员需要注意的地方,应用软件,操作系统都要时刻注意业界的各种报告。定期给自己的基础软件打各种补丁。不是自己代码的漏洞引起的攻击,才真够冤的。

一些注意事项:

1 千万不能让服务器裸奔。

我第一次中招就是随意的把数据库端口开放,而且密码也设置了和测试环境一样的简单密码,结果数据库就被黑客拿走了,勒索比特币。幸亏也就是一些垃圾测试数据,黑客拿走也是毫不心疼,如果是真是的数据库损失可就不可想象了。

不过也因此让我绷紧了安全这根弦,本来觉得Internet还算安全吧,却被现实狠狠教训,这Internet上面完全就是黑暗森林状态,各种黑客写的机器人在互联网上乱窜,尝试用最简单的密码去破解服务器账户,端口,服务器,数据库。因此,服务器必须遵守最小知晓,最小可用原则。根本不要寄希望于自己不被黑客光顾这种小概率事件,要把主动权抓在自己手里。

2 完全的安全是不可能的,不要在这上面有执念。

安全这东西,都要有个度,千万不可有执念,费太多的精力。上一篇文件已经介绍,系统安全的设计,以应付绝大多数的攻击为目标。不要为此影响业务流程与服务器性能。

3 我在想是否要建立一个蜜罐系统,监察可疑的黑客,或者让黑客以为自己已经得手?满足人家的好奇心。俗话说得好,不怕贼偷,就怕贼惦记。让这些小毛贼自以为得手,是不是满足了双方的需要。:) :) :)

编辑于 2020-01-21 09:28