写在前面
今天和同学们分享下常见的Web漏洞原理及对应的加固措施,还有这些漏洞经常会出现的位置。OWASP Top10和漏洞原理及其加固措施也是网络安全工程师面试的常见试题。基于个人水平有限,部分描述采集自pikachu靶场和所学课程中,我个人认为更加精确的描述,以便大家理解,将其总结归纳如下,希望同学们共同进步 :)
1.SQL注入
原理:程序命令和用户输入没有做到区分,使攻击者有机会将程序命令当作用户输入的数据提交给web,web接受相关参数未经处理直接带入数据库查询操作,导致攻击者获得数据库的管理权限,逐步提权,最终控制服务器操作系统。
加固:对来自用户输入的数据进行严格的检查、数据库配置最小特权原则、对特殊字符进行转义处理或者编码转化、严格规定数据长度、网站每个数据层编码统一(全部使用utf-8编码)、避免网站回显sql的错误信息、网站发布前使用专业的sql注入检测工具、限制网站用户的数据库操作权限。
2.XSS跨站脚本攻击
分类:反射性(一次性、非持久性的跨站脚本攻击,仅对当次的页面访问产生影响)、存储型(持久性的跨站脚本攻击,攻击者将数据存储在服务器端)、DOM型(有可能是反射型,也有可能是存储型的,是基于文档对象模型的一种漏洞)。
原理:利用JS可以灵活操作html、css和浏览器的特点,构造JS脚本完成恶意攻击行为,当用户访问被XSS注入的网页,用户浏览器就会解析XSS代码,形成页面嵌套、弹窗构造、页面重定向、图片标签利用、网站种马等。
常见位置:
alert
window.location
location.href
onload
onsubmit
onerror
<iframe>
<textarea>
<img>
<script>
3.CSRF跨站请求伪造
原理:通常是由于服务器端没有对请求头做严格过滤引起的,判断CSRF漏洞的关键点在于判断其对关键信息(如密码等敏感信息)的操作(增删改)是否有严格校验,是否容易被伪造。
加固:对敏感信息的操作增加安全的token(token具有时效性)、对敏感信息的操作增加安全的验证码、对敏感信息的操作实施安全的逻辑流程(如修改密码时,添加先校验旧密码等)、另外referer证据链的引用对于防范CSRF也非常有效。
Token:随机校验参数,向服务器发起请求时,需要提交token参数,只有token校验正确,服务器才会处理客户端的请求。
Referer:消息头用于表示发出请求的原始URL。
4.SSRF
原理:SSRF的成因大都是由于服务器端提供了从其他服务器端应用获取数据的功能,且没有对目标地址做过滤与限制,比如从指定URL地址获取网页文本内容、加载指定地址的文档、图片等,攻击者将篡改的获取资源的请求发送给服务器,但服务器并没有验证请求的合法性,然后服务器则以它的身份访问其他服务器。
对比:CSRF与SSRF对比之下的不同之处在于,CSRF请求不攻击其他服务器,而是冒充用户在站内执行操作。
常见位置:
通过url地址分享网页内容
转码服务
在线翻译
图片加载与下载:通过url地址加载或下载图片
图片、文章收藏功能
为公开的api实现以及其他调用url的功能
从url关键字中寻找share、wap、url、src
利用file协议读取本地文件
所有通过调取外部资源的参数都有可能存在SSRF...
5.XXE
原理:基于可扩展标记语言XML可以解析外部实体DTD的特点,攻击者通过向服务器注入精心构造的xml实体内容,让服务器按照指定的配置进行执行,导致问题,即服务器端接收和解析了来自用户端的xml数据,而又没有做严格的安全控制,导致了xml外部实体注入。
加固:现在很多语言里面对应的解析xml的函数默认是禁止解析外部实体内容的,从而也就避免了这个漏洞的出现,以php为例,php解析xml用的是libxml,其在2.9.0及以上的版本中,已经禁止了解析xml外部实体内容。
常见位置:
<!ENTITY...
6.PHP反序列化
原理:php有时候需要把一个对象在网络上传输,或者把对象写入文件或是数据库的时候,为了方便传输,可以把整个对象转化为二进制串(序列化),等到达另一端时,再还原为原来的对象的过程(反序列化)。序列化和反序列化本身没有问题,但是如果反序列化的内容是用户可以控制的且后台不正当的使用了PHP中的魔法函数时,就会导致安全问题(如:当传给unserialize()的参数可控时,攻击者可以通过传入一个精心构造的序列化字符串,从而控制对象内部的变量及函数)。
常见位置:
serialize()函数
unserialize()函数
_sleep magic魔术方法
_wakeup magic魔术方法
7.任意文件上传漏洞
原理:文件上传功能在web应用系统很常见,比如很多网站注册的时候需要上传头像、上传附件等等。当用户点击上传按钮后,后台会对上传的文件进行判断 比如是否是指定的类型、后缀名、大小等等,然后将其按照设计的格式进行重命名后存储在指定的目录。如果说后台对上传的文件没有进行任何的安全判断或者判断条件不够严谨,则攻击着可能会上传一些恶意的文件,比如一句话木马,从而导致后台服务器被webshell。所以,在设计文件上传功能时,一定要对传进来的文件进行严格的安全考虑。比如:验证文件类型、后缀名、大小;
验证文件的上传方式;对文件进行一定复杂的重命名;不要暴露文件上传后的路径等等...
8.任意文件下载漏洞
原理:文件下载功能在很多web系统上都会出现,一般我们当点击下载链接,便会向后台发送一个下载请求,一般这个请求会包含一个需要下载的文件名称,后台在收到请求后会开始执行下载代码,将该文件名对应的文件response给浏览器,从而完成下载。如果后台在收到请求的文件名后,将其直接拼进下载文件的路径中而不对其进行安全判断的话,则可能会引发不安全的文件下载漏洞。此时如果攻击者提交的不是一个程序预期的的文件名,而是一个精心构造的路径(比如../../../etc/passwd),则很有可能会直接将该指定的文件下载下来。从而导致后台敏感信息(密码文件、源代码等)被下载。所以,在设计文件下载功能时,如果下载的目标文件是由前端传进来的,则一定要对传进来的文件进行安全考虑。切记:所有与前端交互的数据都是不安全的,不能掉以轻心!