php字符串的替换

来源:phpeval's BLOG
作者:phpeval

过滤和替换当然是好事情。最近帮妹妹买一个韩国的碟子。找了半天。找到了一个据说可以贩卖韩国东西的站。我就准备上去买。不过时间太早了点(早上4点),他们好象还没起来。加QQ都没反应。于是我就准备测试一下他们网站的安全性。看了一下网站。用的是ecshop2.1.5的版本。现在好象都出到2.6了。GOOGLE了一下2.1.5好象没有发布过漏洞。就下了一个回来。
看到一个地方比较有意思:
comment.php的大概130多行有一个自定义函数

  1. function add_comment($cmt)  
  2. {  
  3.     /* 评论是否需要审核 */ 
  4.     $status = 1 - $GLOBALS['_CFG']['comment_check'];  
  5.  
  6.     /* 保存评论内容 */ 
  7.     $sql = "INSERT INTO " .$GLOBALS['ecs']->table('comment'). " ".  
  8.                 "(comment_type, id_value, email, user_name, content, comment_rank, add_time, ip_address, status, parent_id".  
  9.             ") VALUES (".  
  10.                 "'" .$cmt->type. "', '" .$cmt->id. "', '".$cmt->email."', '"$cmt->username."', ".  
  11.                 "'" .str_replace('\\\\', '\\', $cmt->content)."''".$cmt->rank."', ".time().", '".real_ip()."', '$status', '0')";  
  12.     clear_cache_files('comments_list.lbi');  
  13.  
  14.     return $GLOBALS['db']->query($sql);  

 

主要是这一个东西

  1. str_replace('\\\\', '\\', $cmt->content)      

 

导致了\\\'被替换成了\\',构造合适的语句。就可以注入了。

提交\\' 进入程序后先变成\\\\\'
然后经过了一个什么函数。又会变成\\\'
再经过他们的替换。就变成了\\'

测试方法:随便发一个帖子抓一个包。然后在评论那个地方。加一个\\'进去。
你就会看到报错了。

不过目标网站数据库是mysql 4.0.24的版本。没有办法子查询。只有用另外的手段拿下他了。下了一个ecshop的2.6.1的版本。 好象没有这么过滤了。

Leave a comment

Your comment

Why not Login? Sign up now! »