[极客大挑战 2019]BuyFlag 1

打开环境发现有个菜单,点进去看一下

转到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),可能导致一些非直观的结果。以下是关键点


== 的特点

  1. 自动类型转换:比较前会尝试将两边的值转为相同类型再比较。

    var_dump(0 == "0");      // true(字符串 "0" 转为数字 0)
    var_dump(false == "0");  // true(字符串 "0" 转为布尔 false)
    var_dump(null == "");    // true(字符串 "" 转为 null)
  2. 常见陷阱

    var_dump("123abc" == 123);  // true(字符串从左截取数字部分)
    var_dump(0 == "abc");       // true(字符串 "abc" 转为数字 0)
    var_dump([] == false);      // true(空数组转为布尔 false)
  3. 与 === 的对比

    • ===(严格比较)要求值和类型都相同:

      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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值