PHP静态分析与跨站脚本检测(三)

本文详细记录了PHP静态分析的过程,包括使用PhpParser构建parseTree,处理include文件,以及通过TacConverter进行转换。文章还介绍了如何进行跨站脚本(XSS)检测,特别关注了CfgNode和InterAnalysisNode的分析,以及如何查找和处理潜在的不安全函数。通过对test.php的分析,展示了静态分析和检测的步骤与结果。
摘要由CSDN通过智能技术生成
以下是我看Pixy中一些程序的记录,主要是为了之后能够比较快速的理解程序的思路,记录下来,要不然那么多东西光靠脑子怎么行。有的地方可能有所纰漏,我自己看着可能都觉得不太好。

ProgramConverter
- convert()
    首先利用PhpParser建立一棵parseTree,但是这棵tree只在这里使用而已。利用这棵tree、输入文件以及ProgramConverter对象本身建立TacConverter对象baseTac,然后调用baseTac.convert()。这个baseTac即是可以通过本对象返回的TacConverter属性。然后通过baseTac.getIncludeNodes()获得需要处理的被包含文件。
    进入while循环,前提是函数内局部变量goOn为true和没有“-w”参数。该while循环命名为(w1*),设置goOn=false。如果需要处理的包含文件链表不为空,进入第二个while循环(w2*)。通过for循环将所有的CfgNodeInclude结点单独提取出来,如果这个node是需要跳过的(skip),就取下一个node;如果不是直接通过“常量”包含文件的话,就继续取下一个,这个展示不处理;如果以上两条都不满足,调用include()方法,返回一个内部枚举类型IncStatus,重设将要处理链表,继续w2*。使用baseTac处理一下之后,如果不存在non-literal includes就跳出w1*。否则,开始处理non-literal includes。(253:this.baseTac.backpatch();)。使用baseTac中得到的所有方法,包括用户方法和Main方法计算(259 - 260)。建立AliasAnalysis对象,并以之作为参数建立LiteralAnalysis对象,调用analyze()开始分析。然后,获取包含结点设置为将要处理的包含文件链表,进入for循环,逐个检测,如果已经检测过,跳过,否则即为non-literal的包含文名,按条件分别处理。在通过this.include()方法的返回值决定for循环的去向。再通过this.baseTac.assignFunctions(),然后重新设置需要处理的包含链表,继续w1*。
    将之前得到的可能会有用的包含文件列表中实际没有用的都去掉。并将literalAnalysis置为null,以节省内存。如果需要使用AliasAnalysis,作出相应处理(361 - 364行),否则,利用baseTac调用replaceGlobals(),将所有函数的局部变量使用相应的全局变量替换,进行type分析,与前边的literal过程分析差不多。然后将functions转换为CfgNode,然后输出统计信息。释放资源,调用baseTac.addSuperGlobalElements()添加全局元素,将节点倒序排列。
- include()
    得到应该包含的文件,如果文件不存在,返回NOTFOUND。否则,在allFiles中添加该文件,并将包含与被包含添加到includeGraph中,如果添加成功,对被包含的文件建立parseTree,并建立TacConverter对象,但是这里的对象都只是用来检测里边的include,并将这些CfgNodeInclude添加进从convert()传过来的weComeAfterwards中,以待处理。这样将goOn=true,循环检测。

CfgEdge
    inEdges对于CfgNodeIf来说,是指判断条件,而outEdges是结果。对于其他的node有点说不清楚。


InterAnalysis
    从这个程序看,将被扫描文件分析之后,得到的主要是TacConverter,由他得到TacFunction,然后再得到CfgNode,一个CfgNode对应一个Context,二者共同组成InteWorkListElemnt。在InterAnalysisInfo中则是每一个Cfgode对应一个InterAnalysisNode,在这个node中,由先前与刚才CfgNode对应的Context对应一个LatticeElement,而Latticelement则分别存放相应的信息。如AliasLatticelement存放MustAliases和MayAliases,而DepLatticeElement则存放TacPlace、DepSet、Vatiable等。
    对于test.php来说,通过initTransferFunction()时,在ProgramConverter.convert()中产生了TransferFunctionId,而在checker.analyzeTaint()中则还得到了ConpositeTransferFunction。这时,每个InterAnalysisNode所包含的TransferFunction是确定了的实例,因而下边的transfer方
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值