CTF中常出现的PHP函数

文章部分内容来源于网络

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...');
}
?>