当前位置: 首页 > news >正文

成都网站设计制作房地产行业现状及前景

成都网站设计制作,房地产行业现状及前景,网络营销推广公司获客,wordpress的htmlRIPS是一款对PHP源码进行风险扫描的工具#xff0c;其对代码扫描的方式是常规的正则匹配#xff0c;确定sink点#xff1b;还是如flowdroid构建全局数据流图#xff0c;并分析存储全局数据可达路径#xff1b;下面就从其源码上略探一二。1、扫描流程分析其源码前#xff…RIPS是一款对PHP源码进行风险扫描的工具其对代码扫描的方式是常规的正则匹配确定sink点还是如flowdroid构建全局数据流图并分析存储全局数据可达路径下面就从其源码上略探一二。1、扫描流程分析其源码前我们需要缕清其扫描的流程方便后面的分析下图展示其进行扫描的主界面先简单介绍下每个标签的基本功能path/file待扫描代码的文件地址subdirs是否对代码的子目录进行扫描勾选将会扫描子目录不勾选只扫描当前目录下的PHP文件verbosity level选择source点即可控制的输入点定义在rips下config/sources.php中vuln type选择sink点即可能会触发各种风险的函数定义在rips下config/sinks.php中scan选择好前面的选项点击该按钮即可开始扫描code style扫描结果的展示方式/regex/要搜索内容的正则表达式search根据正则表达式对全局代码进行搜索在进行扫描时一般将扫描文件目录粘贴到第一栏中点击scan进行扫描那么这个scan就是执行扫描的开始点点击scan按钮会调用js/script.js中的scan方法进行扫描该方法将会获取在主界面中获取的参数并通过XMLHttpRequest方法传递给rips主目录下的main.php中进行处理。在main.php中主要执行一些赋值的操作及调用scanner.php进行具体的扫描下面的代码便是其调用scanner.php的相关代码。// scan$scan new Scanner($file_scanning, $scan_functions, $info_functions, $source_functions);$scan-parse();$scanned_files[$file_scanning] $scan-inc_map;其赋值对象主要是$file_scanning, $scan_functions, $info_functions, $source_functions这四个对象四个对象的含义如下所示$file_scanning表示要扫描的php文件如果扫描的对象是一个文件那么该参数就代表这个对象本身如果扫描对象是一个目录RIPS将会对目录中的文件进行逐个扫描该对象就代表目录中的每个文件。$scan_functionssink点会触发漏洞的函数名称的列表根据选择的vuln type通过config/sinks.php进行构造。$info_functions设备信息根据扫描文件中使用的函数特征值确定通过config/info.php进行构造。$source_functionssource点可控制的输入点通过config/sources.php进行构造。scanner的扫描可以把它大致分为两步第一步是初始化Scanner对象第二步则是最关键的漏洞扫描通过parse()方法进行。2、代码扫描2.1 初始化Scanner对象此处主要通过__construct方法执行一些初始化操作对其中一些关键代码进行说明function __construct($file_name, $scan_functions, $info_functions, $source_functions){$this-file_name $file_name;$this-scan_functions $scan_functions;$this-info_functions $info_functions;$this-source_functions $source_functions;此处主要是将main.php中传递过来的文件赋值给类变量这几个变量是初始化后面一些类变量的基础。下面将是初始化的关键步骤为方便说明将在代码中直接进行注释说明$this-inc_file_stack array(realpath($this-file_name));                           // 待扫描文件的真实地址存入数组中$this-inc_map array();$this-include_paths Analyzer::get_ini_paths(ini_get(include_path));   // 文件所包含的路径单个结果一般为Array( [0] .  [1]  )即文件的自身路径$this-file_pointer end($this-inc_file_stack);                                          // 文件地址数组中最后的元素值为文件自身真实路径if(!isset($GLOBALS[file_sinks_count][$this-file_pointer]))$GLOBALS[file_sinks_count][$this-file_pointer] 0;                              // 初始化该文件sink点统计数目$this-lines_stack array();$this-lines_stack[] file($this-file_name);                                             // 读取待扫描文件内容存储到一个数组中$this-lines_pointer end($this-lines_stack);                                        // 由于文件内容存储在数组的第一个元素中且数组长度为1此处代表将文件内容逐行存储在一个数组中$this-tif 0; // tokennr in file$this-tif_stack array();// preload outputecho $GLOBALS[fit] . | . $GLOBALS[file_amount] . | . $this-file_pointer . (tokenizing)| . $GLOBALS[timeleft] . | . \n;ob_flush();flush();// tokenizing$tokenizer new Tokenizer($this-file_pointer);$this-tokens $tokenizer-tokenize(implode(,$this-lines_pointer));unset($tokenizer);                                                                                     // 上面几行是整个分析的关键将在下面进行详细的说明// add auto includes from php.iniif(ini_get(auto_prepend_file)) { $this-add_auto_include(ini_get(auto_prepend_file), true);}if(ini_get(auto_append_file)) { $this-add_auto_include(ini_get(auto_append_file), false);}// 校验php配置文件(php.ini)中是否存在自动包含的文件如果存在将直接添加到$this-tokens的类变量中此处将粗略说明$this-tokens类变量的生成该变量的生成主要调用lib/tokenizer.php中的方法下面是其关键代码public function tokenize($code) {$this-tokens token_get_all($code);$this-prepare_tokens();$this-array_reconstruct_tokens();$this-fix_tokens();$this-fix_ternary();#die(print_r($this-tokens));return $this-tokens;}通过调用ZEND引擎的token_get_all方法将PHP源码分解成PHP tokens(参考http://php.net/manual/en/function.token-get-all.php)并对这些tokens进行相关处理优化处理优化的过程没有进行仔细的研究此处不做详细介绍。为了让大家对ZEND引擎生成的tokens有个更直观的认识这是将使用一个简单的例子分别展示源码、token_get_all生成的原始tokens、处理后的tokens通过后面的对比可以粗略的看出处理后的tokens比原始生成的tokens更加简洁去除了一些对于风险扫描无用的tokens如?php 、?、空字节等。如下所示源码?php  echo $_GET(info); ?原始tokensArray([0] Array([0] 374[1] ?php [2] 1)[1] Array([0] 317[1] echo[2] 2)[2] Array([0] 377[1] [2] 2)[3] Array([0] 310[1] $_GET[2] 2)[4] ([5] Array([0] 316[1] info[2] 2)[6] )[7] ;[8] Array([0] 377[1] [2] 2)[9] Array([0] 376[1] ?[2] 3))处理后的tokensArray([0] Array([0] 317[1] echo[2] 2)[1] Array([0] 310[1] $_GET[2] 2)[2] ([3] Array([0] 316[1] info[2] 2)[4] )[5] ;[6] ;)2.2 parse扫描获取了需要扫描的PHP tokens下一步就是进行最关键的风险扫描了风险扫描主体函数在lib/scanner.php文件中的parse()方法。该方法中会遍历2.1中生成的tokens对tokens进行逐个扫描根据每个token是否为数组(is_array)分别进行操作由于整体代码比较庞杂此处挑选处理上的几个关键点并结合实际的代码对其扫描的方式进行探究。下面先展示本次测试使用的源码主要包含两个文件commond_exec.php与para.php两个文件源码如下所示commond_exec.phpinclude(para.php);$str command;$command para($str);shell_exec( $command );?para.phpfunction para($str){return $_GET($str);}?扫描的目标文件是commond_exec.php此时其生成的tokens如下所示Array([0] Array([0] 262[1] include[2] 2)[1] ([2] Array([0] 318[1] para.php[2] 2)[3] )[4] ;[5] Array([0] 312[1] $str[2] 4)[6] [7] Array([0] 318[1] command[2] 4)[8] ;[9] Array([0] 312[1] $command[2] 5)[10] [11] Array([0] 310[1] para[2] 5)[12] ([13] Array([0] 312[1] $str[2] 5)[14] )[15] ;[16] Array([0] 310[1] shell_exec[2] 6)[17] ([18] Array([0] 312[1] $command[2] 6)[19] )[20] ;[21] ;)对tokens进行遍历时如果该token的类型是数组那么分别获取该数组中的每个值如下所示$token_name $this-tokens[$i][0];     // 该token的名称相当于变量名称$token_value $this-tokens[$i][1];    // 该token的值相当于变量的值$line_nr $this-tokens[$i][2];            // token出现在源码的第几行2.2.1 文件包含处理对token进行逐个扫描时第一个出现的token就是便是include函数RIPS遇到这个函数时会根据文件包含出现的位置获取被包含文件的tokens插入到原tokens语句的后面其具体的操作代码如下所示$tokenizer new Tokenizer($try_file);$inc_tokens $tokenizer-tokenize(implode(,$inc_lines));unset($tokenizer);// if(include(file)) { - include tokens after { and not into the condition :Sif($this-in_condition){$this-tokens array_merge(array_slice($this-tokens, 0, $this-in_condition1), // before include in condition$inc_tokens, // included tokensarray(array(T_INCLUDE_END, 0, 1)), // extra END-identifierarray_slice($this-tokens, $this-in_condition1) // after condition);} else{// insert included tokens in current tokenlist and mark end$this-tokens array_merge(array_slice($this-tokens, 0, $i$skip), // before include$inc_tokens, // included tokensarray(array(T_INCLUDE_END, 0, 1)), // extra END-identifierarray_slice($this-tokens, $i$skip) // after include);}最后生成的包含include文件的tokens如下所示对比下会发现5-19的token是新添加的为被包含文件para.php的tokens。Array([0] Array([0] 262[1] include[2] 2)[1] ([2] Array([0] 318[1] para.php[2] 2)[3] )[4] ;[5] Array([0] 337[1] function[2] 2)[6] Array([0] 310[1] para[2] 2)[7] ([8] Array([0] 312[1] $str[2] 2)[9] )[10] {[11] Array([0] 339[1] return[2] 3)[12] Array([0] 312[1] $_GET[2] 3)[13] ([14] Array([0] 312[1] $str[2] 3)[15] )[16] ;[17] }[18] ;[19] Array([0] 380[1] 0[2] 1)[20] Array([0] 312[1] $str[2] 4)[21] [22] Array([0] 318[1] command[2] 4)[23] ;[24] Array([0] 312[1] $command[2] 5)[25] [26] Array([0] 310[1] para[2] 5)[27] ([28] Array([0] 312[1] $str[2] 5)[29] )[30] ;[31] Array([0] 310[1] shell_exec[2] 6)[32] ([33] Array([0] 312[1] $command[2] 6)[34] )[35] ;[36] ;)2.2.2 添加数据源(source点)当扫描到第11个token return时此时会判断返回的语句是否是用户可以控制的语句如果这条语句是用户能够控制的语句比如此处使用$_GET进行赋值表明是用户可以控制的语句也就是说para()方法的返回值是用户可以控制的那么该方法返回的数据将被认为是一个被污染的数据源即source点并将该方法添加到source_functions的数组中。对于return返回参数是否是用户可控制的判断主要是通过函数scan_parameter()实现的下面抽取几个关键点来了解判断流程的实现当遇到token为return的语句时会向后遍历token直到该语句结束代码的实现上是通过“;”是否出现进行判断如下所示while( $this-tokens[$i $c] ! ; )对于每个token判断该token是否是一个数组如果是一个数组则检查数组元素是否是一个变量如下所示if( is_array($this-tokens[$i $c]) ){if( $this-tokens[$i $c][0] T_VARIABLE )如果该token是一个数组且为变量则使用scan_parameter()函数对其进行检查该函数调用形式如下。该调用的参数比较多但是本例中实际起到判断作用的只有第三个参数即这个token本身$this-tokens[$i$c]具体的值为tokens[12]即$_GET函数。$new_find new VulnTreeNode();$userinput $this-scan_parameter($new_find,$new_find,$this-tokens[$i$c],$this-tokens[$i$c][3],$i$c,$this-var_declares_local,$this-var_declares_global,false,$GLOBALS[F_SECURES_ALL],TRUE);由于$_GET函数为定义的source函数因此将直接认为返回值是用户可输入的即$userinputtrue。最后将此函数名添加到source_functions列中以后的扫描该函数将作为source点看待。if($userinput 1 || $GLOBALS[userfunction_taints]){$this-source_functions[] $this-function_obj-name;}2.2.3 添加风险点(sink点)此处实际是RIPS的一个误报RIPS将$_GET()作为可变函数名对待如果函数名可变那么就可以将该函数名赋值为eval从而造成代码执行的漏洞sink点的添加也是在scan_parameter()中进行。由于此处是$_GET()显然此函数包含在source函数中因此使用scan_parameter()函数其返回值肯定为true那么在函数内部将会触发如下代码块的执行。if($this-in_function !$return_scan){$this-addtriggerfunction($mainparent);}触发后主要执行的函数是addtriggerfunction()该函数的作用主要是向$GLOBALS变量中添加该函数。$GLOBALS[user_functions][$this-file_name][$this-function_obj-name][0][0] 0;// no securings$GLOBALS[user_functions][$this-file_name][$this-function_obj-name][1] array();// doesnt matter if called with userinput or not$GLOBALS[user_functions][$this-file_name][$this-function_obj-name][3] true;最后在包含文件扫描结束时即token}此处是第17个token将被全局变量合并到scan_functions中即添加到sink点。if(isset($GLOBALS[user_functions][$this-file_name])){$this-scan_functions array_merge($this-scan_functions, $GLOBALS[user_functions][$this-file_name]);}2.2.4 命令执行(shell_exec)漏洞这个漏洞是本代码中实际包含的一个漏洞在上面各种准备工作完成后来看一下这个实际漏洞的扫描流程当token为shell_exec时由于该函数是一个危险函数即包含在sink点那么分析将直接跳转到TAINT ANALYSIS中进行。同2.2.2类似会跳转到scan_parameter()函数中对函数的参数进行分析确定该参数是否是用户可控制的即包含在source点内。该函数的参数是变量$command该参数是一个自定义变量RIPS对于自定义变量会进行自动扫描并通过函数variable_add()添加到var_declares_local、var_declares_global两个变量中的一个。下面先对variable_add()函数进行简单介绍当遍历到tokens[24]$command的赋值操作时会触发该函数的执行。该函数调用形式如下其中比较关键的是第二个参数调用Analyzer::getBraceEnd()静态方法获取该变量声明的所有token此处$command的token的序列号为24-30将这些tokens存储到一个数组中最后将该变量的相关信息存入var_declares_global数组中。这样就完成了对一个文件中的全局遍历的发现及存储。$this-variable_add($token_value,array_slice($this-tokens, $i-$c, $cAnalyzer::getBraceEnd($this-tokens, $i)),,0, 0,$line_nr,$i,isset($this-tokens[$i][3]) ? $this-tokens[$i][3] : array());由于存储了该变量的tokens信息那么对于自定义变量的分析就转变成了对该变量的tokens的分析遍历该变量的tokens如果该token来自用户可控制的输入即sorce点数据源那么表明自定义变量的也是可控的此处的source点就是自添加的函数para()这样就存在一个用户可控制的数据源(source)流向危险函数(sink)形成了一个漏洞触发的完整路径。for($i$var_declare-tokenscanstart; $itokenscanstop; $i){ ...else if( in_array($tokens[$i][1], $this-source_functions) ){$userinput true;$var_trace-marker 4;$mainparent-title Userinput returned by function .$tokens[$i][1].() reaches sensitive sink.;3、结语上面对于RIPS的源码进行了简单的分析从中可以看出其工作的流程大致为遍历token发现sink点然后对sink点的参数使用scan_parameter进行后向追踪如果这个参数是用户可控制的参数及包含在source点中那么就存在一条从source到sink的联通路径及存在一条漏洞触发的路径则认为是一个风险点。* 本文作者nightmarelee转载请注明来自FreeBuf.COM
http://wiki.neutronadmin.com/news/359248/

相关文章:

  • php做网站优势引擎搜索下载
  • 建网站一般最低多少钱做网站的费用记哪个会计科目
  • 个人网站制作流程企业网上年检在网站怎么做
  • 软件网站开发公司名字网站制作app软件
  • 惠州禅城网站建设网页视觉设计流程
  • 微信个人商城网站模板免费下载厦门网站建设高级课程
  • 做电影网站怎么样网站怎么做伪静态
  • 哈尔滨网站制作哪儿好薇阿里云服务器租用价格表
  • win10建设网站公司建设网站请示
  • 网站建设 cms 下载seo关键词怎么选
  • 响应式网站建设福州wordpress注释
  • 用asp做网站出现空白小说网站开发环境那个号
  • 固始县网站建设培训电商平台的发展
  • 网站修改需要什么做百度微信小程序都有哪些网站
  • 在茂名哪里可以做网站网站建设服务器有哪些
  • 网站建设与网页设计百度文库pc建站 手机网站
  • 吴江市中云建设监理有限公司网站WordPress允许修改评论内容
  • cpu占用超出网站空间的分配值中国50大电商排名
  • 深圳网站设计模板泰州专业网站建设公司
  • 响应式网站新闻部分怎么做站长之家域名查询官网
  • 建设网站开发wap网站 区别
  • 网站建设企业战略百度seo优化分析
  • 郑州建设网站建站专业做图片制作网站
  • 杭州住房和城乡建设局网站帮做暑假作业网站
  • 子域名做微信开放平台网站应用wordpress插件 网站跳转
  • 网站到首页排名昆明城乡建设网站
  • 网站建设与推广实训报告册有哪些做外贸的网站
  • 民宿设计网站大全贵州省领导班子名单一览表
  • 网站开发的工作职责小程序代理加盟前景
  • 建网站要多少钱一个月免费手机h5模板网站模板下载