实验吧 你真的会PHP吗?
这道题我一开始进去就是懵逼的,这怎么做,就一句话“have fun!!”,一点思路都没有。那就尝试找一下思路吧
日常操作,右键查看网页源代码,没有发现什么特殊的,也是一个普通的一句话。那就抓包试试,发现了抓包中的hint中,出现了.txt后缀的文件,曾经是隐写选手的我看到这个txt,就引起了我的高度重视,我想着怎么才能看到这个 txt呢?
emmmmm我思考了很久,但是始终没有看到,于是恬不知耻的去问了学长:
学长告诉我,把url后面的index.php换成文件名称就能访问了…(原来这么简单…)
然后,我访问了这个页面,得到了以下代码
<?php
$info = "";
$req = [];
$flag="xxxxxxxxxx";
i
1. List item
ni_set("display_error", false);
error_reporting(0);
if(!isset($_POST['number'])){
header("hint:6c525af4059b4fe7d8c33a.txt");
die("have a fun!!");
}
foreach([$_POST] as $global_var) {
foreach($global_var as $key => $value) {
$value = trim($value);
is_string($value) && $req[$key] = addslashes($value);
}
}
function is_palindrome_number($number) {
$number = strval($number);
$i = 0;
$j = strlen($number) - 1;
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!";
}elseif($req['number']!=strval(intval($req['number']))){
$info = "number must be equal to it's integer!! ";
}else{
$value1 = intval($req["number"]);
$value2 = intval(strrev($req["number"]));
if($value1!=$value2){
$info="no, this is not a palindrome number!";
}else{
if(is_palindrome_number($req["number"])){
$info = "nice! {$value1} is a palindrome number!";
}else{
$info=$flag;
}
}
}
echo $info;
trim(str):去除str字符串两端的空格
addslashes(str):在str中的预定义字符前加上反斜杠,预定义字符有:单引号(’)、双引号(")、反斜杠(\)、NULL
strval()/intval():将值转换为字符串/整型
strrev():反转字符串,比如将abc转为cba
总结一下这里要获取flag的要求:
1.以POST方式传入number的值
2.number的值为字符串且不能是纯数字的字符串
3.number的值=strval(intval($req[‘number’]))
4.number整型化的值要与反转后的number整型化的值要相等
5.number的值不能是回文形式
绕过:
2,3 冲突,为字符串还不能是纯数字的,但是3中又说了要相等,这一条可以用空字符绕过%00.
4,5冲突,回文数的形式就是翻转相等,这里有两种绕过方式:
最大数绕过,Intval的在32位系统中的最大的位数就是2147483647,但是2147483647翻转之后的数值不是回文数,而且被固定是
2147483647
还有一种方式就是掺杂了科学技术法,因为有字符串,所以也不会是回文数。
所以,我们构造字符串来绕过:
number=0e00%00
就能获得flag了。