目录
7.不安全的文件下载(Unsafe file downloads)
8.不安全的文件上传(Unsafe file uploads)
1.SQL注入
什么是SQL注入?
在前端与后端进行数据交互时,由于开发者没有对传入数据进行严格的校验,导致传入后端的数据被拼接到SQL语句中,被当作SQL语句的一部分执行。
所以说,如果存在SQL注入漏洞,攻击者就可以通过在输入时构造恶意的SQL代码,就可以对数据库进行非法操作。
SQL注入的分类有哪些?
根据参数的包裹形式的不同:
- 数字型注入
- 字符型注入
根据请求形式的不同:
- GET型
- POST型
- JSON参数注入
- 还有PUT、DELETE等等,但是一般使用较少
根据注入手段的不同:
- 基于时间的盲注
- 布尔盲注
- 联合查询注入
- 堆叠查询注入
- 报错注入
- 存储过程注入
- 二次注入
- 宽字节注入
其他注入:
- cookie注入
- 请求头注入
SQL注入产生的原因有哪些?
- 不安全的输入校验:应用程序没有对用户输入进行严格的校验,攻击者可以在输入数据中插入恶意的SQL代码来执行。
- 动态拼接SQL语句:应用程序将用户输入的数据直接拼接到SQl语句中,没有使用参数化查询和预编译语句,攻击者可以插入恶意SQL代码来执行。
- 不安全的数据传输:数据在传输过程之中没有经过加密或使用了弱加密算法,攻击者可以拦截并修改数据,从而注入恶意的SQL代码。
- 过于详细的错误信息:在应用程序中显示详细的错误信息可能会为攻击者提供有关数据库结构与查询的敏感信息,使其更容易进行注入攻击。
- 数据库账户权限过高:开发者没有严格设置数据库用户的权限,导致非管理员用户也能进行增删查改,甚至跨库操作。
- 数据库账户共享:多个应用程序共享同一个数据库账户,并且一个应用程序受到了注入攻击,攻击者可能能够通过同一账户访问其他应用程序的数据库。
SQL注入的危害有哪些?
- 数据泄露:攻击者可以通过SQL注入获取敏感信息,如用户密码、个人信息等等。
- 数据篡改:攻击者可以通过SQL注入修改数据库中的数据。
- 拒绝服务:攻击者可以通过SQL注入执行破坏性的SQL语句,导致数据库性能下降或完全拒绝服务。
- 权限提升:攻击者通过SQL注入可能越权执行某些操作,获取超过其正常权限的访问权。
- 发现应用程序漏洞: SQL注入可能暴露应用程序中的其他漏洞,因为攻击者通过注入点可能发现应用程序的内部工作方式。
SQL注入的修复建议有哪些?
- 参数化查询与预编译
- 避免动态拼接SQL
- 使用ORM框架
- 严格校验用户输入
- 最小权限原则
- 错误信息处理
- 数据库账户独立
- 安全更新与升级
- 安全审计与安全教育
2.XSS(跨站脚本漏洞)
什么是XSS?
XSS全称是跨站脚本,是一种常见的web漏洞。产生XSS的原因是因为前端没有对输入输出做严格的校验,导致攻击者精心构造的恶意JS代码输入后,被浏览器解析当作有效代码执行。
换句话说,JavaScript能做什么,XSS就能做什么。
XSS的分类有哪些?
- 反射型XSS:交互的数据不存储在数据库,而是将交互的数据包含在页面中。
- 存储型XSS:交互的数据会被存储在数据库中,当用户访问包含这些代码的页面时,代码会从服务器检索并执行。
- DOM型XSS:攻击者通过修改网页的DOM实现攻击。这种类型的XSS不涉及服务端,而是通过修改客户端(用户浏览器)的DOM来实现攻击。
XSS的危害有哪些?
- 窃取用户信息
- 会话劫持
- 恶意操作
- 网站篡改
- 劫持用户行为
简述一下XSS漏洞测试流程?
- 在目标站点找到输入点,例如输入框、评论、留言板
- 构造特殊字符:“特殊字符 + 唯一识别字符”,提交之后查看返回的源码,是否有做对应的处理
- 通过搜索定位到唯一标识字符,结合前后语法确认是否可以构造执行JS代码的条件
- 提交payload,成功执行则存在漏洞
XSS的修复建议有哪些?
- 严格校验用户输入
- 输出转义
- 限制脚本运行
- 使用安全的开发框架
- 安全更新与升级
- 安全审计与安全教育
3.CSRF(跨站请求伪造)
什么是CSRF?
CSRF全称是跨站请求伪造,攻击者利用用户在已登录的情况下对其他网站发送请求,从而在用户不知情的情况下执行某些操作。
CSRF与XSS的不同之处在哪?
CSRF是借用户的权限完成攻击,攻击者并没有拿到用户的权限。而XSS是直接盗取到了用户的权限,然后实施破坏。
CSRF的修复建议有哪些?
- CSRF Token:在页面中绑定一个随机生成的CSRF Token,并将其与用户会话绑定。在执行敏感操作的时候,验证请求中的Token是否合法,从而确定请求是否是用户自己发起的。
- 同源检测:浏览器的同源策略会阻止跨域的请求,因此攻击者无法直接发送带有用户身份的请求到其他域。
- 跨域:域名不同、域名相同端口不同、二级域名不同。
- 限制敏感操作的Refener:在服务端验证请求的Refener头,确保请求来源合法。
- 使用SameSite Cookie属性:在 Cookie 中设置 SameSite 属性,限制第三方站点对 Cookie 的访问,减少 CSRF 攻击的可能性。
- 对用户进行安全教育
4.Burt Force(暴力破解漏洞)
什么是暴力破解?
暴力破解是一种密码破解方法,攻击者通过尝试所有可能的密码组合来获得正确的密码,从而获得账户的访问权限。
如何防止暴力破解?
- 强密码策略
- 账户锁定机制
- 多因素身份验证
- 访问日志与监控
- IP封锁
- 延时策略
- 对用户进行安全教育
5.RCE(远程系统命令控制漏洞)
什么是RCE?
RCE全称是远程命令执行漏洞,攻击者可以通过直接向后台服务器远程注入系统指令或代码,从而控制后台系统。
RCE产生的原因是什么?
应用系统上需要给用户提供指定的远程命令操作的接口,但是服务器没有对执行命令的函数进行严格的过滤,最终导致命令被执行。
常见的命令执行函数有哪些?
PHP代码执行函数:
- [[eval()、assert()、preg_replace()、create_function()、array_map()、call_user_func()、call_user_func_array()、array_filter()、uasort()等等
PHP命令执行函数:
- system()、exec()、shell_exec()、pcntl_exec()、popen()、proc_popen()、passthru()等等。
RCE的危害?
- 直接获取服务器权限
- 读取敏感数据、文件并写入恶意文件getshell
6.Files Inclusion(文件包含漏洞)
什么是文件包含?
文件包含,本身是一个功能。在各种开发语言中都提供了内置的文件包含函数,它可以使开发人员在一个代码文件中直接包含(引入)另外一个代码文件。
比如 在PHP中,提供了:
- include()
- include_once()
- require()
- require_once()
这些文件包含函数,这些函数在代码设计中被经常使用到。
大多数情况下,文件包含函数中包含的代码文件是固定的,因此也不会出现安全问题。但是,有些时候,文件包含的代码文件被写成了一个变量,且这个变量可以由前端用户传进来,这种情况下,如果没有做足够的安全考虑,则可能会引发文件包含漏洞。攻击着会指定一个“意想不到”的文件让包含函数去执行,从而造成恶意操作。
文件包含产生的原因是什么?
文件包含的代码文件被写成了一个变量,且这个变量可以由前端用户传进来,这种情况下,如果没有做足够的安全考虑,则可能会引发文件包含漏洞。
文件包含的分类有哪些?
根据不同的配置环境,文件包含漏洞分为如下两种情况:
- 本地文件包含漏洞
顾名思义,对服务器的本地文件进行包含(也就是能控制服务器本地文件),然后利用本地文件包含,对系统敏感的配置文件进行包含。如果结合文件上传漏洞,然后将恶意文件下载到本地,再包含这些恶意文件,就能形成更大的危害。
- 远程文件包含漏洞
顾名思义,对第三方的服务器文件进行远程文件包含(也就是远程包含),如果通过URL地址对第三方服务器的恶意文件进行包含(调用其他网站的恶意文件),产生的危害更大(攻击者可以更容易地控制文恶意文件的内容)。
常见的文件包含函数有哪些?
php:
include():找不到文件,只生成警告(E_WARNING),并且脚本会继续include 'filename';
include_once():在脚本执行期间包含并运行指定文件,如果该文件中的代码已经被包含了,则不会再次包含。如同此语句名字暗示的那样,只会包含一次,且 include_once 会返回 true。include_once("test.php")。
fopen():打开文件或URL。
require():找不到文件,会生成致命错误(E_COMPILE_ERROR)并停止脚本require 'filename';
require_once():在脚本执行期间包含并运行指定文件,如果该文件中的代码已经被包含了,则不会再次包含。
注意:include在使用时加载,而require在一开始就会加载啊。
jsp/Servlet:
ava.io
file():Java文件类以抽象的方式代表文件名和目录路径名。该类主要用于文件和目录的创建、文件的查找和文件的删除等。File对象代表磁盘中实际存在的文件和目录,通过构造方法创建一个File对象,创建File对象成功后,可以使用函数方法操作文件。
java.io:Java的核心库java.io提供了全面的IO接口。包括:文件读写、标准设备输出等。Java中IO是以流为基础进行输入输出的,所有数据被串行化写入输出流,或者从输入流读入。
filereader():FileReader类从InputStreamReader类继承而来。该类按字符读取流中数据。可以通过构造方法创建需要的对象,创建FIleReader对象成功后,可以参照函数方法操作文件。
asp:
include file
include virtual
文件包含的危害?
- 敏感信息泄露(网站源码、配置文件、系统日志等)
- 配合上传漏洞获取Webshell(图片马等)
- 执行任意脚本代码(远程执行.php脚本代码)
- 控制服务器(能执行任意命令)
PHP的伪协议有哪些?
常见的PHP伪协议:
file:// 访问本地文件系统 http:// 访问 HTTP(s) 网址 ftp:// 访问 FTP(s) URLs php:// 访问各个输入/输出流(I/O streams) zlib:// 压缩流 data:// 数据(RFC 2397) glob:// 查找匹配的文件路径模式 phar:// PHP 归档 ssh2:// Secure Shell 2 rar:// RAR ogg:// 音频流 expect:// 处理交互式的流
文件包含漏洞的防范措施有哪些?
- 将系统和服务(包括 Web 应用程序框架)更新为最新版本。
- 关闭 PHP 报错以避免泄露应用程序的路径和其他可能泄露的信息。
- Web 应用程序防火墙 (WAF) 是帮助减轻 Web 应用程序攻击的不错选择。
- 如果你的 Web 应用程序不需要,请禁用一些会导致文件包含漏洞的 PHP 功能,例如 allow_url_fopen 和 allow_url_include
- 仔细分析 Web 应用程序,只允许需要的协议和 PHP 包装器。
- 永远不要相信用户的输入,并确保针对文件包含实施适当的输入验证处理。
- 对文件名和文件位置实施白名单以及黑名单策略。
7.不安全的文件下载(Unsafe file downloads)
什么是不安全的文件下载?
文件下载功能在很多web系统上都会出现,一般我们当点击下载链接,便会向后台发送一个下载请求,一般这个请求会包含一个需要下载的文件名称,后台在收到请求后会开始执行下载代码,将该文件名对应的文件response给浏览器,从而完成下载。如果后台在收到请求的文件名后,将其直接拼进下载文件的路径中而不对其进行安全判断的话,则可能会引发不安全的文件下载漏洞。
此时如果攻击者提交的不是一个程序预期的的文件名,而是一个精心构造的路径(比如../../../etc/passwd),则很有可能会直接将该指定的文件下载下来。从而导致后台敏感信息(密码文件、源代码等)被下载。
不安全的文件下载的危害?
- 敏感信息泄露
如何防范不安全的文件下载?
- 对传入文件名进行严格的过滤和限定(判断是不是对应的文件)
- 对文件下载的目录进行严格的限定
8.不安全的文件上传(Unsafe file uploads)
什么是不安全的文件上传?
文件上传功能在web应用系统很常见,比如很多网站注册的时候需要上传头像、上传附件等等。当用户点击上传按钮后,后台会对上传的文件进行判断比如是否是指定的类型、后缀名、大小等等,然后将其按照设计的格式进行重命名后存储在指定的目录。如果说后台对上传的文件没有进行任何的安全判断或者判断条件不够严谨,则攻击着可能会上传一些恶意的文件,比如一句话木马,从而导致后台服务器被webshell。
不安全的文件上传的危害?
- 代码执行:上传文件是web脚本语言,服务器的web容器解释并执行了用户上传的脚本,导致代码执行,甚至导致网站甚至整个服务器被控制
- 网站挂马:上传文件是病毒、木马,黑客用以诱骗用户或者管理员下载执行
- 钓鱼:上传文件是钓鱼图片或为包含了脚本的图片,在某些版本的浏览器中会被作为脚本执行,被用于钓鱼和欺诈。
如何防范不安全的文件上传?
- 验证文件类型、后缀名、大小
- 验证文件的上传方式
- 对文件进行一定复杂的重命名
- 不要暴露文件上传后的路径
9.越权漏洞(Over Premisson)
什么是越权漏洞?
如果使用A用户的权限去操作B用户的数据,A的权限小于B的权限,如果能够成功操作,则称之为越权操作。越权漏洞形成的原因是后台使用了不合理的权限校验规则导致的。
一般越权漏洞容易出现在权限页面(需要登录的页面)增、删、改、查的的地方,当用户对权限页面内的信息进行这些操作时,后台需要对对当前用户的权限进行校验,看其是否具备操作的权限,从而给出响应,而如果校验的规则过于简单则容易出现越权漏洞。
越权漏洞的分类?
- 水平越权
指攻击者尝试访问与他拥有相同权限的用户资源。例如,用户A和用户B属于同一角色,拥有相同的权限等级,他们能获取自己的私有数据(数据A和数据B),但如果系统只验证了能访问数据的角色,而没有对数据做细分或者校验,导致用户A能访问到用户B的数据(数据B),那么用户A访问数据B的这种行为就叫做水平越权访问。
- 垂直越权
由于后台应用没有做权限控制,或仅仅在菜单、按钮上做了权限控制,导致恶意用户只要猜测其他管理页面的URL或者敏感的参数信息,就可以访问或控制其他角色拥有的数据或页面,达到权限提升的目的。
越权产生的原因?
- 通过隐藏URL
实现控制访问有些程序的管理员的管理页面只有管理员才显示,普通用户看不到,利用 URL 实现访问控制,但 URL 泄露或被恶意攻击者猜到后,这会导致越权攻击。
- 直接对象引用
这种通过修改一下参数就可以产生水平越权,例如查看用户信息页面 URL 后加上自己的 id 便可查看,当修改为他人的 ID 号时会返回他人的信息,便产生了水平越权。
- 多阶段功能
多阶段功能是一个功能有多个阶段的实现。例如修改密码,可能第一步是验证用户身份信息,号码验证码类的。当验证成功后,跳到第二步,输入新密码,很多程序会在这一步不再验证用户身份,导致恶意攻击者抓包直接修改参数值,导致可修改任意用户密码。
- 平台配置错误
一些程序会通过控件来限制用户的访问,例如后台地址,普通用户不属于管理员组,则不能访问。但当配置平台或配置控件错误时,就会出现越权访问。
越权漏洞的防范措施?
- 前后端同时对用户输入信息进行校验,双重验证机制
- 执行关键操作前必须验证用户身份,验证用户是否具备操作数据的权限
- 特别敏感操作可以让用户再次输入密码或其他的验证信息。
- 可以从用户的加密认证 cookie 中获取当前用户 id,防止攻击者对其修改。或在 session、cookie 中加入不可预测、不可猜解的 user 信息。
- 直接对象引用的加密资源ID,防止攻击者枚举ID,敏感数据特殊化处理
- 永远不要相信来自用户的输入,对于可控参数进行严格的检查与过滤
10.目录遍历(../../)
什么是目录遍历?
在web功能设计中,很多时候我们会要将需要访问的文件定义成变量,从而让前端的功能便的更加灵活。当用户发起一个前端的请求时,便会将请求的这个文件的值(比如文件名称)传递到后台,后台再执行其对应的文件。在这个过程中,如果后台没有对前端传进来的值进行严格的安全考虑,则攻击者可能会通过“../”这样的手段让后台打开或者执行一些其他的文件。从而导致后台服务器上其他目录的文件结果被遍历出来,形成目录遍历漏洞。
看到这里,你可能会觉得目录遍历漏洞和不安全的文件下载,甚至文件包含漏洞有差不多的意思,是的,目录遍历漏洞形成的最主要的原因跟这两者一样,都是在功能设计中将要操作的文件使用变量的方式传递给了后台,而又没有进行严格的安全考虑而造成的,只是出现的位置所展现的现象不一样,因此,这里还是单独拿出来定义一下。
需要区分一下的是,如果你通过不带参数的url(比如:http://xxxx/doc)列出了doc文件夹里面所有的文件,这种情况,我们成为敏感信息泄露。而并不归为目录遍历漏洞。
目录遍历的危害?
- 敏感信息泄露
如何防范目录遍历?
- 对用户的输入进行验证,特别是路径替代字符如“../”和“~/”。
- 尽可能采用白名单的形式,验证所有的输入。
- 合理配置Web服务器的目录权限。
- 当程序出错时,不要显示内部相关配置细节。
- 对用户传过来的文件名参数进行统一编码,对包含恶意字符或者空字符的参数进行拒绝。
11.敏感信息泄露
什么是敏感信息泄露?
由于后台人员的疏忽或者不当的设计,导致不应该被用户看到的数据被轻易的访问到。比如:
- 通过访问url下的目录,可以直接列出目录下的文件列表
- 输入错误的url参数后报错信息里面包含操作系统、中间件、开发语言的版本或其他信息
- 前端的源码(html,css,js)里面包含了敏感信息,比如后台登录地址、内网接口信息、甚至账号密码等
12.反序列化漏洞
什么是序列化与反序列化?
序列化是将对象转换为字节序列的过程,而反序列化是将字节序列转换为对象的过程。不同语言中的序列化和反序列化实现方式可能不同,但它们的目的都是将对象转换为字节序列或将字节序列转换为对象。
不同语言的序列化与反序列化有什么不同?
- PHP的序列化是把对象转换成了字符串,以便于在存储和传输的过程中保留其结构和值。
- Java的序列化是把对象转换成了字节流,以便于在存储和传输的过程中保留其结构和值。
- Python的序列化是把对象转换成了字节流或字符串,以便于在存储和传输的过程中保留其结构和值。
什么是序列化漏洞?
序列化和反序列化本身没有问题,但是如果反序列化的数据可以被用户控制或篡改,且程序没有对其进行有效的检测或过滤,就可能导致反序列化漏洞。
反序列化漏洞的危害是,攻击者可以通过构造恶意的序列化数据,控制程序在反序列化过程中调用的类或方法,从而实现任意代码执行,获取敏感信息,提权,拒绝服务等攻击目的。
PHP的魔法函数有哪些?
常见的几个魔法函数:
__construct()当一个对象创建时被调用 __destruct()当一个对象销毁时被调用 __toString()当一个对象被当作一个字符串使用 __sleep() 在对象在被序列化之前运行 __wakeup() g将在序列化之后立即被调用 漏洞举例: class S{ var $test = "pikachu"; function __destruct(){ echo $this->test; } } $s = $_GET['test']; @$unser = unserialize($a); payload:O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}
13.XXE(xml外部实体注入漏洞)
什么是XML?
XML指可扩展标记语言(eXtensible Markup Language),是一种类似于HTML的标记语言,但是没有使用预定义的标签。XML的设计目的是传输和存储数据,而不是显示数据。
是什么XXE漏洞?
XXE(XML External Entity Injection),即 xml 外部实体注入漏洞,XXE 漏洞发生在应用程序解析 XML 输入时, 没有禁止外部实体的加载 ,导致可加载恶意外部文件,造成文件读取、命令执行、攻击内网网站等危害。
如何防范XXE漏洞?
- 禁用外部实体
- 过滤用户提交的XML数据
14.服务端请求构造(SSRF)
什么是SSRF?
SSRF(Server-Side Request Forgery,服务器端请求伪造)是一种由攻击者构造请求,由服务端发起请求的安全漏洞。一般情况下,SSRF攻击的目标是外网无法访问的内部系统。这是因为请求是由服务端发起的,所以服务端能请求到与自身相连而与外网隔离的内部系统。
SSRF的形成原因是由于服务端提供了从其他服务器应用获取数据的功能,但是没有对目标地址做过滤与限制。例如,黑客操作服务端从指定URL地址获取网页文本内容,加载指定地址的图片等,利用的是服务端的请求伪造。SSRF利用存在缺陷的Web应用作为代理攻击远程和本地的服务器。
数据流:攻击者----->服务器---->目标地址
SSRF的危害有哪些?
- 端口扫描:攻击者可以利用SSRF对外网、服务器所在内网、本地进行端口扫描,获取一些服务的banner信息。
- 攻击内部应用程序:攻击者可以利用SSRF攻击运行在内网或本地的应用程序。
- 识别内部资产信息:攻击者可以利用SSRF对内网Web应用进行指纹识别,识别企业内部的资产信息。
- 攻击Web应用:攻击者可以利用SSRF攻击内外网的Web应用,主要是使用HTTP GET请求就可以实现的攻击 (比如struts2、SQL注入等)。
- 读取本地文件:攻击者可以利用SSRF利用file协议读取本地文件。
- 连接内部服务:SSRF漏洞可能会导致服务器连接到组织基础设施内的仅供内部使用的服务。
- 泄露敏感数据:在某些情况下,攻击者可能会强制服务器连接到任意外部系统,从而可能泄露授权凭证等敏感数据。
如何防范SSRF?
- 严格校验用户输入的URL:可以使用白名单过滤来限制输入,只允许特定的协议、主机和端口。
- 过滤返回的信息:在把返回结果展示给用户之前先验证返回的信息是否符合标准。
- 统一错误信息:避免用户可以根据错误信息来判断远程服务器的端口状态。
- 限制请求的端口:比如80、443、8080、8090。
- 禁止不常用的协议:仅仅允许http和https请求。可以防止file://、gopher://、ftp://等引起的问题。
- 不要把原始的响应数据返回给客户端:这样可以防止攻击者利用返回的数据进行攻击。
- 限制Web应用程序的网络访问权限:可以让远程资源访问功能使用单独的网络。
- 限制Web应用程序对服务器端资源的访问权限:可以使用访问控制列表(ACL)来限制应用程序可以访问的URL和端口。
- 加强代码审核:通过人工审核和自动化审核工具审核的方式来发现潜在的SSRF漏洞。
15.不安全的URL重定向
什么是不安全的URL重定向?
不安全的url跳转问题可能发生在一切执行了url地址跳转的地方。
如果后端采用了前端传进来的(可能是用户传参,或者之前预埋在前端页面的url地址)参数作为了跳转的目的地,而又没有做判断的话就可能发生"跳错对象"的问题。
url跳转比较直接的危害是:
-->钓鱼,既攻击者使用漏洞方的域名(比如一个比较出名的公司域名往往会让用户放心的点击)做掩盖,而最终跳转的确实钓鱼网站。