Показать сообщение отдельно
Старый 23.03.2011, 18:24   #5
life_glider
 
Аватар для life_glider
 
Регистрация: 06.07.2010
Сообщений: 43
Репутация: 17
По умолчанию

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;
{
<?
Данный вид уязвимостей не является общим, но много скриптов
могут вести себя по интересному, если мы их остановим посередине.
__________________
Вы все такие классные
life_glider вне форума   Ответить с цитированием