mirror of
https://github.com/github/codeql.git
synced 2025-12-17 17:23:36 +01:00
https://github.com/Semmle/ql/pull/698 removed `document.cookie` as a remote flow source, which some of the tests relied on. We now use `location.search` instead.
193 lines
3.9 KiB
JavaScript
193 lines
3.9 KiB
JavaScript
var http = require('http'),
|
|
url = require('url');
|
|
|
|
function listenForHeaders(cb) {
|
|
http.createServer(function (req, res) {
|
|
let cmd = url.parse(req.url, true).query.path;
|
|
cb(cmd); // sink
|
|
res.write('Hello World!');
|
|
res.end();
|
|
}).listen(8080);
|
|
};
|
|
|
|
function codeInjection(input) {
|
|
eval("url[" + input + "]");
|
|
}
|
|
|
|
function commandInjection(input) {
|
|
require("child_process").exec("ls " + input);
|
|
}
|
|
|
|
function multiple(input) {
|
|
codeInjection(input);
|
|
commandInjection(input);
|
|
}
|
|
|
|
function taintedPath(input) {
|
|
require("/tmp/" + input);
|
|
}
|
|
|
|
function regexpInj(data) {
|
|
new RegExp("^"+ data.name + "$", "i");
|
|
}
|
|
|
|
function xpathInj(userName) {
|
|
const xpath = require('xpath');
|
|
let badXPathExpr = xpath.parse("//users/user[login/text()='" + userName + "']/home_dir/text()");
|
|
badXPathExpr.select({
|
|
node: root
|
|
});
|
|
}
|
|
|
|
function xxe(input) {
|
|
const expat = require('node-expat');
|
|
var parser = new expat.Parser();
|
|
parser.write(input);
|
|
}
|
|
|
|
|
|
function xmlBomb(input) {
|
|
const libxmljs = require('libxmljs');
|
|
libxmljs.parseXml(input, { noent: true });
|
|
|
|
}
|
|
|
|
function hashPass(input) {
|
|
require('crypto').createCipher('aes192').write(input);
|
|
codeInjection(input)
|
|
}
|
|
|
|
function unsafeDes(input) {
|
|
const jsyaml = require("js-yaml");
|
|
let data;
|
|
return jsyaml.load(input);
|
|
}
|
|
|
|
function remoteProp(input1, input2, input3) {
|
|
var obj = url[input1];
|
|
obj[input2] = input3;
|
|
}
|
|
|
|
function reflected(userID) {
|
|
var express = require('express');
|
|
|
|
var app = express();
|
|
|
|
app.get('/user/:id', function(req, res) {
|
|
res.send("Unknown user: " + userID);
|
|
});
|
|
}
|
|
|
|
function redirect(input) {
|
|
var https = require('https');
|
|
var url = require('url');
|
|
|
|
var server = https.createServer(function(req, res) {
|
|
res.writeHead(302, { Location: '/' + input});
|
|
}).listen(8080)
|
|
|
|
}
|
|
|
|
function sqlInj(input) {
|
|
var mysql = require('mysql');
|
|
var connection = mysql.createConnection({
|
|
host : 'localhost',
|
|
user : 'me',
|
|
password : 'secret',
|
|
database : 'my_db'
|
|
});
|
|
connection.connect();
|
|
connection.query('SELECT ' + input + ' AS solution', function (error, results, fields) {
|
|
if (error) throw error;
|
|
console.log('The solution is: ', results[0].solution);
|
|
});
|
|
}
|
|
|
|
function createError () {
|
|
var err, status;
|
|
for (i = 0; i < 1000; i++) {
|
|
err = {};
|
|
status = err.a || err.b || err.c || err.d || err;
|
|
}
|
|
|
|
err.a = err.b = status
|
|
|
|
return err;
|
|
}
|
|
|
|
function forLoop(input) {
|
|
var intObj = {};
|
|
var res = 0;
|
|
for (var i = 0; i < input.x.length; i++) {
|
|
res += intObj.x + input.x[i];
|
|
}
|
|
if (res < 1000) {
|
|
intObj.res = res;
|
|
return intObj;
|
|
} else
|
|
return res;
|
|
}
|
|
|
|
function notASink(foo) {
|
|
return foo;
|
|
}
|
|
|
|
// this call should not make parameter `foo` a command injection sink
|
|
eval(notASink(42));
|
|
|
|
function taintedSource() {
|
|
return location.search;
|
|
}
|
|
|
|
function notATaintedSource(x) {
|
|
return x;
|
|
}
|
|
|
|
// this call should not make the return value of `notATaintedSource` a remote flow source
|
|
notATaintedSource(location.search);
|
|
|
|
function invoke(cb, x) {
|
|
cb(x);
|
|
}
|
|
|
|
// this call should not make the first argument to `cb` above a remote flow source
|
|
invoke((x)=>x, location.search);
|
|
|
|
function g(x) {
|
|
h(x);
|
|
}
|
|
|
|
function h(y) {
|
|
return y;
|
|
}
|
|
|
|
function mkdirp(path) {
|
|
path /* Semmle: sink: taint, TaintedPath */
|
|
}
|
|
|
|
module.exports = {
|
|
codeInjection: codeInjection,
|
|
commandInjection: commandInjection,
|
|
remotePropeInjection: remoteProp,
|
|
multiple: multiple,
|
|
taintedPath: taintedPath,
|
|
sqlInj: sqlInj,
|
|
listen: listenForHeaders,
|
|
createError: createError,
|
|
regexpInj: regexpInj,
|
|
xpathInj: xpathInj,
|
|
xmlBomb: xmlBomb,
|
|
hashPass: hashPass,
|
|
xxe: xxe,
|
|
unsafeDes: unsafeDes,
|
|
redirect: redirect,
|
|
reflected: reflected,
|
|
notASink: notASink,
|
|
taintedSource: taintedSource,
|
|
notATaintedSource: notATaintedSource,
|
|
invoke: invoke,
|
|
g: g,
|
|
h: h,
|
|
mkdirp: mkdirp
|
|
}
|