打开环境发现有个菜单,点进去看一下
转到payflag页面,发现让
需要你的100000000美元,如果你想购买FLAG:你一定是CUIT的学生!!!!!!,一定要正确输入密码!!!
之前做过一道类似的是用bp抓包修改请求,这个应该也是
查看源代码发现
<!--
~~~post money and password~~~
if (isset($_POST['password'])) {
$password = $_POST['password'];
if (is_numeric($password)) {
echo "password can't be number</br>";
}elseif ($password == 404) {
echo "Password Right!</br>";
}
}
-->
两个通过POST方式传参的参数password和money
isset函数判断参数是否存在以及值是否为空,存在及不为空则返回TRUE
is_numeric() 函数用于检测变量是否为数字或数字字符串;
如果是数字或者是数字字符串就会输出"password can’t be number"
如果password是404则密码就是正确的。
想要满足第一个简单,让password成为普通字符串就可以,404a、404b、404c、404%10、404,%20、404%30等等
在 PHP 中,==
是弱类型比较(松散比较)运算符,它在比较两个值时会发生类型转换(Type Juggling),可能导致一些非直观的结果。以下是关键点:
==
的特点
-
自动类型转换:比较前会尝试将两边的值转为相同类型再比较。
var_dump(0 == "0"); // true(字符串 "0" 转为数字 0) var_dump(false == "0"); // true(字符串 "0" 转为布尔 false) var_dump(null == ""); // true(字符串 "" 转为 null)
-
常见陷阱:
var_dump("123abc" == 123); // true(字符串从左截取数字部分) var_dump(0 == "abc"); // true(字符串 "abc" 转为数字 0) var_dump([] == false); // true(空数组转为布尔 false)
-
与
===
的对比:-
===
(严格比较)要求值和类型都相同:var_dump(0 === "0"); // false(数字 vs 字符串) var_dump(false === 0); // false(布尔 vs 数
-
所以404a、404b、404c、404%10、404,%20、404%30也能通过第二个
post传参并抓包
修改数据包
user是用户,0通常代表flase(错误),1通常代表true(正确)
发现报错Nember lenth is too long你的数字太长了
修改money为1e9,使用科学计数法绕过
得到flag
看大佬其他方法:
经过给money参数分情况测试,有3种输出结果
当 money => 100000000
输出"Nember lenth is too long"
当 money < 100000000
输出"you have not enough money,loser"
当 1e9 <= money <= 1e999999(说着当money变为数组时)
输出"flag值"
猜测用到了函数strcmp()用来比较两个字符串,同时还可以比较两个字符串的字符数
strcmp(string1,string2)
0 - 如果两个字符串相等
<0 - 如果 string1 小于 string2
0 - 如果 string1 大于 string2
所以当过滤不当不全时,可以通过将参数变为数组的方式进行绕过,这样的话就无法比较,直接返回true
这里大胆猜测他的后台源码:
<?php
$flag=100000000;
$Flag='flag{0c531ed2-9c1e-479a-adcb-d975b1376ca6}'
if (isset($_POST['money'])) {
if (strcmp($_POST['money'],$flag) == 0)#比较money和flag的值和字符数,"=="PHP弱比较逻辑运算符
echo $Flag;
elseif(strcmp($_POST['money'],$flag) < 0)
print 'you have not enough money,loser';
else
print 'Nember lenth is too long';
}
?>
通过数组绕过money:
password=404a&mony[]=0