CTF中常出现的PHP函数
2019-01-28 20:26:16
文章部分内容来源于网络
strcmp
strcmp(a1,a2)函数用来比较两个字符串是否相等的,比较的是对应字符的ascii码,如果相等返回0,当a1的ascii大于a2的返回小于0,a1的ascii码小于a2的,返回大于0.
但是这个函数是存在漏洞的,我们知道这个函数是用来比较字符串的,但是当我们传入为数组是,那变成字符串和数组进行比较了,因此php在5.2之前,默认返回的-1,5.2版本之后返回0.因此有时我们便可以利用这个漏洞
demo:
<?php
error_reporting();
$flag=$_GET['flag'];
if(strcmp('Waldo_cuit',$flag)){
echo 'NO!';
}
else{
echo 'YES!';
}
?>
ereg
ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE
字符串对比解析,这里如果$_GET[‘password’]为数组,则返回值为NULL
,如果为123 || asd || 12as || 123%00&&&**,则返回值为true
is_numeric
demo:
<?php
echo is_numeric(233333); # 1
echo is_numeric('233333');# 1
echo is_numeric(0x233333);# 1
echo is_numeric('0x233333'); # 1
echo is_numeric('233333abc'); # 0
?>
Intval
获取变量的整数值,允许以使用特定的进制返回。默认10进制
注:如果参数为整数,则不做任何处理。
我们可以构造字符串绕过:
当取回字符串整数的时候,如果字符串中含有非数字的字符,将会返回第一次出现非数字符的前面的整数。若果没有数字返回0
parse_str
与 parse_str() 类似的函数还有 mb_parse_str(),parse_str 将字符串解析成多个变量,如果参数str是URL传递入的查询字符串(query string),则将它解析为变量并设置到当前作用域。
//var.php?var=new
$var='init';
parse_str($_SERVER['QUERY_STRING']);
print $var;
MD5
PHP在处理哈希字符串时,会利用”!=”或”==”来对哈希值进行比较,它把每一个以”0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以”0E”开头的,那么PHP将会认为他们相同,都是0
常见字符串:
QNKCDZO
240610708
s878926199a
s155964671a
s214587387a
s214587387a
sha1(str)
sha1('aaroZmOk')
sha1('aaK1STfY')
sha1('aaO8zKZF')
sha1('aa3OFF9m')
同时MD5不能处理数组,有以下判断可用数组绕过:
if(@md5($_GET['a']) == @md5($_GET['b']))
{
echo "yes";
}
preg_match
如果在进行正则表达式匹配的时候,没有限制字符串的开始和结束(^ 和 $),则可以存在绕过的问题
<?php
$ip = '1.1.1.1 abcd'; // 可以绕过
if(!preg_match("/(\d+)\.(\d+)\.(\d+)\.(\d+)/",$ip)) {
die('error');
} else {
echo('key...');
}
?>