Skip to content

Commit a72436f

Browse files
committed
recognize more express URL related sources
1 parent e8a7139 commit a72436f

File tree

3 files changed

+34
-1
lines changed

3 files changed

+34
-1
lines changed

javascript/ql/lib/semmle/javascript/frameworks/Express.qll

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -677,7 +677,21 @@ module Express {
677677

678678
RequestInputAccess() {
679679
kind = "parameter" and
680-
this = [queryRef(request), paramsRef(request)].getAPropertyRead()
680+
(
681+
// `req.query` / `req.params`.
682+
// These are objects, so we prefer to use a property read if possible, otherwise we fall back to the object itself.
683+
(
684+
if exists(queryRef(request).getAPropertyRead())
685+
then this = queryRef(request).getAPropertyRead()
686+
else this = queryRef(request)
687+
)
688+
or
689+
(
690+
if exists(paramsRef(request).getAPropertyRead())
691+
then this = paramsRef(request).getAPropertyRead()
692+
else this = paramsRef(request)
693+
)
694+
)
681695
or
682696
exists(DataFlow::SourceNode ref | ref = request.ref() |
683697
kind = "parameter" and

javascript/ql/test/query-tests/Security/CWE-601/ServerSideUrlRedirect/ServerSideUrlRedirect.expected

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,13 @@ nodes
5757
| express.js:155:18:155:23 | target |
5858
| express.js:160:18:160:23 | target |
5959
| express.js:160:18:160:23 | target |
60+
| express.js:164:7:164:54 | myThing |
61+
| express.js:164:17:164:41 | JSON.st ... .query) |
62+
| express.js:164:17:164:54 | JSON.st ... (1, -1) |
63+
| express.js:164:32:164:40 | req.query |
64+
| express.js:164:32:164:40 | req.query |
65+
| express.js:165:16:165:22 | myThing |
66+
| express.js:165:16:165:22 | myThing |
6067
| koa.js:6:6:6:27 | url |
6168
| koa.js:6:12:6:27 | ctx.query.target |
6269
| koa.js:6:12:6:27 | ctx.query.target |
@@ -153,6 +160,12 @@ edges
153160
| express.js:150:7:150:34 | target | express.js:160:18:160:23 | target |
154161
| express.js:150:16:150:34 | req.param("target") | express.js:150:7:150:34 | target |
155162
| express.js:150:16:150:34 | req.param("target") | express.js:150:7:150:34 | target |
163+
| express.js:164:7:164:54 | myThing | express.js:165:16:165:22 | myThing |
164+
| express.js:164:7:164:54 | myThing | express.js:165:16:165:22 | myThing |
165+
| express.js:164:17:164:41 | JSON.st ... .query) | express.js:164:17:164:54 | JSON.st ... (1, -1) |
166+
| express.js:164:17:164:54 | JSON.st ... (1, -1) | express.js:164:7:164:54 | myThing |
167+
| express.js:164:32:164:40 | req.query | express.js:164:17:164:41 | JSON.st ... .query) |
168+
| express.js:164:32:164:40 | req.query | express.js:164:17:164:41 | JSON.st ... .query) |
156169
| koa.js:6:6:6:27 | url | koa.js:7:15:7:17 | url |
157170
| koa.js:6:6:6:27 | url | koa.js:7:15:7:17 | url |
158171
| koa.js:6:6:6:27 | url | koa.js:8:18:8:20 | url |
@@ -214,6 +227,7 @@ edges
214227
| express.js:146:16:146:24 | query.foo | express.js:146:16:146:24 | query.foo | express.js:146:16:146:24 | query.foo | Untrusted URL redirection depends on a $@. | express.js:146:16:146:24 | query.foo | user-provided value |
215228
| express.js:155:18:155:23 | target | express.js:150:16:150:34 | req.param("target") | express.js:155:18:155:23 | target | Untrusted URL redirection depends on a $@. | express.js:150:16:150:34 | req.param("target") | user-provided value |
216229
| express.js:160:18:160:23 | target | express.js:150:16:150:34 | req.param("target") | express.js:160:18:160:23 | target | Untrusted URL redirection depends on a $@. | express.js:150:16:150:34 | req.param("target") | user-provided value |
230+
| express.js:165:16:165:22 | myThing | express.js:164:32:164:40 | req.query | express.js:165:16:165:22 | myThing | Untrusted URL redirection depends on a $@. | express.js:164:32:164:40 | req.query | user-provided value |
217231
| koa.js:7:15:7:17 | url | koa.js:6:12:6:27 | ctx.query.target | koa.js:7:15:7:17 | url | Untrusted URL redirection depends on a $@. | koa.js:6:12:6:27 | ctx.query.target | user-provided value |
218232
| koa.js:8:15:8:26 | `${url}${x}` | koa.js:6:12:6:27 | ctx.query.target | koa.js:8:15:8:26 | `${url}${x}` | Untrusted URL redirection depends on a $@. | koa.js:6:12:6:27 | ctx.query.target | user-provided value |
219233
| koa.js:14:16:14:18 | url | koa.js:6:12:6:27 | ctx.query.target | koa.js:14:16:14:18 | url | Untrusted URL redirection depends on a $@. | koa.js:6:12:6:27 | ctx.query.target | user-provided value |

javascript/ql/test/query-tests/Security/CWE-601/ServerSideUrlRedirect/express.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,3 +159,8 @@ app.get('/some/path', function(req, res) {
159159
else
160160
res.redirect(target); // NOT OK
161161
});
162+
163+
app.get("/foo/:bar/:baz", (req, res) => {
164+
let myThing = JSON.stringify(req.query).slice(1, -1);
165+
res.redirect(myThing); // NOT OK
166+
});

0 commit comments

Comments
 (0)