The pagetriage-new-page-feed-show-ip and pagetriage-new-page-feed-show-ip-not-found system messages are inserted as raw HTML by the PageTriage extension, allowing for stored XSS by inserting malicious HTML into the messages.
Reproduction steps for both vulnerabilities:
- Install PageTriage
- Install CheckUser
- Add the following to your LocalSettings.php (not all might be required):
$wgGroupPermissions['sysop']['checkuser'] = true; $wgGroupPermissions['sysop']['checkuser-log'] = true; $wgGroupPermissions['sysop']['investigate'] = true; $wgGroupPermissions['sysop']['checkuser-temporary-account-log'] = true; $wgGroupPermissions['sysop']['checkuser-temporary-account-no-preference'] = true;
pagetriage-new-page-feed-show-ip
Reproduction
- Edit MediaWiki:Pagetriage-new-page-feed-show-ip to <img src="" onerror="alert(1)">
- In a private browser tab, create a new page using a temporary account
- Go to Special:NewPagesFeed using an account with the sysop group
Cause
The unescaped system message is passed into jQuery's .append() function, which inserts it as raw HTML:
pagetriage-new-page-feed-show-ip-not-found
Reproduction
- Add $wgCUDMaxAge = 1; to your LocalSettings.php so we can make CheckUser forget about the temporary account's IP later
- Edit MediaWiki:Pagetriage-new-page-feed-show-ip-not-found to <img src="" onerror="alert(2)">
- In a private browser tab, create a new page using a temporary account
- Run the CheckUser:purgeOldData maintenance script (which should delete the IP of the temporary account)
- Go to Special:NewPagesFeed using an account with the sysop group
- Click on the "Show IP" link next to the name of the temporary account
Cause
The unescaped system message is passed into jQuery's .replaceWith() function, which inserts it as raw HTML:

