快捷搜索:   nginx

PHP漏洞全解(八)-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的值

实例:

<?php

// 打开Internet socket连接

$fp = fsockopen(www.00aq.com, 80);

 

// 写入HTTP请求表头

fputs($fp, "GET / HTTP/1.1\r\n");

fputs($fp, "Host: www.00aq.com\r\n\r\n");

// HTTP响应的字符串

$http_response = "";

while (!feof($fp))

{

        // 读取256位的HTTP响应字符串

        $http_response .= fgets($fp, );

}

// 关闭Internet socket连接

fclose($fp);

// 显示HTTP响应信息

echo nl2br(htmlentities($http_response));

?>

 

 

HTTP响应拆分攻击

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

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

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

HTTP响应拆分通常发生在:

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

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

实例:

<?php

    header("Location: " . $_GET['page']);

?>

请求

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

顶(0)
踩(0)

您可能还会对下面的文章感兴趣:

最新评论