在http://10.0.3.110/wordpress/wp-admin/admin.php?page=wss-add-image中上传一个图片
在http://10.0.3.110/wordpress/wp-admin/admin.php?page=wss-images中可以看到上传的结果。
在10.0.3.9上起一个服务器,上面有个网页名为deleteimage1.html,内容为
回头再看,可见图片已经被删除
在这个请求图片标签的过程中,实际上是发出一个GET请求
还有一种利用的方法就是提交表单,比如要删除id为3的图片
可以构造一个网页,内容如deleteimage2.html。
CSRF Delete Operation
WP CSRF File Upload
相应的数据包为
访问这个页面之后,可见确实有新文件添加
源码分析
处理图片上传的文件为/wp-easy-slideshow/includes/add_image.php,其中第3~5行代码为
if(!empty($_POST['submit'])){
$result = $obj->add_image($_POST,$_FILES['wss_image']);
}
function add_image($postArray, $fileArray){
global $wpdb;
$prefix = $wpdb->prefix;
$content = $postArray['desc_content'];
$link = $postArray['image_link'];
if($fileArray['error']) {
$res['status'] = 'error'; $res['msg'] = 'Upload a image';
}
else{
$wpdb->insert($prefix.'wss_images', array( 'content' => $content, 'link' => $link ));
if(($fileArray["type"] == 'image/jpeg') || ($fileArray["type"] == 'image/pjpeg')) {
$suf = ".jpg";
}
elseif($fileArray["type"] == 'image/gif') {
$suf = ".gif";
}
elseif($fileArray["type"] == 'image/png') {
$suf = ".png";
}
$filename = WSS_UPLOADS_DIR.'/'.$wpdb->insert_id.$suf;
move_uploaded_file($fileArray['tmp_name'], $filename);
image_resize($filename,296,120,false,'thumb',WSS_UPLOADS_DIR);
$wpdb->update($prefix.'wss_images',array( 'guid' => $wpdb->insert_id.$suf ), array( 'id' => $wpdb->insert_id ) );
$res['status'] = 'success'; $res['msg'] = 'Image added successfully';
}
return $res;
}
代码的最后又通过image_resize()函数对图片进行二次渲染处理。这会破坏图片中的脚本代码。比如之前通过COPY将webshell添加在图片的尾部,经过处理后发现图片结尾出的php代码已经不见了。