代码审计知识储备

一. 漏洞挖掘

1.1危险的来源数据
显示输入:所有提交的变量都被php保存在了一些数组里,PHP中可由用户用户输入的变量列表如下:

  • $_SERVER –服务器和执行环境(是一个包含了诸如头信息,路径,以及脚本位置等等信息的数组
  • $_FIES-HTTP文件上传变量
  • $_ENV-环境变量(通过环境方式传递给当前脚本的变量数组)
    getenv-获取一个环境变量 string getenv(string $varname)
    在 php 的设置里有这么个选项register_globals,当这个选项为 on 的时候,上面出现的那些变量都会成为$GLOBALS 中的一员,在脚本中都不需要再取得就可以直接使用,并且以variables_order的顺序覆盖。
  • $GLOBALS-引用全局作用域中可用的全部变量(一个包含了全部变量的全局组合数组。变量的名字就是数组的键。

很多程序考虑到了register_globals=off的情况,于是在程序化的时候使用如下代码:

@extract(daddslashes($_POST));
@extract(daddslashes($_GET));
  • extract-从数组中将变量导入到当前的符号表中

注释:把数组内容导入到符合表,比如$_COOLIE[“123”],那么经过他的非法字符过滤后,extract函数后变为$a=”123 ”这样子的模式。
daddslashes()-是addslashes()函数的加强版,可以对数组里面的每一个元素添加反斜杠

这些代码起到了register_globals的作用,作用是将post和GET的内容释放出去做全局变量,但是危险可能更大。

二.隐式输入

  • 用户传递的数据->数据库->程序代码处理->程序代码

这个模式的意思就是用户输入的可能先进入了数据库,然后程序从数据库再取得这个输入送入某些危险的函数执行。

与存储在数据库中类似的情况是,一些程序把用户的输入放入文件夹中,如缓冲文件,然后在必要的时候从里面取得,如果太过于相信这些地方的变量,这样还是导致问题的。

三. 变量覆盖

####常见的变量覆盖

  • 1.extract()-从数组中将变量导入到当前的符号表中

    Int extract(array &$var_array[,int$extract_type= EXTR_OVERWRITE [, string $prefix = NULL]] )

本函数用来将变量从数组中导入到当前的符号表中。检查每一个键名看是否可以作为一个合法的变量名,同时检查和符号表中已有的变量名的冲突。
$var_array一个关联数组。此函数将键名当作变量名,值作为变量的值
$extract_type:对待非法/数字和冲突的键名的方法将根据extract_type的参数决定

  • 2.parse_str()-将字符串解析成多个变量
    void parse_str ( string $str [, array &$arr ] )
    如果str是URL传递的查询字符串(query string),则将它解析为变量并设置到当前作用域。 参数:str 输入的字符串 arr:若设置了第二个变量arr,变量将会以数组元素的形式存入到这个数组,作为代替
------*** end*** ------