php字符串的替换
来源:phpeval's BLOG
作者:phpeval
过滤和替换当然是好事情。最近帮妹妹买一个韩国的碟子。找了半天。找到了一个据说可以贩卖韩国东西的站。我就准备上去买。不过时间太早了点(早上4点),他们好象还没起来。加QQ都没反应。于是我就准备测试一下他们网站的安全性。看了一下网站。用的是ecshop2.1.5的版本。现在好象都出到2.6了。GOOGLE了一下2.1.5好象没有发布过漏洞。就下了一个回来。
看到一个地方比较有意思:
comment.php的大概130多行有一个自定义函数
- function add_comment($cmt)
- {
- /* 评论是否需要审核 */
- $status = 1 - $GLOBALS['_CFG']['comment_check'];
- /* 保存评论内容 */
- $sql = "INSERT INTO " .$GLOBALS['ecs']->table('comment'). " ".
- "(comment_type, id_value, email, user_name, content, comment_rank, add_time, ip_address, status, parent_id".
- ") VALUES (".
- "'" .$cmt->type. "', '" .$cmt->id. "', '".$cmt->email."', '". $cmt->username."', ".
- "'" .str_replace('\\\\', '\\', $cmt->content)."', '".$cmt->rank."', ".time().", '".real_ip()."', '$status', '0')";
- clear_cache_files('comments_list.lbi');
- return $GLOBALS['db']->query($sql);
- }
主要是这一个东西
- str_replace('\\\\', '\\', $cmt->content)
导致了\\\'被替换成了\\',构造合适的语句。就可以注入了。
提交\\' 进入程序后先变成\\\\\'
然后经过了一个什么函数。又会变成\\\'
再经过他们的替换。就变成了\\'
测试方法:随便发一个帖子抓一个包。然后在评论那个地方。加一个\\'进去。
你就会看到报错了。
不过目标网站数据库是mysql 4.0.24的版本。没有办法子查询。只有用另外的手段拿下他了。下了一个ecshop的2.6.1的版本。 好象没有这么过滤了。