public object VisitMemberExpression(MemberExpressionAst memberExpressionAst)
        {
            var newExpr   = VisitElement(memberExpressionAst.Expression);
            var newMember = VisitElement(memberExpressionAst.Member);

            return(new MemberExpressionAst(memberExpressionAst.Extent, newExpr, newMember, memberExpressionAst.Static));
        }
Example #2
0
        public static void MeasurePropertyInjection(string ScriptBlock)
        {
            Token[]        token;
            ParseError[]   error;
            ScriptBlockAst ScriptBlockAst = Parser.ParseInput(ScriptBlock, out token, out error);

            Func <Ast, bool> predicate = delegate(Ast ast)
            {
                var derpVar  = new VariableExpressionAst(ast.Extent, "Derp", splatted: false);
                var derpVar2 = new StringConstantExpressionAst(ast.Extent, "Derpvr2", StringConstantType.BareWord);
                InvokeMemberExpressionAst methodAst = new InvokeMemberExpressionAst(ast.Extent, derpVar, derpVar2, Enumerable.Empty <ExpressionAst>(), @static: false);
                var ast2     = ast.Copy();
                var derpVar3 = new VariableExpressionAst(ast2.Extent, "Derp3", splatted: false);
                var derpVar4 = new StringConstantExpressionAst(ast2.Extent, "Derpvr4", StringConstantType.BareWord);
                MemberExpressionAst targetAst = new MemberExpressionAst(ast2.Extent, derpVar3, derpVar4, @static: false);
                if (targetAst != null && methodAst == null)
                {
                    if (!(targetAst.Member is ConstantExpressionAst))
                    {
                        return(true);
                    }
                }
                return(false);
            };

            var foundNode = ScriptBlockAst.Find(predicate, true);

            if (foundNode != null)
            {
                Console.WriteLine("[+] Possible injection vulnerability found");
                Console.WriteLine(String.Format(@"Possible property access injection via dynamic member access. Untrusted input can cause arbitrary static properties to be accessed:
RuleName = InjectionRisk.StaticPropertyInjection
Severity = Warning", foundNode.Extent));
            }
        }
            public override AstVisitAction VisitMemberExpression(MemberExpressionAst memberExpressionAst)
            {
                if (!_targetVersions.Contains(s_v3))
                {
                    return(AstVisitAction.Continue);
                }

                if (!(memberExpressionAst.Member is StringConstantExpressionAst))
                {
                    string message = string.Format(
                        CultureInfo.CurrentCulture,
                        Strings.UseCompatibleSyntaxError,
                        "dynamic member invocation",
                        memberExpressionAst.Extent.Text,
                        "3");

                    _diagnosticAccumulator.Add(new DiagnosticRecord(
                                                   message,
                                                   memberExpressionAst.Extent,
                                                   _rule.GetName(),
                                                   _rule.Severity,
                                                   _analyzedFilePath
                                                   ));
                }

                return(AstVisitAction.Continue);
            }
Example #4
0
        private ExpressionAst CreateClosureAccess(IScriptExtent extent, string name)
        {
            MaybeProcessMember(name, out int index, out string groupName);
            var closureExpr = new IndexExpressionAst(
                extent,
                new VariableExpressionAst(extent, "args", false),
                new ConstantExpressionAst(extent, 0));

            var groupExpr = new MemberExpressionAst(
                extent,
                closureExpr,
                new StringConstantExpressionAst(extent, groupName, StringConstantType.BareWord),
                @static: false);

            var elementAccess = new IndexExpressionAst(
                extent,
                groupExpr,
                new ConstantExpressionAst(extent, index));

            if (groupName != nameof(Closure.Inherits))
            {
                return(elementAccess);
            }

            return(new MemberExpressionAst(
                       extent,
                       elementAccess,
                       new StringConstantExpressionAst(extent, nameof(PSVariable.Value), StringConstantType.BareWord),
                       @static: false));
        }
        public object VisitMemberExpression(MemberExpressionAst memberExpressionAst)
        {
            var expression = VisitAst(memberExpressionAst.Expression);
            var member     = VisitAst(memberExpressionAst.Member);

            return(new MemberExpressionAst(memberExpressionAst.Extent, expression, member, memberExpressionAst.Static));
        }
Example #6
0
 public void MemberAccess()
 {
     MemberExpressionAst memberExpressionAst = ParseInput("[System.Int32]::MaxValue")
                                               .EndBlock
                                               .Statements[0]
                                               .PipelineElements[0]
                                               .Expression;
 }
Example #7
0
 public override AstVisitAction VisitMemberExpression(MemberExpressionAst memberExpressionAst)
 {
     if (!ValidateExtend(symbolRef.ScriptRegion.Text, memberExpressionAst.Member.ToString(), memberExpressionAst))
     {
         return(AstVisitAction.Continue);
     }
     return(AstVisitAction.StopVisit);
 }
Example #8
0
 public override AstVisitAction VisitMemberExpression(MemberExpressionAst memberExpressionAst)  //confirmed
 {
     if (memberExpressionAst.ToString().Contains(symbolRef.ScriptRegion.Text))
     {
         ValidateExtend(symbolRef.ScriptRegion.Text, memberExpressionAst.Member.ToString(), memberExpressionAst);
     }
     return(base.VisitMemberExpression(memberExpressionAst));
 }
 public virtual ExpressionAst VisitMemberExpression(MemberExpressionAst memberExpressionAst)
 {
     return(new MemberExpressionAst(
                memberExpressionAst.Extent,
                memberExpressionAst.Expression.Rewrite(this),
                memberExpressionAst.Member.Rewrite(this),
                memberExpressionAst.Static));
 }
Example #10
0
        public object VisitMemberExpression(MemberExpressionAst memberExpressionAst)
        {
            var expression = Visit(memberExpressionAst.Expression);

            var fieldRef = new CodePropertyReferenceExpression(expression as CodeExpression,
                                                               memberExpressionAst.Member.ToString());

            return(fieldRef);
        }
Example #11
0
        public override AstVisitAction VisitMemberExpression(MemberExpressionAst memberExpressionAst)
        {
            var expression = memberExpressionAst.Expression;

            Type   type;
            object obj;

            if (expression is TypeExpressionAst)
            {
                obj  = null;
                type = ((TypeExpressionAst)expression).TypeName.GetReflectionType();
            }
            else
            {
                obj = EvaluateAst(expression);
                if (obj is PSObject)
                {
                    obj = ((PSObject)obj).BaseObject;
                }
                type = obj.GetType();
            }

            if (memberExpressionAst.Member is StringConstantExpressionAst)
            {
                object result = null;
                var    name   = (memberExpressionAst.Member as StringConstantExpressionAst).Value;

                BindingFlags bindingFlags = BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static;

                // TODO: Single() is a problem for overloaded methods
                var memberInfo = type.GetMember(name, bindingFlags).Single();

                if (memberInfo != null)
                {
                    switch (memberInfo.MemberType)
                    {
                    case MemberTypes.Field:
                        result = ((FieldInfo)memberInfo).GetValue(obj);
                        break;

                    case MemberTypes.Property:
                        result = ((PropertyInfo)memberInfo).GetValue(obj, null);
                        break;

                    default:
                        throw new NotImplementedException(this.ToString());
                    }
                }

                _pipelineCommandRuntime.WriteObject(result);
                return(AstVisitAction.SkipChildren);
            }

            throw new NotImplementedException(this.ToString());
        }
 public static MemberExpressionAst Update(
     this MemberExpressionAst ast,
     ExpressionAst expression = null,
     CommandElementAst member = null,
     bool? @static            = null)
 {
     return(new MemberExpressionAst(
                ast.Extent,
                expression?.Clone() ?? ast.Expression.Clone(),
                member?.Clone() ?? ast.Member.Clone(),
                @static ?? ast.Static));
 }
        public override AstVisitAction VisitMemberExpression(MemberExpressionAst memberExpressionAst)
        {
            var expression = VisitSyntaxNode(memberExpressionAst.Expression);
            var member     = VisitSyntaxNode(memberExpressionAst.Member);

            if (member is StringConstant)
            {
                var str = member as StringConstant;
                _currentNode = new MemberAccess(expression, str.Value);
            }

            return(AstVisitAction.SkipChildren);
        }
Example #14
0
            public override object VisitMemberExpression(MemberExpressionAst memberExpressionAst)
            {
                VisitElement(memberExpressionAst.Expression);

                if (memberExpressionAst.Static)
                {
                    script_.Write("::");
                }
                else
                {
                    script_.Write(".");
                }

                VisitElement(memberExpressionAst.Member);

                return(memberExpressionAst);
            }
Example #15
0
            public override AstVisitAction VisitMemberExpression(MemberExpressionAst memberExpressionAst)
            {
                if (!TargetsNonPS7())
                {
                    return(AstVisitAction.Continue);
                }

                if (memberExpressionAst.NullConditional)
                {
                    AddDiagnostic(
                        memberExpressionAst,
                        "null-conditional member access",
                        "${x}?.Member",
                        "3,4,5,6");
                }

                return(AstVisitAction.Continue);
            }
        public override AstVisitAction VisitMemberExpression(MemberExpressionAst memberExpressionAst)
        {
            var objectOrClass = "object";
            var stat          = "";

            if (memberExpressionAst.Static)
            {
                objectOrClass = "class";
                stat          = "static ";
            }

            explanations.Add(
                new Explanation
            {
                Description = $"Access the {stat}property '{memberExpressionAst.Member}' on {objectOrClass} '{memberExpressionAst.Expression}'",
                CommandName = "Property",
                HelpResult  = HelpTableQuery("about_Properties")
            }.AddDefaults(memberExpressionAst, explanations));

            return(AstVisitAction.Continue);
        }
Example #17
0
 public override ExpressionAst VisitMemberExpression(MemberExpressionAst memberExpressionAst)
 => VisitExpression(base.VisitMemberExpression(memberExpressionAst));
Example #18
0
        private List <CompletionResult> GetResultForIdentifier(CompletionContext completionContext, ref int replacementIndex, ref int replacementLength, bool isQuotedString)
        {
            Token tokenAtCursor            = completionContext.TokenAtCursor;
            Ast   lastAst                  = completionContext.RelatedAsts.Last <Ast>();
            List <CompletionResult> source = null;

            completionContext.WordToComplete = tokenAtCursor.Text;
            StringConstantExpressionAst ast2 = lastAst as StringConstantExpressionAst;

            if ((ast2 != null) && ast2.Value.Equals("$", StringComparison.Ordinal))
            {
                completionContext.WordToComplete = "";
                return(CompletionCompleters.CompleteVariable(completionContext));
            }
            if ((tokenAtCursor.TokenFlags & TokenFlags.CommandName) != TokenFlags.None)
            {
                if ((completionContext.RelatedAsts.Count > 0) && (completionContext.RelatedAsts[0] is ScriptBlockAst))
                {
                    Ast lastAstAtCursor             = null;
                    InternalScriptPosition position = (InternalScriptPosition)this._cursorPosition;
                    int offset = position.Offset - tokenAtCursor.Text.Length;
                    if (offset >= 0)
                    {
                        InternalScriptPosition cursorPosition = position.CloneWithNewOffset(offset);
                        ScriptBlockAst         scriptBlockAst = (ScriptBlockAst)completionContext.RelatedAsts[0];
                        lastAstAtCursor = GetLastAstAtCursor(scriptBlockAst, cursorPosition);
                    }
                    if (((lastAstAtCursor != null) && (lastAstAtCursor.Extent.EndLineNumber == tokenAtCursor.Extent.StartLineNumber)) && (lastAstAtCursor.Extent.EndColumnNumber == tokenAtCursor.Extent.StartColumnNumber))
                    {
                        if (tokenAtCursor.Text.IndexOfAny(new char[] { '\\', '/' }) == 0)
                        {
                            string str = CompletionCompleters.ConcatenateStringPathArguments(lastAstAtCursor as CommandElementAst, tokenAtCursor.Text, completionContext);
                            if (str != null)
                            {
                                completionContext.WordToComplete = str;
                                source = new List <CompletionResult>(CompletionCompleters.CompleteFilename(completionContext));
                                if (source.Count > 0)
                                {
                                    replacementIndex   = lastAstAtCursor.Extent.StartScriptPosition.Offset;
                                    replacementLength += lastAstAtCursor.Extent.Text.Length;
                                }
                                return(source);
                            }
                            VariableExpressionAst variableAst = lastAstAtCursor as VariableExpressionAst;
                            string str2 = (variableAst != null) ? CompletionCompleters.CombineVariableWithPartialPath(variableAst, tokenAtCursor.Text, completionContext.ExecutionContext) : null;
                            if (str2 == null)
                            {
                                return(source);
                            }
                            completionContext.WordToComplete = str2;
                            replacementIndex   = lastAstAtCursor.Extent.StartScriptPosition.Offset;
                            replacementLength += lastAstAtCursor.Extent.Text.Length;
                            completionContext.ReplacementIndex  = replacementIndex;
                            completionContext.ReplacementLength = replacementLength;
                        }
                        else if (!(lastAstAtCursor is ErrorExpressionAst) || !(lastAstAtCursor.Parent is IndexExpressionAst))
                        {
                            return(source);
                        }
                    }
                }
                if (!isQuotedString)
                {
                    StringExpandableToken token2 = tokenAtCursor as StringExpandableToken;
                    if (((token2 != null) && (token2.NestedTokens != null)) && (ast2 != null))
                    {
                        try
                        {
                            string expandedString = null;
                            ExpandableStringExpressionAst expandableStringAst = new ExpandableStringExpressionAst(ast2.Extent, ast2.Value, StringConstantType.BareWord);
                            if (CompletionCompleters.IsPathSafelyExpandable(expandableStringAst, string.Empty, completionContext.ExecutionContext, out expandedString))
                            {
                                completionContext.WordToComplete = expandedString;
                            }
                            else
                            {
                                return(source);
                            }
                        }
                        catch (Exception exception)
                        {
                            CommandProcessorBase.CheckForSevereException(exception);
                            return(source);
                        }
                    }
                    source = CompleteFileNameAsCommand(completionContext);
                    List <CompletionResult> collection = CompletionCompleters.CompleteCommand(completionContext);
                    if ((collection != null) && (collection.Count > 0))
                    {
                        source.AddRange(collection);
                    }
                }
                return(source);
            }
            if (((tokenAtCursor.Text.Length == 1) && tokenAtCursor.Text[0].IsDash()) && (lastAst.Parent is CommandAst))
            {
                if (isQuotedString)
                {
                    return(source);
                }
                return(CompletionCompleters.CompleteCommandParameter(completionContext));
            }
            TokenKind unknown = TokenKind.Unknown;
            bool      flag    = lastAst.Parent is MemberExpressionAst;
            bool      @static = flag ? ((MemberExpressionAst)lastAst.Parent).Static : false;
            bool      flag3   = false;

            if (!flag)
            {
                if (tokenAtCursor.Text.Equals(TokenKind.Dot.Text(), StringComparison.Ordinal))
                {
                    unknown = TokenKind.Dot;
                    flag    = true;
                }
                else if (tokenAtCursor.Text.Equals(TokenKind.ColonColon.Text(), StringComparison.Ordinal))
                {
                    unknown = TokenKind.ColonColon;
                    flag    = true;
                }
                else if (tokenAtCursor.Kind.Equals(TokenKind.Multiply) && (lastAst is BinaryExpressionAst))
                {
                    BinaryExpressionAst item          = (BinaryExpressionAst)lastAst;
                    MemberExpressionAst left          = item.Left as MemberExpressionAst;
                    IScriptExtent       errorPosition = item.ErrorPosition;
                    if (((left != null) && (item.Operator == TokenKind.Multiply)) && (errorPosition.StartOffset == left.Member.Extent.EndOffset))
                    {
                        @static = left.Static;
                        unknown = @static ? TokenKind.ColonColon : TokenKind.Dot;
                        flag    = true;
                        flag3   = true;
                        completionContext.RelatedAsts.Remove(item);
                        completionContext.RelatedAsts.Add(left);
                        StringConstantExpressionAst member = left.Member as StringConstantExpressionAst;
                        if (member != null)
                        {
                            replacementIndex   = member.Extent.StartScriptPosition.Offset;
                            replacementLength += member.Extent.Text.Length;
                        }
                    }
                }
            }
            if (flag)
            {
                source = CompletionCompleters.CompleteMember(completionContext, @static || (unknown == TokenKind.ColonColon));
                if (source.Any <CompletionResult>())
                {
                    if (!flag3 && (unknown != TokenKind.Unknown))
                    {
                        replacementIndex += tokenAtCursor.Text.Length;
                        replacementLength = 0;
                    }
                    return(source);
                }
            }
            if (lastAst.Parent is HashtableAst)
            {
                source = CompletionCompleters.CompleteHashtableKey(completionContext, (HashtableAst)lastAst.Parent);
                if ((source != null) && source.Any <CompletionResult>())
                {
                    return(source);
                }
            }
            if (!isQuotedString)
            {
                bool flag4 = false;
                if ((lastAst.Parent is FileRedirectionAst) || CompleteAgainstSwitchFile(lastAst, completionContext.TokenBeforeCursor))
                {
                    string str4 = CompletionCompleters.ConcatenateStringPathArguments(lastAst as CommandElementAst, string.Empty, completionContext);
                    if (str4 != null)
                    {
                        flag4 = true;
                        completionContext.WordToComplete = str4;
                    }
                }
                else if (tokenAtCursor.Text.IndexOfAny(new char[] { '\\', '/' }) == 0)
                {
                    CommandBaseAst parent = lastAst.Parent as CommandBaseAst;
                    if ((parent != null) && parent.Redirections.Any <RedirectionAst>())
                    {
                        FileRedirectionAst ast11 = parent.Redirections[0] as FileRedirectionAst;
                        if (((ast11 != null) && (ast11.Extent.EndLineNumber == lastAst.Extent.StartLineNumber)) && (ast11.Extent.EndColumnNumber == lastAst.Extent.StartColumnNumber))
                        {
                            string str5 = CompletionCompleters.ConcatenateStringPathArguments(ast11.Location, tokenAtCursor.Text, completionContext);
                            if (str5 != null)
                            {
                                flag4 = true;
                                completionContext.WordToComplete = str5;
                                replacementIndex   = ast11.Location.Extent.StartScriptPosition.Offset;
                                replacementLength += ast11.Location.Extent.EndScriptPosition.Offset - replacementIndex;
                                completionContext.ReplacementIndex  = replacementIndex;
                                completionContext.ReplacementLength = replacementLength;
                            }
                        }
                    }
                }
                if (flag4)
                {
                    return(new List <CompletionResult>(CompletionCompleters.CompleteFilename(completionContext)));
                }
                string str6 = CompletionCompleters.ConcatenateStringPathArguments(lastAst as CommandElementAst, string.Empty, completionContext);
                if (str6 != null)
                {
                    completionContext.WordToComplete = str6;
                }
                source            = CompletionCompleters.CompleteCommandArgument(completionContext);
                replacementIndex  = completionContext.ReplacementIndex;
                replacementLength = completionContext.ReplacementLength;
            }
            return(source);
        }
Example #19
0
 public virtual object VisitMemberExpression(MemberExpressionAst memberExpressionAst)
 {
     VisitElement(memberExpressionAst.Expression);
     VisitElement(memberExpressionAst.Member);
     return(memberExpressionAst);
 }
Example #20
0
 public object VisitMemberExpression(MemberExpressionAst memberExpressionAst)
 {
     Console.WriteLine("Visited an MemberExpressionAst.");
     return(memberExpressionAst);
 }
Example #21
0
 public override AstVisitAction VisitMemberExpression(MemberExpressionAst memberExpressionAst)
 {
     Console.WriteLine("Visited an MemberExpressionAst.");
     Console.WriteLine("    " + memberExpressionAst.ToString().Replace(Environment.NewLine, Environment.NewLine + "    "));
     return(AstVisitAction.Continue);
 }
 public object VisitMemberExpression(MemberExpressionAst memberExpressionAst) => null;
Example #23
0
 public override AstVisitAction VisitMemberExpression(MemberExpressionAst memberExpressionAst)
 {
     throw new NotImplementedException(); //VisitMemberExpression(memberExpressionAst);
 }
Example #24
0
 /// <summary/>
 public virtual AstVisitAction VisitMemberExpression(MemberExpressionAst memberExpressionAst) => DefaultVisit(memberExpressionAst);
Example #25
0
 public override AstVisitAction VisitMemberExpression(MemberExpressionAst ast)
 {
     return(DoNextAction(ast));
 }
 public object VisitMemberExpression(MemberExpressionAst memberExpressionAst)
 {
     throw PSTraceSource.NewArgumentException("ast");
 }
 public override AstVisitAction VisitMemberExpression(MemberExpressionAst functionDefinitionAst)
 {
     // We don't want to discover any variables in member expressisons (`$something.Foo`)
     return(AstVisitAction.SkipChildren);
 }
 internal SettableMemberExpression(MemberExpressionAst expressionAst, ExecutionVisitor currentExecution)
     : base(currentExecution)
 {
     _expressionAst = expressionAst;
 }
Example #29
0
 public object VisitMemberExpression(MemberExpressionAst memberExpressionAst)
 {
     return(!((bool)memberExpressionAst.Expression.Accept(this)) ? ((object)0) : ((object)((bool)memberExpressionAst.Member.Accept(this))));
 }
Example #30
0
 public void StaticProperty()
 {
     MemberExpressionAst memberExpressionAst = ParseStatement("[System.Int32]::MaxValue")
                                               .PipelineElements[0]
                                               .Expression;
 }