管理员
|
阅读:2746回复:0
PHP漏洞全解(八)-HTTP响应拆分
楼主#
更多
发布于:2011-10-22 08:41
| | | | HTTP请求的格式1)请求信息:例如“Get /index.php HTTP/1.1”,请求index.php文件2)表头:例如“Host: localhost”,表示服务器地址3)空白行4)信息正文“请求信息”和“表头”都必须使用换行字符(CRLF)来结尾,空白行只能包含换行符,不可以有其他空格符。下面例子发送HTTP请求给服务器www.yhsafe.comGET /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 OK200是标识状态的是数字,OK则是描述状态的单词,这个状态码标识请求成功。HTTP请求和响应的例子打开cmd输入telnet,输入open www.00aq.com 80打开连接后输入GET /index.php HTTP/1.1↙ Host:www.00aq.com↙ ↙ ↙图片:56_3710_d0c5fc99a6c320c.jpg 返回HTTP响应的表头图片:56_3710_a7f2187645e718e.jpg 返回的首页内容使用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.1rn");fputs($fp, "Host: www.00aq.comrnrn");// HTTP响应的字符串$http_response = "";while (!feof($fp)){ // 读取256位的HTTP响应字符串 $http_response .= fgets($fp, );}// 关闭Internet socket连接fclose($fp);// 显示HTTP响应信息echo nl2br(htmlentities($http_response));?>图片:56_3710_ba74b537ddf9fa7.jpg 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 FoundDate: Wed, 13 Jan 2010 03:44:24 GMTServer: Apache/2.2.8 (Win32) PHP/5.2.6X-Powered-By: PHP/5.2.6Location: http://www.00aq.comContent-Length: 0Keep-Alive: timeout=5, max=100Connection: Keep-AliveContent-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<html><body><form%20method=post%20name=form1>帐号%20; lt;input%20type=text%20name=username%20/><br%20/>密码%20< input%20name=password%20type=password%20/><br%20/>< input%20type=submit%20name=login%20value=登录%20/></form>< /body></html>转换成可读字符串为:Content-Type: text/htmlHTTP/1.1 200 OKContent-Type: text/htmlContent-Length: 158 <html><body><form method=post name=form1>帐号 <input type=text name=username /><br />密码 <input name=password type=password /><br /><input type=submit name=login value=登录 /></form></body></html>一个HTTP请求产生了两个响应防范的方法:1)替换CRLF换行字符<?php header("Location: " . strtr($_GET['page'], array("r"=>"", "n"=>"")));?>2)使用最新版本的PHPPHP最新版中,已经不允许在HTTP表头内出现换行字符 图片:56_3710_283b38597218657.jpg 隐藏HTTP响应表头apache中httpd.conf,选项ServerTokens = Prod, ServerSignature = Offphp中php.ini,选项expose_php = Off
| | | | |
|