CTF中PHP漏洞常见考点总结
系统变量
$_POST // 获取 post 数据,是一个字典
$_GET // 获取 get 数据,是一个字典
$_COOKIE // 获取 cookie
$_SESSION // 获取 session
$_FILE // 获取上传的文件
$_REQUEST // 获取 $_GET,$_POST,$_COOKIE 中的数据
错误控制运算符
PHP 支持一个错误控制运算符:@。当将其放置在一个PHP 表达式之前,该表达式可能产生的任何错误信息都被忽略掉。
变量默认值
当定义一个变量,如果没有设置值,默认为0
$_GET 和 $_POST
http://ctf4.shiyanbar.com/web/false.php?name[]=a&password[]=b
如果 GET 参数中设置 name[]=a,那么 $_GET['name'] = [a],php 会把 []=a 当成数组传入, $_GET 会自动对参数调用 urldecode。
$_POST同样存在此漏洞,提交的表单数据,user[]=admin,$_POST['user'] 得到的是['admin'] 是一个数组。
内置函数的松散性
strcmp
strcmp 函数的输出含义如下:
如果 str1 小于 str2 返回 < 0; 如果 str1 大于 str2 返回 > 0;
如果两者相等,返回 0。
5.2 中是将两个参数先转换成string类型。
5.3.3 以后,当比较数组和字符串的时候,返回是0。
5.5 中如果参数不是string类型,直接return了
$array=[1, 2, 3];
// 数组跟字符串比较会返回 0
//这里会输出 null,在某种意义上 null 也就是相当于 false,也就是判断为相等
var_dump(strcmp($array, 'abc'));
sha1 和 md5 函数
md5 和 sha1 无法处理数组,但是 php 没有抛出异常,直接返回 fasle
sha1([]) === false
md5([]) === false
弱类型
当一个整形和一个其他类型行比较的时候,会先把其他类型 intval 再比较
intval
intval() 在转换的时候,会从字符串的开始进行转换直到遇到一个非数字的字符。即使出现无法转换的字符串,intval() 不会报错而是返回 0。
var_dump(intval('2')) // 2
var_dump(intval('3abcd')) // 3
var_dump(intval('abcd')) // 0
这个时候 $a 的值有可能是 1002 union…
if(intval($a) > 1000) {
mysql_query("select * from news where id=".$a)
}
is_numeric
PHP提供了is_numeric函数,用来变量判断是否为数字。但是函数的范围比较广泛,不仅仅是十进制的数字。
in_array
in_array函数用来判断一个值是否在某一个数组列表里面,通常判断方式如下:
in_array('b', array('a', 'b', 'c');
这段代码的作用是过滤 GET 参数 typeid 在不在 1,2,3,4 这个数组里面。但是,in_array 函数存在自动类型转换。如果请求,typeid=1’ union select.. 也能通过 in_array 的验证。
if (in_array($_GET('typeid'], array(1, 2, 3, 4))) {
$sql="select …. where typeid=".$_GET['typeid']";
echo $sql;
}
== 和 ===
== 是弱类型的比较
=== 比较符则可以避免这种隐式转换,除了检查值还检查类型。
以下比较的结果都为 true
// 0x 开头会被当成16进制54975581388的16进制为 0xccccccccc
// 十六进制与整数,被转换为同一进制比较
'0xccccccccc' == '54975581388'
// 字符串在与数字比较前会自动转换为数字,如果不能转换为数字会变成0
1 == '1'
1 == '01'
10 == '1e1'
100 == '1e2'
0 == 'a' // a 转换为数字为 0
// 十六进制数与带空格十六进制数,被转换为十六进制整数
'0xABCdef' == ' 0xABCdef'
'0010e2' == '1e3'
原创文章,作者: Admin ,转载请注明出处:https://secvery.com/3298.html