本文主要介绍针对PHP网站HTTP响应拆分,站在攻击者的角度,为你演示HTTP响应拆分。

HTTP请求的格式

1)请求信息:例如“Get /index.php HTTP/1.1”,请求index.php文件

2)表头:例如“Host: localhost”,表示服务器地址

3)空白行

4)信息正文

“请求信息”和“表头”都必须使用换行字符(CRLF)来结尾,空白行只能包含换行符,不可以有其他空格符。

下面例子发送HTTP请求给服务器www.yhsafe.com

GET /index.php HTTP/1.1↙ //请求信息

Host:www.yhsafe.com↙ //表头

↙ //空格行
↙符号表示回车键,在空白行之后还要在按一个空格才会发送HTTP请求,HTTP请求的表头中只有Host表头是必要的饿,其余的HTTP表头则是根据HTTP请求的内容而定。
 
HTTP请求的方法
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/1.1 200 OK
200是标识状态的是数字,OK则是描述状态的单词,这个状态码标识请求成功。

HTTP请求和响应的例子

打开cmd输入telnet,输入open www.00aq.com 80

打开连接后输入

GET /index.php HTTP/1.1↙

Host:www.00aq.com↙

返回HTTP响应的表头

返回的首页内容

使用PHP来发送HTTP请求

header函数可以用来发送HTTP请求和响应的表头

函数原型

void header(string string [, bool replace [, int http_response_code]])

string是HTTP表头的字符串

如果replace为TRUE,表示要用目前的表头替换之前相似的表头;如果replace为FALSE,表示要使用多个相似的表头,默认值为TRUE

http_response_code用来强制HTTP响应码使用http_response_code的值

实例:

  1. // 打开Internet socket连接
  2. $fp = fsockopen(www.00aq.com, 80);
  3. // 写入HTTP请求表头
  4. fputs($fp, "GET / HTTP/1.1\r\n");
  5. fputs($fp, "Host: www.00aq.com\r\n\r\n");
  6. // HTTP响应的字符串
  7. $http_response = "";
  8. while (!feof($fp))
  9. {
  10. // 读取256位的HTTP响应字符串
  11. $http_response .= fgets($fp, );
  12. }
  13. // 关闭Internet socket连接
  14. fclose($fp);
  15. // 显示HTTP响应信息
  16. echo nl2br(htmlentities($http_response));
  17. ?>

HTTP响应拆分攻击

HTTP响应拆分是由于攻击者经过精心设计利用电子邮件或者链接,让目标用户利用一个请求产生两个响应,前一个响应是服务器的响应,而后一个则是攻击者设计的响应。此攻击之所以会发生,是因为WEB程序将使用者的数据置于HTTP响应表头中,这些使用者的数据是有攻击者精心设计的。

可能遭受HTTP请求响应拆分的函数包括以下几个:

header(); setcookie(); session_id(); setrawcookie();

HTTP响应拆分通常发生在:

Location表头:将使用者的数据写入重定向的URL地址内

Set-Cookie表头:将使用者的数据写入cookies内

实例:

  1. header("Location: " . $_GET['page']);
  2. ?>

请求

GET /location.php?page=http://www.00aq.com HTTP/1.1↙

Host: localhost↙

返回

HTTP/1.1 302 Found

Date: Wed, 13 Jan 2010 03:44:24 GMT

Server: Apache/2.2.8 (Win32) PHP/5.2.6

X-Powered-By: PHP/5.2.6

Location: http://www.00aq.com

Content-Length: 0

Keep-Alive: timeout=5, max=100

Connection: Keep-Alive

Content-Type: text/html

访问下面的链接,会直接出现一个登陆窗口

http://localhost/location.php?page=%0d%0aContent-Type:%20text/html%0d%0aHTTP/1.1%20200%20OK%0d%0aContent-Type:%20text/html%0d%0aContent-Length:%20158%0d%0a%0d%0a帐号%20密码%20

转换成可读字符串为:

Content-Type: text/html

HTTP/1.1 200 OK

Content-Type: text/html

Content-Length: 158

帐号
密码

一个HTTP请求产生了两个响应

防范的方法:

1)替换CRLF换行字符

  1. header("Location: " . strtr($_GET['page'], array("\r"=>"",    "\n"=>"")));
  2. ?>

2)使用最新版本的PHP

PHP最新版中,已经不允许在HTTP表头内出现换行字符

隐藏HTTP响应表头

apache中httpd.conf,选项ServerTokens = Prod, ServerSignature = Off

php中php.ini,选项expose_php = Off

PHP漏洞全解(八)-HTTP响应拆分的更多相关文章

  1. PHP漏洞全解

    针对PHP的网站主要存在下面几种攻击方式: 1.命令注入(Command Injection) 2.eval注入(Eval Injection) 3.客户端脚本攻击(Script Insertion) ...

  2. PHP漏洞全解(详细介绍)

    转载  http://www.jb51.net/article/31898.htm 针对PHP的网站主要存在下面几种攻击方式: 1.命令注入(Command Injection) 2.eval注入(E ...

  3. PHP漏洞全解(一)-PHP网站的安全性问题

    本文主要介绍针对PHP网站常见的攻击方式,包括常见的sql注入,跨站等攻击类型.同时介绍了PHP的几个重要参数设置.后面的系列文章将站在攻击者的角度,为你揭开PHP安全问题,同时提供相应应对方案. 针 ...

  4. PHP漏洞全解(九)-文件上传漏洞

    本文主要介绍针对PHP网站文件上传漏洞.由于文件上传功能实现代码没有严格限制用户上传的文件后缀以及文件类型,导致允许攻击者向某个可通过 Web 访问的目录上传任意PHP文件,并能够将这些文件传递给 P ...

  5. PHP漏洞全解(六)-跨网站请求伪造

    本文主要介绍针对PHP网站的跨网站请求伪造.在CSRF所有攻击方式中包含攻击者伪造一个看起来是其他用户发起的HTTP 请求,事实上,跟踪一个用户发送的HTTP请求才是攻击者的目的. CSRF(Cros ...

  6. PHP漏洞全解(五)-SQL注入攻击

    本文主要介绍针对PHP网站的SQL注入攻击.所谓的SQL注入攻击,即一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患.用户可以提交一段数据库查询代码,根据程序返 ...

  7. PHP漏洞全解(四)-xss跨站脚本攻击

    本文主要介绍针对PHP网站的xss跨站脚本攻击.跨站脚本攻击是通过在网页中加入恶意代码,当访问者浏览网页时恶意代码会被执行或者通过给管理员发信息 的方式诱使管理员浏览,从而获得管理员权限,控制整个网站 ...

  8. PHP漏洞全解(三)-客户端脚本植入

    本文主要介绍针对PHP网站的客户端脚本植入攻击方式.所谓客户端脚本植入攻击,是指将可以执行的脚本插入到表单.图片.动画或超链接文字等对象内.当用户打开这些对象后,黑客所植入的脚本就会被执行,进而开始攻 ...

  9. PHP漏洞全解(二)-命令注入攻击

    本文主要介绍针对PHP网站常见的攻击方式中的命令攻击.Command Injection,即命令注入攻击,是指这样一种攻击手段,黑客通过把HTML代码输入一个输入机制(例如缺乏有效验证限制的表格域)来 ...

随机推荐

  1. nginx支持url的PATHINFO

    fastcgi_split_path_info ^(.+?\.php)(/.*)$; set $path_info $fastcgi_path_info; fastcgi_param PATH_INF ...

  2. NC表型参照类

    package nc.ui.bd.ref; /** * 表参照-其他参照基类. 创建日期:(2001-8-23 20:26:54) 模型里未处理栏目 * * @author:张扬 * */ impor ...

  3. JAXB - Hello World with Namespace

    如果元素带有命名空间,那么处理方式与 JAXB - Hello World 会略有不同. 1. XML Schema: <xsd:schema xmlns:xsd="http://ww ...

  4. 牛客OJ——[编程题]A+B和C__如何输入多组测试数据(测试OK)

    几个要注意的地方: (1)Java OJ,必须将类名写成Main (2)关于如何输入多组测试数据,用二维数组去存储是一个方法,直接在while里面做也可以          但是如果  (3)关于整形 ...

  5. UIButton关于setFont方法过时的解决方法

    环境:xcode7 语言:Object-c 解决方法:更改UIButton的titleLabel属性的font值 一.新建一个Single View Application项目 二.创建一个UIBut ...

  6. WCF编程系列(五)元数据

    WCF编程系列(五)元数据   示例一中我们使用了scvutil命令自动生成了服务的客户端代理类: svcutil http://localhost:8000/?wsdl /o:FirstServic ...

  7. (二)JAVA使用POI操作excel

    1,创建一个时间格式的单元格 Demo4.java package com.wishwzp.poi; import java.io.FileOutputStream; import java.util ...

  8. 第七篇、CSS3新增属性

    <!-- 1.透明度 opacity(设置不透明度):0.2: --rgba --background-color:rgba(255,0,0,0.8); 2.块阴影和圆角阴影 --box-sha ...

  9. Objective-C 【类对象及SEL存储方式】

    ------------------------------------------- 类的本质--类对象 一段代码: #import <Foundation/Foundation.h> ...

  10. OI中神奇的神器fillchar

    传说,Pascal中有一个函数——fillchar.这是高手们装*用的利器,也是大家的神器(大家好才是真的好). 神器介绍: 百度百科说:“Fillchar是Turbo/Borland Pascal的 ...