0x02 函数说明
1.is_numeric函数
检查是否为数字字符串,%00可绕过该函数
2.strrev函数
将数字/字符串反转
3.自定义is_palindrome_number函数
回文数字,正读倒读都一样
0x03 空白字符 CTF题解析
1.代码第1行:当传入payload:number=%00%0c191后,首先isset判断GET number参数是否存在,DEBUG:1.$GET:{number => "f191"},这里只做了一个简单判断,所以直接Bypass。
if(!isset($_GET['number'])){//判断number参数是否存在,1.$GET:{number => "f191"}
header("hint:26966dc52e85af40f59b4fe73d8c323a.txt"); //HTTP头显示hint 26966dc52e85af40f59b4fe73d8c323a.txt
die("have a fun!!"); //die — 等同于 exit()
}
2.代码第1行:foreach循环$_GET, $_POST值赋值给$global_var,DEBUG:2.$glonal_var:{number => f191}
代码第2行:将$global_var的值foreach循环赋值给$key => $value,DEBUG:3.$global_var:$key:"number" $value:"/f191"
代码第3行:trim去除首尾空白字符,DEBUG: 4.$value:"/f191"
代码第4行:is_string判断$value是否为字符串且与addslashes($value)相等,DEBUG: 4.$value:"/f191",这里由于被""包裹,所以是一个字符串,Bypass。
foreach([$_GET, $_POST] as $global_var) { //foreach 语法结构提供了遍历数组的简单方式,2.$glonal_var:{number => f191}
foreach($global_var as $key => $value) {//3.$global_var:$key:"number" $value:"/f191"
$value = trim($value); //trim — 去除字符串首尾处的空白字符(或者其他字符)
is_string($value) && $req[$key] = addslashes($value); // is_string — 检测变量是否是字符串,addslashes — 使用反斜线引用字符串,4.$value:"f191"
}
}
3.代码第1-6行:is_numeric检测变量是否为一个数字或者数字字符串,是数字就报错,而传入的的值为f191,不是数字,即而Bypass is_numeric函数,5.$_REQUEST: number f191
代码第7-12行:strval(intval)获取变量的整数字符串,需要不等于原值,不然就报错,而原值为f191,获取整数字符串值为0,故而不相等,Bypass,5.$_REQUEST: number f191
代码第16行:$value1使用intval获取number的整数字符串为191,6.$req{number => f191} $value1:191
代码第17行:$value2使用intval和strrev获取证书字符串的倒叙,同样也是191,7.$req{number => f191} $value2:191
代码第19-21行:判断$value1和$value2是否不相等,不相等报错。此时$value1和$value2均等于191,故而相等,Bypass。
代码第25-26行:is_palindrome_number自定义函数判断number的值是否为一个回文函数,是的话输出这个数是一个回文函数,不输出flag。而number的值为/f191,所以不为一个回文函数,Bypass此处判断,输出flag。8.$req: {number => f191}
if(is_numeric($_REQUEST['number'])) //is_numeric — 检测变量是否为数字或数字字符串 5.$_REQUEST: number f191
{
$info="sorry, you cann't input a number!";
}
elseif($req['number']!=strval(intval($req['number']))) //intval — 获取变量的整数值
{
$info = "number must be equal to it's integer!! ";
}
else
{
$value1 = intval($req["number"]);//6.$req{number => f191} $value1:191
$value2 = intval(strrev($req["number"]));//7.$req{number => f191} $value2:191
if($value1!=$value2){//8.$value1:191 $value2:191
$info="no, this is not a palindrome number!";
}
else
{
if(is_palindrome_number($req["number"])){//9..$req: {number => f191}
$info = "nice! {$value1} is a palindrome number!";
}
else
{
$info=$flag;//14.输出flag xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
}
}
}
原文始发于微信公众号(鲲哥的Bypass之旅):奇淫巧计 空白字符绕过
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论