服务端安全

1、SQL注入

应用为了和数据库进行沟通完成必要的管理和存储工作,必须和数据库保留一种接口。目前的数据库一般都是提供api 以支持管理,应用使用底层开发语言如Php,Java,asp,Python 与这些api 进行通讯。对于数据库的操作,目前普遍使用一种SQL 语言,SQL 作为字符串通过API 传入给数据库,数据库将查询的结果返回,数据库自身是无法分辨传入的SQL 是合法的还是不合法的,它完全信任传入的数据,如果传入的SQL 语句被恶意用户控制或者篡改,将导致数据库以当前调用者的身份执行预期之外的命令并且返回结果,导致安全问题。

    恶意用户利用SQL 注入可以做到:

  • 可读取数据库中的库和表

  • 可执行系统命令

  • 可以修改任意文件

  • 可以安装木马后门

解决SQL 注入问题的关键是对所有可能来自用户输入的数据进行严格的检查、对数据库配置使用最小权限原则。

  • 所有的查询语句都使用数据库提供的参数化查询接口,参数化的语句使用参数而不是将用户输入变量嵌入到SQL 语句中。当前几乎所有的数据库系统都提供了参数化SQL语句执行接口,使用此接口可以非常有效的防止SQL 注入攻击。

  • 对进入数据库的特殊字符(’”\尖括号&*;等)进行转义处理,或编码转换。

  • 严格限制变量类型,比如整型变量就采用intval()函数过滤,数据库中的存储字段必须对应为int 型。

  • 数据长度应该严格规定,能在一定程度上防止比较长的SQL 注入语句无法正确执行。

  • 网站每个数据层的编码统一,建议全部使用UTF-8 编码,上下层编码不一致有可能导致一些过滤模型被绕过。

  • 严格限制网站用户的数据库的操作权限,给此用户提供仅仅能够满足其工作的权限,从而最大限度的减少注入攻击对数据库的危害。

  • 避免网站显示SQL 错误信息,比如类型错误、字段不匹配等,防止攻击者利用这些错误信息进行一些判断。

  • 在网站发布之前建议使用一些专业的SQL 注入检测工具进行检测,及时修补这些SQL 注入漏洞。

2、上传漏洞

Web 应用程序在处理用户上传的文件操作时,如果用户上传文件的路径、文件名、扩展名成为用户可控数据,就会导致直接上传脚本木马到web 服务器上,直接控制web 服务器。

IIS6.0 上传漏洞

Microsoft IIS 是一款微软开发的HTTP 服务程序。Microsoft IIS 可以ASP 或者任何其他可执行扩展执行任何扩展名文件,如"malicioius.asp;.jpg"就以ASP 文件方式在服务器上执行,需要文件上传程序通过检查文件名的最后一段作为扩展名来保护系统。利用这个漏洞,攻击者可以绕过保护把危险的可执行文件上传到服务器上。

PHP 上传漏洞

当上传文件名为x.php%00.jpg 时,php 验证程序后缀名为JPG 允许上传,然而当php取文件名时,读取到%00 会认为是截断符号,便会以x.php 进行存储,最终导致php 文件上传。

    处理用户上传文件,要做以下检查:

  • 检查上传文件扩展名白名单,不属于白名单内,不允许上传。

  • 上传文件路径及文件名不可取用户可控数据。

  • 上传文件的目录不能提供脚本解析。

  • 图片上传,要通过处理(转码、缩略图、水印等),无异常后才能保存到服务器。

3、任意文件下载漏洞

当用户通过web 下载文件时,所下载文件及路径为变量形式传给程序,程序未对下载文件及路径做检测,导致用户可随意输入下载地址,造成任意文件下载漏洞的出现。任意文件下载漏洞为高风险漏洞,可以读取服务器配置文件,相关用户名密码等,造成非常大的安全隐患。

防止任意文件下载方式非常多,下面给出建议性解决方案如下连接

http://www.xxx.com/download.php?file=(32 位md5 串)

md5 传在数据库中对应下载地址

代码片段

$filemd5 = $_GET[file];

$filename = Select filename from filedb; //从数据库中读取对应的文件名

$File=fopen("/var/www/html/download/".$filename,"r");//下载路径不能为用户可控数据

$FileBuff=512;

while($FileSize >= 0)

4、XML 注入漏洞   

XML injection,XML 注入漏洞。XML 注入类似于SQL 注入,XML 文件一般用作存储数据及配置,如果在修改或新增数据时,没有对用户可控数据做转义,直接输入或输出数据,都将导致XML 注入漏洞。

XML 注入主要预防手段是对XML 中特殊字符做转码操作,按照以下转码规则

5、HTTP 协议头漏洞

超文本转移协议 (HTTP-Hypertext transfer protocol) 是一种详细规定了浏览器和万维网服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议。HTTP 协议本身有很多自己的特性,相关定义请参考RFC2616。一些特征字会导致HTTP 协议源IP 的隐藏,一些构造的畸形请求会导致HTTP 协议的错误。当强制终止HTTP协议请求,并在请求后添加相关信息后,会导致添加的信息返回给客户端,最终导致修改返回数据,此类漏洞叫HTTP 协议头注入漏洞。

X-Forwarded-For:简称XFF 头,它代表客户端,也就是HTTP 请求端真实的IP,只有在通过了HTTP 代理或者负载均衡服务器时才会添加该项。它不是RFC 中定义的标准请求头信息,在squid 缓存代理服务器开发文档中可以找到该项的详细介绍。标准格式如 下:X-Forwarded-For: client1, proxy1, proxy2。

对于客户端连接过来的IP 我们在平时的日志分析,浏览信息记录,及数据分析会大量的用到,甚至延伸到登录规则,注册规则,当用户自行在HTTP 传输头中添加X-Forwarded-For 字段,错误的判断程序会取得伪造的IP,导致基于IP 的日志分析失效,导致依据来源IP 判断权限的程序失效,所以对此类漏洞的防御尤为重要

X-Forwarded-For 伪造根据网络结构不同分两种解决方法

  • 当前端没有负载设备时,读取X-Forwarded-For 头最后一个ip

  • 当前端有负载均衡设备时,倒叙读取X-Forwarded-For 头第一个非内网IP。

6、HTTP 响应头注入漏洞(CRLF)

CRLF 说明 CRLF 就是回车(CR, ASCII 13, \r) 换行(LF, ASCII 10, \n)。CR 和LF 组合在一起即CRLF。Web 程序代码中把用户提交的参数未做过滤就直接输出到HTTP 响应头中,攻击者可以利用该漏洞来注入HTTP 响应头,可以造成多种攻击、例如跨站和欺骗用户下载恶意可执行文件等攻击

如今的许多现代应用程序服务器可以防止 HTTP 头文件感染恶意字符。例如,当新行传递到 header() 函数时,最新版本的 PHP将生成一个警告并停止创建头文件。如果您的PHP版本能够阻止设置带有换行符的头文件,则其具备对 HTTP Response Splitting 的防御能力。

代码层面常见的解决方案:

  • 严格检查变量是否已经初始化

  • 在设置HTTP 响应头的代码中,过滤回车换行(%0d%0a、%0D%0A)字符

  • 禁止header()函数中的参数外界可控

  • 不要使用有存在bug 版本的apache

7、代码注入攻击

web应用代码中,允许接收用户输入一段代码,之后在web 应用服务器上执行这段代码,并返回给用户。由于用户可以自定义输入一段代码,在服务器上执行,所以恶意用户可以写一个远程控制木马,直接获取服务器控制权限,所有服务器上的资源都会被恶意用户获取和修改,甚至可以直接控制数据库。

执行代码的参数,或文件名,禁止调用用户输入信息,只能由开发人员定义代码内容,用户只能提交“1、2、3”参数,代表相应代码

发布了54 篇原创文章 · 获赞 16 · 访问量 21万+

猜你喜欢

转载自blog.csdn.net/aisoo/article/details/104569822