File tree Expand file tree Collapse file tree
javascript/ql/test/experimental/Security/CWE-073 Expand file tree Collapse file tree Original file line number Diff line number Diff line change 1+ /**
2+ * @name Express-Hbs Local File Read and Potential RCE
3+ * @description Writing user input directly to res.render of ExpressJS used with Hbs can lead to LFR
4+ * @kind path-problem
5+ * @problem.severity error
6+ * @precision high
7+ * @id js/express-hbs-lfr
8+ * @tags security
9+ * external/cwe/cwe-073
10+ * external/cwe/cwe-094
11+ */
12+
13+ import javascript
14+ import DataFlow
15+ import PathGraph
16+ import Express
17+ import semmle.javascript.DynamicPropertyAccess
18+
19+ predicate isUsingHbsEngine ( ) {
20+ exists ( MethodCallExpr method |
21+ method .getMethodName ( ) = "set" and
22+ Express:: appCreation ( ) .flowsToExpr ( method .getReceiver ( ) ) and
23+ method .getArgument ( 1 ) .getStringValue ( ) .matches ( "hbs" )
24+ )
25+ }
26+
27+ class HbsLFRTaint extends TaintTracking:: Configuration {
28+ HbsLFRTaint ( ) { this = "HbsLFRTaint" }
29+
30+ override predicate isSource ( Node node ) { node instanceof RemoteFlowSource }
31+
32+ override predicate isSink ( Node node ) {
33+ exists ( MethodCallExpr mc |
34+ Express:: isResponse ( mc .getReceiver ( ) ) and
35+ mc .getMethodName ( ) = "render" and
36+ node .asExpr ( ) = mc .getArgument ( 1 ) and
37+ isUsingHbsEngine ( )
38+ )
39+ }
40+ }
41+
42+ from HbsLFRTaint cfg , Node source , Node sink
43+ where cfg .hasFlow ( source , sink )
44+ select source , sink
Original file line number Diff line number Diff line change 1+ var app = require ( 'express' ) ( ) ;
2+ app . set ( 'view engine' , 'hbs' ) ;
3+
4+ app . post ( '/path' , function ( req , res ) {
5+ var bodyParameter = req . body . bodyParameter
6+ var queryParameter = req . query . queryParameter
7+
8+ res . render ( 'template' , bodyParameter )
9+ res . render ( 'template' , queryParameter )
10+ } ) ;
Original file line number Diff line number Diff line change 1+ var app = require ( 'express' ) ( ) ;
2+ app . set ( 'view engine' , 'hbs' ) ;
3+
4+ app . post ( '/path' , function ( req , res ) {
5+ var bodyParameter = req . body . bodyParameter
6+ var queryParameter = req . query . queryParameter
7+
8+ res . render ( 'template' , { bodyParameter} )
9+ res . render ( 'template' , { queryParameter} )
10+ } ) ;
You can’t perform that action at this time.
0 commit comments