zoukankan      html  css  js  c++  java
  • HTTP Response Spliting 防范策略研究

    目录
    0x1:HTTP请求的格式
    0x2:HTTP请求的方法
    0x3:HTTP响应的格式
    0x4:HTTP响应拆分攻击
    0x5:防范的方法


    HTTP请求的格式

    客户端所提出的HTTP请求包含下列信息:
    (1)请求信息
    (2)表头
    (3)一行空白行
    (4)信息正文(可有可无)

    例如:发送HTTP请求给服务器www.baidu.com:
    GET /index.html HTTP/1.1 //请求信息
    Host: www.baidu.com //表头
                 //空隔行
                //回车

    HTTP请求的方法

    HTTP定义了8种方法来发送请求
    (1)GET:请求响应,这是最常使用的方法
    (2)HEAD:与GET相同的响应,是只要求响应的表头信息
    (3)POST:发送数据给服务器处理,数据包含在HTTP信息正文中
    (4)PUT:上传文件
    (5)DELETE:删除文件
    (6)TRACE:追踪所收到的请求
    (7)OPTIONS:返回服务器所支持的HTTP请求的方法
    (8)CONNECT:将HTTP请求的连接转换成透明的TCP/IP通道


    HTTP响应的格式

    服务器在处理完客户端所提出的HTTP请求后,会发送下列响应
    (1)第一行是状态码
    (2)第二行开始是其他信息


    HTTP响应拆分攻击

    HTTP响应拆分攻击是由于黑客发送一个经过设计的HTTP请求给服务器,但是目标用户收到的却是两个HTTP响应。第一个HTTP响应并不重要,黑客所在意的是目标用户收到的第二个HTTP响应。第二个HTTP响应是由黑客编写的,并不是来自服务器的真正响应。

    可能遭受HTTP响应拆分攻击的函数包括以下几个:
    header();
    setcookie();
    session_id();
    setrawcookie();

    HTTP响应拆分攻击通常发生在如下两个地方:
    (1)Location响应表头:将使用者的数据写入重定向的URL地址内
    (2)Set-Cookie响应表头:将使用者的数据写入cookie内

    注:Location响应表头用来跳转目前浏览的地址。

    攻击实例说明:跳转地址
    例如:jump.php
    <?php
    if($_GET["login"])
    {
    header("Location:http://".$_SERVER["HTTP_HOST"].$_SERVER["PHP_SELF"]);
    }
    ?>

    //这是在单击[登陆]按钮后,就重新执行jump.php文件
    $_SERVER["HTTP_HOST"]变量的值等于:localhost
    $_SERVER["PHP_SELF"]变量的值等于:/jump.php

    attack.php:
    <?php
    header("Location:"."http://localhost/jump.php/%0d%0aLocation:%20http://baidu.com/?login=1");
    ?>
    当黑客使用attack.php文件来执行HTTP响应拆分攻击时,$_SERVER["HTTP_SELF"]变量的值会等于:
    /jump.php/ Location: http://baidu.com/
    所以$_SERVER["PHP_SELF"]被插入了HTTP响应拆分的程序代码,这个程序代码将地址跳转到[百度]首页。
    当执行attack.php文件后,就会跳转到百度首页去


    防范的方法

    HTTP响应拆分攻击是因为目标用户在HTTP请求中被插入了换行字符,以及加上了Location或Set-Cookie等响应表头来设置地址或cookie值。
    所以防范的方法就是将header函数内的参数去掉换行字符CR/LF或是" "。

    例如:
    <?php
    if($_GET["login"])
    {
    header("Location: http://".$SERVER["HTTP_HOST"].strtr($SERVER["HTTP_SELF"],array(" "=>""," "=>"")));
    }
    ?>

    注:strtr函数介绍:
    string strtr(string str, array replace_pairs)
    //str是要转换的字符串,replace_pairs是要转换字符的数组

    1.将session.use_only_cookies设置为1
    例如:
    <?php
    //将session.use_only_cookies设置为1
    int_set("session.use_only_cookies", 1);
    //启动Session
    session_start();
    ?>
    // 将session.use_only_cookies设置为1,这表明不使用cookie以外的方法来存放session_id,这可以避免session固定攻击

    2.使用最新版的PHP
    //在最新版的PHP中,已经不允许在HTTP表头内出现换行字符。因此,将你的PHP更新到最新版本,就可以避免手动将换行字符" "转换为空字符串的问题,当然就可以避免HTTP响应拆分攻击。

    3.隐藏HTTP响应表头
    //如果不想要显示服务器信息的Server响应表头,也可以打开下列文件:
    C:AppServApache2.2confhttpd.conf
    进行修改
    将ServerTokens设置为Prod

    如果不想显示服务器信息的X-Powered-By表头,可以打开下列文件:
    C:Windowsphp.ini
    进行修改
    将expose_php设置为Off

    重启Apache即可完成

  • 相关阅读:
    Vim快捷键键位图大全
    Docker快速入门
    针对base64编码和URIEncode的一点研究
    JavaEE初学笔记之Servlet与Tomcat
    【编码】彻底弄懂ASCII、Unicode、UTF-8之间的关系
    React的世界观及与Vue之比较
    彻底搞懂CSS文本、空白换行问题
    Vue实现懒加载的基本思路
    CSS中的px与物理像素、逻辑像素、1px边框问题
    Vue插值文本换行问题
  • 原文地址:https://www.cnblogs.com/milantgh/p/3755007.html
Copyright © 2011-2022 走看看