常见的Web漏洞
一、SQL 注入
SQL 注入就是通过把 SQL 命令插入到 Web 表单,递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的 SQL 命令的目的。
1、原理:
网站数据过滤不合格,过分依赖用户输入的数据,没有过滤用户输入的恶意数据,无条件的把用户输入的数据当作SQL语句执行,导致sql注入漏洞的产生。
2、分类:
按照注入点类型分为:数字型注入、字符型注入
按照提交类型分为:GET注入、POST注入
按照技巧分类的话可以分为:联合查询注入、报错型注入、布尔型盲注、时间型盲注、宽字节注入
布尔型盲注:
根据页面正确和错误的两种状态,来判断构造语句是否正确
常用length()、Substr()、Mid()、Left()、Ascii()函数
时间型盲注:
时间型盲注页面没有明显的回显,只能根据页面刷新时间的长短来去判断构造语句是否正确常用sleep函数 if条件语句。
宽字节注入:
利用mysql编码方式的一个特性,使用GBK编码的时候,会认为两个字符是一个汉字,绕过了单引号闭合,逃逸了转义
3、修复:
过滤恶意字符和函数过滤或转义单引号双引号使用参数化的语句来传递用户输入的变量。
二、文件上传漏洞
文件上传漏洞是指Web服务器允许用户将文件上传至其文件系统,但这些文件可能并没有经过充分的验证,如文件名称、类型、内容或大小等。
1、原理:
开发人员未在文件上传点对文件名和文件内容做严格的过滤,导致用户可以上传恶意脚本到服务端。
2、文件上传漏洞绕waf方式:
(1)文件名大小写绕过
(2)名单列表绕过
(3)特殊文件名绕过
(4)htaccess 文件
(5)写入方法
(6)截断绕过上传
(7)构造图片马
三、文件解析漏洞
文件解析漏洞指中间件(Apache、nginx、iis等)在解析文件时出现了漏洞,从而,黑客可以利用该漏洞实现非法文件的解析。
文件解析漏洞与文件上传漏洞是两个不同的漏洞概念,文件解析漏洞是利用了中间件(Apache、nginx、iis等)配置不当的弱点进行攻击。
四、文件包含漏洞
1、原理:
文件包含是指在程序编写过程中,为了减少重复的代码编写操作,将重复的代码采取从外部引入的方式,但如果包含被攻击者所控制,就可以通过包含精心构造的脚本文件来获取控制权,一般分为本地包含和远程包含,常出现在php等脚本语言中,包含命令主要有include,include_once,require,require_once。
远程文件包含和本地文件包含的区别:
本地文件包含只能包含本地的文件。
远程文件包含要包含其他服务器的文件。若PHP配置选项allow_url_include为ON的话,则include函数是可以加载远程文件的。
2、修复:
一般的防护手段包括对文件进行敏感内容查找或者限制文件类型等
五、XSS漏洞(Cross Site Scripting)(跨站脚本攻击)
跨站脚本攻击,为了不与层叠样式表的缩写 CSS 混淆,故将跨站脚本攻击缩写为 XSS。XSS 是一种经常出现在 Web 应用中的计算机安全漏洞,其允许恶意 Web 用户将代码植入到提供给其他用户使用的页面中,这些代码包括 HTML 代码和客户端脚本。攻击者利用 XSS 漏洞进行非法访问控制 —— 例如同源策略(SameOriginPolicy)。这种类型的漏洞由于被黑客用来编写危害性更大的网络钓鱼(Phishing)攻击,所以广为人知。对于跨站脚本攻击,黑客界的共识是:跨站脚本攻击是新型的 “缓冲区溢出攻击”,而 JavaScript 是新型的 “ShellCode”。
1、原理:
攻击者利用相应的漏洞,在页面中嵌入JS脚本,用户访问含恶意脚本代码的页面或打开收到的URL链接时,用户浏览器自动加载执行恶意代码,达到攻击的目的。
2、类型
反射型XSS
存储型XSS
DOM型XSS
反射型XSS:反射型XSS,也称为非持久性XSS,是最常见的一种XSSXSS代码常常出现在URL请求中,经过后端,不经过数据库。
存储型XSS:存储型XSS,也称为持久性XSS。允许用户存储数据到服务器端的Web应用程序,经过后端,经过数据库
DOM型XSS:DOM (Document Objet Model)指文档对象模型。不经过后端,动态拼接HTML代码和脚本代码就容易引发DOM型的跨站脚本攻
六、csrf漏洞(Cross-Site Request Forgery)(跨站请求伪造)
1、原理:
利用受害者尚未失效的身份认证信息(cookie、会话等),诱骗其点击恶意链接或者访问包含攻击代码的页面,受害人不知情的情况下会以受害者的身份向服务器发送请求,从而完成非法操作。
2、类型:
get请求型csrf:只需要构造url,然后诱导受害者访问;
Post请求型csrf:构造自动提交的表单,诱导受害者访问或者点击。
3、危害:
利用受害者身份发送邮件、发消息、盗取受害者的账号等
4、修复:
验证http头的referer:仅响应referer头带本域的请求。
请求地址中添加token验证。
使用localstorage和sessionstorage保存会话。
七、ssrf漏洞(Server-side Request Fogery)(服务端请求伪造)
1、原理:
服务端提供了从其他服务器获取数据的功能,但是没有对目标地址进行过滤和限制。比如从指定的URL地址获取网页内容,加载指定地址的图片、数据、下载等等。
一般情况下,我们服务端请求的目标都是与该请求服务器处于同一内网的资源服务,但是如果没有对这个请求的目标地址、文件等做充足的过滤和限制,攻击者可通过篡改这个请求的目标地址来进行伪造请求。
2、修复:
(1)url白名单(限制不能访问内网的ip)
(2)过滤返回信息
(4)统一错误信息
(4)限制请求端口只能为web端口,只允许访问http和https的请求
3、绕过:
(1)(绕黑名单)进制转换ip
(2)(绕白名单)使用@在主机名之前的url中嵌入凭据;
(3)302跳转;
(4)DNS重绑定
八、xxe漏洞(XML External Entity)(外部实体注入)
1、 原理:
一些配置不当的xml处理器会对外部实体进行引用,如果攻击者可以上传xml文档或在xml文档中添加恶意内容,通过易受攻击的代码就能攻击包含缺陷的xml处理器。
2、利用:
任意文件读取、系统命令执行、内网端口探测、攻击内网网站、钓鱼
3、修复防御:
(1)使用开发语言提供的禁用外部实体的方法;
(2)过滤提交的xml数据;(过滤SYSTEM等敏感关键字)
九、逻辑漏洞
1、原理:
攻击者利用业务或功能上的设计缺陷,获取敏感信息或破坏业务完整性。
2、常见的逻辑漏洞:
支付逻辑,短信逻辑,越权漏洞等
3、安全加固手段:
(1)关闭不常用端口与服务;
(2)开启防火墙,不允许外部usb设备插入;
(3)数据库不允许匿名登录;
(4)对可控参数进行严格的检查与过滤。
十、命令执行漏洞
命令执行漏洞就是服务器端没有对客户端用户输入的命令进行过滤,导致用户可以通过任意拼接系统命令,使服务器端成功执行任意系统命令。
1、原理:
程序应用有时需要调用一些执行系统命令的函数,如php中的system、exec、shell-exec、passthru、popen、proc_open、assert、putenv 等。
2、防御:
尽量不执行外部指令;使用自定义函数或函数库来替代外部命令的功能;使用escapeshellerg函数来处理命令参数。
十一、反序列化
如果服务端程序没有对用户可控的序列化代码进行校验,而是直接进行反序列化使用,并且在程序中运行一些比较危险的逻辑(如登录验证等),那么就会触发一些意想不到的漏洞。比如经典的有 Weblogic 反序列化和 Joomla 反序列化漏洞。
漏洞成因:
当输入的反序列化的数据可以被用户控制,那么攻击者就可通过构造恶意输入,让反序列产生非预期对象,同时执行构造的恶意代码
序列化是指Java对象转化为二进制内容,转换的原因就是为了便于网络传输和本地存储。
反序列化的含义是将相应的二进制转换为Java对象。