Web安全基础知识整理

最近阿菜姐我研究了一下web相关的安全问题,现在梳理一下内容。

如果您想给自己立个Web安全大佬的flag,那么您必须知道在这个网站:https://owasp.org/  

OWASP?是开放式Web应用程序安全项目,是致力于网络应用程序安全的国际非营利组织。我们可以在其网站上免费获得他们提供的文档,工具,视频和论坛等所有资料。同时我们还要关注该网站定期更新的OWASP Top 10报告。这不但能提升我们的英语阅读能力,还能在同行里制造话题,显得我们B格很高。

 

              

                              图 OWASP 网站OWASP Top Ten页面

从OWASP Top Ten我们可以了解到十大Web应用程序安全风险,下面我们来重点了解一下长期盘踞在榜上的Web安全问题。

一、SQL Injection(注入)

最常见的就是SQL注入攻击了,因为只要是有数据库的地方必定有SQL注入,攻击者会:

        1.在数据库内增加删除修改数据

         2.窃取数据库或数据库关键信息

         3.利用数据库查询高权限用户信息并利用(入口突破)

SQL注入一般会在http://xxx.xxx.xxx/abc.asp?id=XX这样等带有参数的ASP动态网页中,有些动态网页中可能只有一个参数,有些可能有n个参数;有些参数是整型,有些参数是字符串型。只要是带有参数的动态网页访问了数据库就有可能存在SQL注入。

我们首选要修改浏览器的设置,以便更好的了解动态网页参数里包含的信息。以IE浏览器为例,把IE菜单-工具-Internet选项-高级-显示友好HTTP错误信息前面的勾去掉。

               

 

下面以http://xxx.xxx.xxx/abc.asp?p=YY为例进行分析,“YY”可能是整型,也有可能是字符串。

1、整型参数的判断

当输入的参数YY为整型时,通常abc.asp中SQL语句原貌大致如下:

select * from 表名 where 字段=YY,所以可以用以下步骤测试SQL注入是否存在。

(1)http://xxx.xxx.xxx/abc.asp?p=YY and 1=2, abc.asp运行异常;

(2)http://xxx.xxx.xxx/abc.asp?p=YY′(附加一个单引号),此时abc.ASP中的SQL语句变成了select * from 表名 where 字段=YY′,abc.asp运行异常;

(3)http://xxx.xxx.xxx/abc.asp?p=YY and 1=1, abc.asp运行正常,而且与http://xxx.xxx.xxx/abc.asp?p=YY运行结果相同;

如果这三个方面全部满足,abc.asp中一定存在SQL注入漏洞!

2、字符串型参数的判断

当输入的参数YY为字符串时,通常abc.asp中SQL语句原貌大致如下:

select * from 表名 where 字段=’YY’,所以可以用以下步骤测试SQL注入是否存在。

(1)http://xxx.xxx.xxx/abc.asp?p=YY&nb … 39;1′=′2′, abc.asp运行异常;

(2)http://xxx.xxx.xxx/abc.asp?p=YY&nb … 39;1′=′1′, abc.asp运行正常,而且与http://xxx.xxx.xxx/abc.asp?p=YY运行结果相同;

(3)http://xxx.xxx.xxx/abc.asp?p=YY′(附加一个单引号),此时abc.asp中的SQL语句变成了select * from 表名 where 字段=YY′,abc.asp运行异常;

如果这三个方面全部满足,abc.asp中一定存在SQL注入漏洞!

3、字符被过滤的判断

有安全意识的ASP程序员会过滤掉单引号等字符,以防止SQL注入。这种情况可以用下面几种方法尝试。

(1)ASCII方法:所有的输入部分或全部字符的ASCII代码,如U = CRH(85),一个= CRH(97),等等。

(2)UNICODE方法:在IIS UNICODE字符集实现国际化,我们可以在输入字符串即输入UNICODE字符串。如+ = % 2 b,空格= % 20,等;

(3)混合设置方法:大小是大小写不敏感的,因为根据当时和过滤器的程序员通常要么过滤所有大写字母的字符串,或过滤所有小写的字符串,大小写混合往往会被忽略。如用SelecT代替select,SELECT等。

应对SQL注入的防护策略

  1. 对所有进入数据库的操作的参数进行过滤,开发人员可以采用参数化查询的方法(在使用参数化查询的情况下,数据库服务器不会将参数的内容视为SQL指令的一部分来处理,而是在数据库完成SQL指令的编译后,才套用参数运行,因此就算参数中含有恶意的指令,由于已经编译完成,也不会被数据库所运行)
  2. 对web服务器部署WAF
  3. 对数据库进行最小化权限限制,防止利用SQL注入获取到主机权限
  4. 配置web应用程序对出错页面返回统一的页面
  5. 对数据库中的表中的敏感字段,如邮箱列、密码列、手机号列进行加密存储
  6. 遵循最佳开发实践:https://cheatsheetseries.owasp.org/cheatsheets/Injection_Prevention_Cheat_Sheet.html
  7. 使用白名单限制允许输入的字符集在服务端限制参数的长度
  8. 开启数据库端的审计日志

二、XSS攻击(Cross Site Scripting,跨站脚本攻击)

XSS攻击是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java、VBScript、ActiveX、 Flash 或者甚至是普通的HTML。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。

XSS攻击效果取决于攻击者的js水平,XSS 利用的是用户对指定网站的信任进行:

      1.窃取cookie,劫持会话

       2.黑产(诱骗点击,网络钓鱼,木马挖矿)

        3.服务端执行命令(内网扫描,篡改页面)

XSS通常分为反射型(诱骗点击用户弹出自己cookie)、存储型(用户访问被植入的网站)、DOM型(document object model文档对象模型

XSS跨站脚本攻击的防护方法:

  1. 为cookies设置httpOnly安全属性后,通过JS脚本将无法读取到cookie信息
  2. web服务器可以通过部署WAF来缓解XSS攻击
  3. 对输入的字符进行过滤,如使用htmlspecicalchars参数可以过滤&,<,>,;,“”等字符做过滤,对输出进行编码,善用黑白名单。
  4. 遵循最佳开发实践:https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html
  5. 客户端浏览器可以安装Noscript插件来预防
  6. 对表单请求尽量采用POST而非GET提交表单,检查HTTP referrer,增加验证码,使用Token
  7. 增加额外的安全头,如X-XX-Protection来为不支持CSP的旧版浏览器提供保护(https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/X-XSS-Protection

三、文件上传漏洞

文件上传漏洞是对数据与代码分离原则的一种攻击。上传漏洞顾名思义,就是攻击者上传了一个可执行文件如木马,病毒,恶意脚本,WebShell等到服务器执行,并最终获得网站控制权限的高危漏洞。借助burpsuite来进行利用,最常见的方式是通过修改content-type或content-disposition来绕过限制。Burp suite(https://portswigger.net/burp)是用于对web应用程序进行安全测试的集成平台,其中包含了很多工具。

大部分的网站和应用系统都有上传功能,而程序员在开发任意文件上传功能时:

1.如果没有限制上传文件的大小,攻击者就会通过上传大量大体积的文件来浪费服务器的存储资源。

2.如果你没有限制上传文件类型,攻击者可以通过上传恶意后缀的文件例如(jsp、asp、php、aspx文件)来接管服务器

3.如果仅仅通过MIME-TYPE来验证、如果WEB服务器没有验证双扩展、如果是基于浏览器客户端的上传验证,则有绕过的风险。

文件上传漏洞可以配合其他漏洞进行滥用,比如XSS。

文件上传漏洞的防护方法:

  1. 移除上传目录的执行权限
  2. 依靠服务器端进行验证,结合黑白名单
  3. 对虚拟主机可以通过.htaccess来防护上传目录
  4. 上传文件的目录放在web目录根以外的地方
  5. 阻止覆盖已经存在的文件
  6. 生成随机的文件名,对文件名进行过滤,过滤掉../危险字符
  7. 对上传文件进行病毒扫描
  8. 对文件后缀和文件格式都进行验证,对上传文件的大小在做限制

四、文件包含漏洞

如果允许客户端输入控制动态包含在服务器端的文件,会导致恶意代码的执行与敏感信息的泄露,主要包括本地文件包含和远程文件包含两种形式。

文件包含漏洞的产生原因是通过引入文件时,由于传入的文件名没有经过合理的校验(过滤),或者校验被绕过,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意代码注入。当被包含的文件在服务器本地时,就形成的本地文件包含漏洞(Local File Include,LFR)

有时候需要通过%00进行截断,参考如下语句:

 

<?php
include($_GET['for'].'.php'); //用于测试本地包含漏洞
?>


文件包含漏洞的修复方式如果php.ini的allow_url_include为NO的话,则可实现远程文件包含漏洞(Remote File InclusionRFI)。

  1. web服务器部署WAF,阻断URL中的../,..%2f,file:///../../,\.\.\.\.\.\....等类似非法请求
  2. 使用白名单限制参数字符,参数长度可以有效的避免LFI和RFI,如

 

<?php
$page_files=array('about'>='about.html',
                  'photos'=>photos.html',
                  'contact'=>'contact.html',
                   'home'=>'home.html' 
                  );
if(in_array($_GET['page'],array_keys($page_files)))
{
include $page_files[$_GET['page']];
}
else
{ include $page_files['home'];
}
?>

    3.通过设置allow_url_include=off,allow_url_fopen=off 来安全web应用

五、命令注入漏洞(command injection)

web应用程序有时需要调用一些系统命令的函数,如PHP中的system,exec,shell-exec等等,当用户能够控制这些函数中的参数时,就可以将恶意参系统命令拼接到正常命令中,从而造成命令注入攻击.造成:继承web应用程序的权限去执行系统命令读写执行文件、反弹shell、控制整个网站甚至整个服务器、进一步内网渗透等危害。

漏洞形成需要同时满足以下三个条件:使用了内部调用shell的函数(system,exec);将外界传入的参数传递给内部调用shell的函数;参数中shell的元字符没有被转义。

 

命令注入漏洞防护

1.使用白名单,只允许提交允许的字符,比如允许英文字母,数字,其他都禁止提交

2.为web服务器设置最低权限运行,实现最小权限原则

3.部署HIDS等设备,如果发现恶意进行/线程启动,触发报警

4.减少使用危险函数直接操作参数,例如 exec(),system(),eval()等函数

 5.告警日志里如果有 {} () < > & * ‘ |  =  ?  : [] $ -  # ~  ! , ‘ %  / \ : +需要特别注意

6.遵守最佳开发实践(https://cheatsheetseries.owasp.org/cheatsheets/OS_Command_Injection_Defense_Cheat_Sheet.html )

六、XXE注入

XXE:XML External Entity 即外部实体,从安全角度理解成XML External Entity attack 外部实体注入攻击。由于程序在解析输入的XML数据时,解析了攻击者伪造的外部实体而产生的。

XML文件的解析依赖libxml库,而libxml2.9以前的版本默认支持并开启了外部实体的引用,服务端解析用户提交的xml文件时未对xml文件引用的外部实体做合适的处理,并且实体的URL支持file://和php://等协议,攻击者可以在xml文件中声明URI指向服务器本地的实体造成攻击。

XXE 注入的防御方式

  1. 禁用外部实体,可将外部实体、参数实体和内联DTD 都被设置为false,从而避免基于XXE漏洞的攻击。
  2. 过滤和验证用户提交的xml数据
  3. 配置XML处理器去使用本地静态的DTD,不允许XML中含有任何自己声明的DTD

七、SSRF(Server -side Request Forge,服务端请求伪造)

SSRF (Server-side Request Forge, 服务端请求伪造)是一种由于服务端提供了从其他服务器应用获取数据的功能且没有对地址和协议等做过滤和限制,由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统。

SSRF 漏洞防护

1.禁用不需要的协议,仅仅允许http和https请求,可以防止类似于file://, gopher://, ftp:// 等引起的问题。

2.服务端需要认证交互,禁止非正常用户访问服务;

3.过滤输入信息,永远不要相信用户的输入,判断用户的输入是否是一个合理的URL地址

4.过滤返回信息,验证远程服务器对请求的响应是比较容易的方法,如果web应用是去获取某一种类型的文件。那么在把返* 回结果展示给用户之前先验证返回的信息是否符合标准。

5.统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态。

6.禁止30x跳转

7.设置URL白名单或限制内网IP

 

今天阿菜姐就先写到这里哦,虽然内容都是很浅显的理论,概念,没有太多的实践代码,但是作为web安全入门也算是够用了呢,具体的实现等CSDN平台很多大神写的非常好,我们可以逐个主题去搜索学习呢,加油哦。

  • 5
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值