实验吧 你真的会php吗,实验吧-web-你真的会PHP吗?

打开之后说have a fun

48cf51efa544be095d7fe3528698f6da.png

图片.png

没什么收获,那就抓包来看看吧

发送到repeater里面看看

2ff1630247f2ae82fa4a00a127632b8a.png

图片.png

根据Response反馈的信息,我们可以看见 hint:6c525af4059b4fe7d8c33a.txt

打开后发现如下代码, 代码审计走一波。

$info = "";

$req = [];

$flag="xxxxxxxxxx";

ini_set("display_error", false);

error_reporting(0);

if(!isset($_POST['number'])){ //注意这里post请求 1.不能为空

header("hint:6c525af4059b4fe7d8c33a.txt"); //文件头添加hint提示。

die("have a fun!!"); //die() 函数输出一条消息,并退出当前脚本。

}

foreach([$_POST] as $global_var) { //遍历数组

foreach($global_var as $key => $value) {

$value = trim($value); //trim() 函数移除字符串两侧的空白字符或其他预定义字符。

is_string($value) && $req[$key] = addslashes($value);

}

}

function is_palindrome_number($number) {

$number = strval($number); //本函数可将数组及类之外的变量类型转换成字符串类型。

$i = 0;

$j = strlen($number) - 1;//strlen() 函数返回字符串的长度

while($i < $j) {

if($number[$i] !== $number[$j]) {

return false;

}

$i++;

$j--;

}

return true;

}

if(is_numeric($_REQUEST['number'])){ //判断是否为数值型

$info="sorry, you cann't input a number!";//条件1:输入的不能只是数字

}elseif($req['number']!=strval(intval($req['number']))){

$info = "number must be equal to it's integer!! ";//条件2:输入的值经过变整型又变成字符型后应该与原来一样

}else{

$value1 = intval($req["number"]);

$value2 = intval(strrev($req["number"])); //strrev() 函数反转字符串。

if($value1!=$value2){//条件3:输入的值直接变成整型应该和其颠倒之后再变成整型一样

$info="no, this is not a palindrome number!";

}else{

//判断回文数

if(is_palindrome_number($req["number"])){//条件4:输入的不能是回文,就是颠倒和原来不能一样

$info = "nice! {$value1} is a palindrome number!";

}else{

$info=$flag;

}

}

}

echo $info;

如果要拿flag,需要满足以下条件:

1. number不为空,且不能是一个数值型数字,包括小数。(由is_numeric函数判断)

2. 输入的值经过变整型又变字符型后应该与原来一样

3. 该数的反转的整数值应该和它本身的整数值相等。

4. 不能是一个回文数。(is_palindrome_number判断):

5. post传入number.

方法一利用intval溢出 < intval() 函数用于获取变量的整数值。>

intval最大的值取决于操作系统。 32 位系统最大带符号的 integer 范围是 -2147483648 到 2147483647

eg: intval(‘1000000000000’)会返回 2147483647

64 位系统上,最大带符号的 integer 值是 9223372036854775807。

9fdf54494b14f4a663fb3ef7bca0fe0f.png

图片.png

通过抓包信息我们知道服务器的操作系统是32位的,所以我们构造2147483647就可以同时满足2,3条件。

通过空字符可以绕过is_numeric的判断(如%00,%20),所以我们构造payload:

number=2147483647%00 和number=2147483647%20都可。

分析:

我们来看上面的payload是怎么绕过上面的条件的,

post的number中包含%00or%20空字符,在is_numeric判断时,会返回false(即不是数字)

$req[‘number‘]!=strval(intval($req[‘number‘]))

intval,strval会忽略掉我们的空字符%00与%20,所以这里也就绕过了

$value1 = intval($req["number"]);

$value2 = intval(strrev($req["number"]));

$value1=$value2

由于我们输入的number已经达到了intval的最大值,所以当执行strrev(反转)后,得到7463847412这个值,这个值经过intval转换为2147483647,所以这两个值相等了。

2147483647不是回文数

post传入number得到flag。

2dc40b045d986c5ff8232c3459241489.png

图片.png

c600bd6cfd49640a69131e5bd98f5eb2.png

图片.png

方法二科学记数法绕过

因为要求不能为回文数,但又要满足intval(req["number"])=intval(strrev(req["number"])

所以我们采用科学计数法构造payload为number=0e-0%00ornumber=0e00%00,这样的话我们就可以绕过。

一定要时-0或者00,才不会被判定为回文数

ec1f6f4f9a83ec31dac348e017f2dd54.png

图片.png

718e66701bfb2690a1f6d46c720ad1b4.png

图片.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值