Skip to content

Commit 64dd13d

Browse files
authored
Merge pull request #215 from microsoft/ps-add-sql-injection-query
PS: Add SQL injection query
2 parents aee5b23 + c667894 commit 64dd13d

File tree

25 files changed

+330
-42
lines changed

25 files changed

+330
-42
lines changed

powershell/ql/lib/semmle/code/powershell/ApiGraphs.qll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -577,7 +577,7 @@ module API {
577577
)
578578
or
579579
exists(MemberExprReadAccess read |
580-
read.getMemberName().toLowerCase() = name and
580+
read.getLowerCaseMemberName().toLowerCase() = name and
581581
pred = getForwardEndNode(getALocalSourceStrict(getNodeFromExpr(read.getQualifier()))) and
582582
succ = getForwardStartNode(getNodeFromExpr(read))
583583
)

powershell/ql/lib/semmle/code/powershell/ast/internal/Constant.qll

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ class ConstantValue extends TConstantValue {
2424
/** Gets the value of this consant. */
2525
string getValue() { none() }
2626

27+
bindingset[s]
28+
pragma[inline_late]
29+
final predicate stringMatches(string s) { this.asString().toLowerCase() = s.toLowerCase() }
30+
2731
/** Gets the integer value of this constant, if any. */
2832
int asInt() { none() }
2933

powershell/ql/lib/semmle/code/powershell/ast/internal/Function.qll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
private import AstImport
22

33
class Function extends FunctionBase, TFunction {
4-
final override string getName() { any(Synthesis s).functionName(this, result) }
4+
final override string getLowerCaseName() { any(Synthesis s).functionName(this, result) }
55

66
final override ScriptBlock getBody() { any(Synthesis s).functionScriptBlock(this, result) }
77

powershell/ql/lib/semmle/code/powershell/ast/internal/FunctionBase.qll

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@ private import AstImport
22
private import semmle.code.powershell.controlflow.BasicBlocks
33

44
class FunctionBase extends Ast, TFunctionBase {
5-
final override string toString() { result = this.getName() }
5+
final override string toString() { result = this.getLowerCaseName() }
66

7-
string getName() { none() }
7+
string getLowerCaseName() { none() }
88

9-
final predicate hasName(string name) { name = this.getName() }
9+
bindingset[name]
10+
pragma[inline_late]
11+
predicate nameMatches(string name) { this.getLowerCaseName() = name.toLowerCase() }
1012

1113
ScriptBlock getBody() { none() }
1214

powershell/ql/lib/semmle/code/powershell/ast/internal/Member.qll

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
private import AstImport
22

33
class Member extends Ast, TMember {
4-
string getName() {
5-
result = getRawAst(this).(Raw::Member).getName()
4+
string getLowerCaseName() {
5+
result = getRawAst(this).(Raw::Member).getName().toLowerCase()
66
or
77
any(Synthesis s).memberName(this, result)
88
}
99

10+
bindingset[name]
11+
pragma[inline_late]
12+
predicate memberNameMatches(string name) { this.getLowerCaseName() = name.toLowerCase() }
13+
1014
Type getDeclaringType() { result.getAMember() = this }
1115

1216
final Attribute getAttribute(int i) {

powershell/ql/lib/semmle/code/powershell/ast/internal/MemberExpr.qll

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,19 +28,29 @@ class MemberExpr extends Expr, TMemberExpr {
2828
}
2929

3030
/** Gets the name of the member being looked up, if any. */
31-
string getMemberName() {
31+
string getLowerCaseMemberName() {
3232
result =
33-
getRawAst(this).(Raw::MemberExpr).getMember().(Raw::StringConstExpr).getValue().getValue()
33+
getRawAst(this)
34+
.(Raw::MemberExpr)
35+
.getMember()
36+
.(Raw::StringConstExpr)
37+
.getValue()
38+
.getValue()
39+
.toLowerCase()
3440
}
3541

42+
bindingset[name]
43+
pragma[inline_late]
44+
predicate memberNameMatches(string name) { this.getLowerCaseMemberName() = name.toLowerCase() }
45+
3646
predicate isNullConditional() { getRawAst(this).(Raw::MemberExpr).isNullConditional() }
3747

3848
predicate isStatic() { getRawAst(this).(Raw::MemberExpr).isStatic() }
3949

4050
final override string toString() {
41-
result = this.getMemberName()
51+
result = this.getLowerCaseMemberName()
4252
or
43-
not exists(this.getMemberName()) and
53+
not exists(this.getLowerCaseMemberName()) and
4454
result = "..."
4555
}
4656

powershell/ql/lib/semmle/code/powershell/ast/internal/Method.qll

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
private import AstImport
22

33
class Method extends Member, FunctionBase, TMethod {
4-
final override string getName() { result = Member.super.getName() }
4+
final override string getLowerCaseName() { result = Member.super.getLowerCaseName() }
55

66
final override ScriptBlock getBody() {
77
exists(Raw::Ast r | r = getRawAst(this) |
@@ -24,9 +24,7 @@ class Method extends Member, FunctionBase, TMethod {
2424

2525
predicate isConstructor() { getRawAst(this).(Raw::Method).isConstructor() }
2626

27-
ThisParameter getThisParameter() {
28-
result.getFunction() = this
29-
}
27+
ThisParameter getThisParameter() { result.getFunction() = this }
3028
}
3129

3230
/** A constructor definition. */
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
private import AstImport
22

33
class PropertyMember extends Member, TPropertyMember {
4-
final override string getName() { result = getRawAst(this).(Raw::PropertyMember).getName() }
4+
final override string getLowerCaseName() { result = getRawAst(this).(Raw::PropertyMember).getName().toLowerCase() }
55

6-
final override string toString() { result = this.getName() }
6+
final override string toString() { result = this.getLowerCaseName() }
77
}

powershell/ql/lib/semmle/code/powershell/ast/internal/Type.qll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
11
private import AstImport
22

33
class Type extends Ast, TTypeSynth {
4-
override string toString() { result = this.getName() }
4+
override string toString() { result = this.getLowerCaseName() }
55

66
Member getMember(int i) { any(Synthesis s).typeMember(this, i, result) }
77

8-
string getName() { any(Synthesis s).typeName(this, result) }
8+
string getLowerCaseName() { any(Synthesis s).typeName(this, result) }
99

1010
Member getAMember() { result = this.getMember(_) }
1111

12-
Method getMethod(string name) { result = this.getAMember() and result.getName() = name }
12+
Method getMethod(string name) { result = this.getAMember() and result.getLowerCaseName() = name }
1313

1414
Method getAMethod() { result = this.getMethod(_) }
1515

1616
Constructor getAConstructor() {
1717
result = this.getAMethod() and
18-
result.getName() = this.getName()
18+
result.getLowerCaseName() = this.getLowerCaseName()
1919
}
2020

2121
TypeConstraint getBaseType(int i) { none() }

powershell/ql/lib/semmle/code/powershell/ast/internal/TypeDefinitionStmt.qll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
private import AstImport
22

33
class TypeDefinitionStmt extends Stmt, TTypeDefinitionStmt {
4-
string getName() { result = getRawAst(this).(Raw::TypeStmt).getName() }
4+
string getLowerCaseName() { result = getRawAst(this).(Raw::TypeStmt).getName().toLowerCase() }
55

6-
override string toString() { result = this.getName() }
6+
override string toString() { result = this.getLowerCaseName() }
77

88
Member getMember(int i) {
99
exists(ChildIndex index, Raw::Ast r | index = typeStmtMember(i) and r = getRawAst(this) |
@@ -24,7 +24,7 @@ class TypeDefinitionStmt extends Stmt, TTypeDefinitionStmt {
2424

2525
Constructor getAConstructor() {
2626
result = this.getAMethod() and
27-
result.getName() = this.getName()
27+
result.getLowerCaseName() = this.getLowerCaseName()
2828
}
2929

3030
TypeConstraint getBaseType(int i) {
@@ -38,7 +38,7 @@ class TypeDefinitionStmt extends Stmt, TTypeDefinitionStmt {
3838

3939
TypeConstraint getABaseType() { result = this.getBaseType(_) }
4040

41-
TypeDefinitionStmt getASubtype() { result.getABaseType().getName() = this.getName() }
41+
TypeDefinitionStmt getASubtype() { result.getABaseType().getName() = this.getLowerCaseName() }
4242

4343
Type getType() { synthChild(getRawAst(this), typeDefType(), result) }
4444

0 commit comments

Comments
 (0)