BugTraq
Syhunt: Google V8 - Server-Side JS Injection in vulnerable web apps Feb 25 2012 04:17AM
Felipe M. Aragon (felipe syhunt com)
Google V8 Server-Side JavaScript Injection joins the set of web
application security vulnerabilities

TIME-BASED PHP V8JS INJECTION & NOSQL/SSJS INJECTION

Detecting server-side JavaScript (SSJS) injection vulnerabilities using
time-based techniques. Article by Felipe Aragon - February 25, 2012

This article, which is an update of an article that we originally
published on December 18, 2011, intends to highlight the risk of
unvalidated input used to execute server-side JavaScript.

As you read this, web developers are starting to learn how to use V8Js
(Google's V8 JavaScript engine) in PHP:
http://www.php.net/manual/en/v8js.examples.php
http://stackoverflow.com/questions/9035567/why-is-a-function-re-definiti
on-faster-than-calling-the-first-one

...or MongoDB, which is a scalable, high-performance, open source NoSQL
database that also allows JavaScript to be used in queries:
http://www.mongodb.org/

Today, the most common source of PHP security flaws is unvalidated
input. They give rise to SQL Injection, XSS, Remote Command Execution,
Local and Remote File Inclusion, etc (known as the PHP Top 5
https://www.owasp.org/index.php/PHP_Top_5). With the rising adoption of
server-side JavaScript, we can expect server-side JS injection
vulnerabilities caused by unvalidated user input to become prevalent,
and the techniques for exploiting them, commonplace. At Syhunt, we
already started our own collection of techniques for detecting
server-side JS injection vulnerabilities. We want to proactively detect
them before they are exploited.

The Time-Based JS Injection Technique
**********************************************

Injecting a custom sleep code is a technique that may be used to spot
injection vulnerabilities in web applications using server-side
JavaScript execution. This works with any web system that supports
server-side JavaScript execution, such as JavaScript web application
frameworks and servers like Jaxer (http://jaxer.org/), or PHP with V8Js,
or NoSQL engines like MongoDB.

Below you can find examples of server-side JavaScript injection
vulnerabilities in PHP that could be spotted using the sleep technique.
In the past, we used this same sleep code in the client-side to
demonstrate how vulnerabilities we found in the A-A-S (Application
Access Server) could be exploited
(http://www.syhunt.com/?n=Advisories.Aas-multiple).

Example 1: PHP V8JS Injection Vulnerabilities (PHP + V8Js)
*************

The following requests would make these (or similar) vulnerable web
applications sleep for 10 seconds:

vulnerable.php?msg=a';d%20=%20new%20Date();do{cd=new%20Date();}while(cd-
d<10000);foo='bar

Vulnerable Code:

$msg = $_GET['msg'];
$v8 = new V8Js();
$v8->executeString("var msg = '$msg'; ..SOME CODE..");

vulnerable.php?msg=version());d%20=%20new%20Date();do{cd=new%20Date();}w
hile(cd-d<10000);foo=('bar'

Vulnerable Code:

$msg = $_GET['msg'];
$v8 = new V8Js();
$JS = <<< EOT
len = print($msg + "\\n");
..SOME CODE..
EOT;

$v8->executeString($JS, 'basic.js');

Example 2: NoSQL SSJS Injection Vulnerability (PHP + MongoDB)
*************

The MongoDB shell provides a sleep() function (see
http://api.mongodb.org/js/current/symbols/src/shell_utils.js.html) which
makes time-based detection much easier to perform.

The following requests would make these (or similar) vulnerable web
applications sleep for 10 seconds:

vulnerable.php?msg=1';sleep(10000);var%20foo='bar

The MongoDB sleep() function works with milliseconds.

Alternative technique using a custom sleep code:

vulnerable.php?msg=1';d=new%20Date();do{cd=new%20Date();}while(cd-d<1000
0);foo='bar

Vulnerable Code:

<?
$mongo = new Mongo();
$db = $mongo->demo;
$id = $_GET['id'];
$js = "function() {
var id = '$id';
SOME CODE...
}";
$response = $db->execute($js);
...
?>

Example 3: NoSQL SSJS Injection Vulnerability (PHP + MongoDB)
*************

Vulnerable Code:

<?
$mongo = new Mongo();
$db = $mongo->demo;
$year = $_GET['year'];
$collection = $db->demo;
$query = 'function() {var search_year = \'' .
$year . '\';' .
'return this.publicationYear == search_year || ' .
' this.filmingYear == search_year || ' .
' this.recordingYear == search_year;}';
$cursor = $collection->find(array('$where' => $query));
...
?>

Example 4: SSJS Injection Vulnerability (PHP + Jaxer)
*************

Example of a vulnerable application built using the Jaxer Ajax server
and PHP.

Vulnerable Code:

<?php
$myVar = $_GET['id'];

echo "<script runat=server>
myPHPVar = '$myVar';
onload = function(){
..SOME CODE..
};
</script>";
?>

Example 5: Sleep in JavaScript
*************

var date = new Date();
do { curDate = new Date(); }
while(curDate-date < 10000); // delay time (ms)

Additional Information

The advent of Big Data and Cloud Computing is driving adoption of NoSQL
in the enterprise. Because of this, NoSQL-related vulnerabilities are
expected to become much more widespread
(http://www.govtech.com/policy-management/9-Cybersecurity-Threat-Predict
ions-for-2012.html)

In July last year, Bryan Sullivan, a senior security researcher at Adobe
Systems, demonstrated server-side JavaScript injection vulnerabilities
in web applications using MongoDB and other NoSQL database engines. He
demonstrated how they could be used to perform Denial of Service, File
System, Remote Command Execution, and many other attacks, including the
easy extraction of the entire contents of the NoSQL database -- a blind
NoSQL injection attack (paper available at
https://media.blackhat.com/bh-us-11/Sullivan/BH_US_11_Sullivan_Server_Si
de_WP.pdf).

Solution

Always validate user input used in server-side JavaScript commands.

[ reply ]


 

Privacy Statement
Copyright 2010, SecurityFocus