https://students.mimuw.edu.pl/~ai292615/php_head_trick.pdf
перевод
трюк с методом HEAD протоколоа HTTP в php скриптах
(проверено на php версии 5.3.5)
Adam Iwaniuk
3 марта, 2011
это статья о php скриптах запущенных http HEAD методом.
множество программистов предполагают что из скрипты не будут прерваны и дойдут до конца (especially for short scripts). Когда мы используем метод HEAD, php-скрипт останавливается при первом выводе информацции
, что ведёт к появлению некоторых "дырок".
php-5.3.5\main\SAPI.c line 315:
Код:
if (SG(request_info).request_method &&
!strcmp(SG(request_info).request_method, "HEAD")) {
SG(request_info).headers_only = 1;
php-5.3.5\main\output.c line 699
(fucntion php_ub_body_write which is executed when
output data arrives):
if (SG(request_info).headers_only) {
if(SG(headers_sent)) {
return 0;
{
php_header(TSRMLS_C);
zend_bailout(); // <---здесь скрипт останавливается
{
скрипт простой гостевухи на файлах, которая встречается IRL:
PHP код:
<?php
$line='Nick: '.htmlspecialchars($_POST['nick']).'<br>
Text: '.htmlspecialchars($_POST['text']).'<hr>';
$f=fopen("book.txt","r");
$data=fread($f,filesize("book.txt"));
fclose($f);
$f=fopen("book.txt","w");
$data=$line.$data;
echo $data;
fwrite($f,$data);
fclose($f);
<?
Когда кто-то откроет этот скрипт через метод HEAD, он остановится на
"echo $data;", и book.txt будет пуст.
Ещё простой пример:
после метода HEAD скрипт остановится на:
"echo '<b>Wrong or empty password.</b><br>';"
Переменная $_SESSION['admin_level'] будет по прежнему иметь значение 1.
в большинстве серверов буферизация вывода(output_buffering) установлена 4096,так первый вывод
произойдёт, когда в буфере окажется 4096 байтов
в данном случае дырявый скрипт будет выглядеть так :
PHP код:
<?php
session_start();
echo 'A long string contains about 4090 characters';
$_SESSION['admin']=1;
if (!isset($_POST['pass']) || $_POST['pass']!='somepassword')
}
echo '<b>Wrong or empty password.</b><br>';
$_SESSION['admin_level']=0;
{
<?
Данный вид уязвимостей не является общим, но много скриптов
могут вести себя по интересному, если мы их остановим посередине.