0x01 and和&&运算符
and的优先级 小于 = 小于 \&\&
-
and如果是要赋值给变量,那就会先把and前面的逻辑结果赋值给变量,再进行逻辑运算,例如:
$a=1 and 0;
则a为True -
\&\&则是先运算再赋值,例如:
$a=1 && 0;
则a为False
0x02 $args和$$args
- $args为取变量的值
- $$args:变量args的值正好是另一个变量的名字,那么相当于取另一个变量的名字,例如:
$a='b'; $b='hello'; echo $$a; // 输出结果为hello
当服务器代码存在php的九大全局变量时都可以试一试,用$args进行变量覆盖:
- $_POST 用于接收POST提交的数据
- $_GET 用于获取URL地址栏的参数数据
- $_FILES 用于文件就收的处理img,最常见
- $_COOKIE 用于获取与setCookie()中的name 值
- $_SESSION 用于存储session的值或获取session中的值
- $_REQUEST 具有get,post的功能,但比较慢
- $_SERVER 是预定义服务器变量的一种
- $GLOBALS 一个包含了全部变量的全局组合数组
- $_ENV 是一个包含服务器端环境变量的数组。它是PHP中一个超级全局变量,可以在PHP 程序的任何地方直接访问它
0x03 弱等于号“==”
有弱等于,对应就有强等于“===”。
- false==””==0==NULL //true
- “admin1”==0); //true
- “1admin”==1); //true
- “0e123456”==”0e4456789” //true
- “0x1e240”==”123456” //true
- 0==”0e4456789” //true
- [false]==[0] //true
- “0x1e240”==”123456”==123456 //true
0x04 类型转换
- md5([‘a’])===md5([‘b’]) 对数组md5会返回NULL
- strcmp([], ‘a’)===NULL PHP>5.3版本数组和字符串比较会返回NULL
- in_array(‘abc’,[0])===true ‘abc’会被强制类型转换
- is_numeric(‘0e1’)===true 科学计数法
- in_array(‘abc’,[0,1,2])===true in_array函数比较时会使用弱等于(’abc’==0)
0x05 正则表达式(ereg/eregi)
- 字符串对比解析,当ereg读取字符串string时,%00后面的字符串不会被解析。这里a=abcd%001234,可以绕过。
- 如果传入数组,ereg返回NULL
0x06 变量覆盖
1. 变量覆盖漏洞产生
- 变量如果未初始化,且能被用户所控制。
- 在php中,若register_globals为on时尤其严重,此为全局变量覆盖漏洞。
- 当register_global=ON时,变量来源可能是各个不同的地方,比如页面的表单、cookie等。
2. 变量覆盖漏洞相关函数
-
extract()函数从数组中把变量导入到当前的符号表中。对于数组中的每个元素,键名用于变量名,键值用于变量值。
-
parse_str()的作用是解析字符串,并注册成变量。与parse_str()类似的函数还有mb_parse_str(),parse_str()将字符串解析成多个变量,如果参数str是URL传递入的查询字符串(query string),则将它解析为变量并设置到当前作用域。如:
parse_str($_SERVER["QUERY_STRING"]);
-
$$会把变量本身的key当做名字,value当做变量值。如:$key=”_CONFIG”,那么$$key就相当于$_CONFIG。
<?php $a = '0'; extract($_GET); if($a==1){ echo "success"; }else{ echo "failed"; } ?>
访问http://127.0.0.1/xx.php?a=1,显示success表示完成变量覆盖。