ISCCweb1

 32 && $value[$i] < 127) unset($value);
    else $username .= chr($value[$i]);
    if ($username == 'w3lc0me_To_ISCC2019' && intval($password) < 2333 && intval($password + 1) > 2333) {
        echo 'Hello '.$username.'!', '
', PHP_EOL; echo $flag, '
'; } } highlight_file(__FILE__);

他要求传入一个字符串 和密码,从第一个字符串到最后一个,如果值大于32并且小于127则被删除,否则进行chr(),chr()会先对256取模,然后再转换成字符,所以我们传的ASCII码要加上256。然后要 u s e r n a m e = = ′ w 3 l c 0 m e T o I S C C 201 9 ′ 。 用 A S C I I 一 次 对 照 就 行 还 要 求 i n t v a l ( username=='w3lc0me_To_ISCC2019'。用ASCII一次对照就行 还要求intval( username==w3lc0meToISCC2019ASCIIintvalpassword)<2333&&intval($password+1)>2333
就涉及到一个:
对于 password 的判断,想起了 intval 的缺陷,只处理能处理的字符,比如对于 intval(‘0x01’),执行之后返回 0,但要是 intval(‘0x01’ + 1) 呢?PHP 会先将 ‘0x01’ 视作十六进制数与 1 相加,再丢给 intval 处理,那么结果就是 2,可以用下面的代码进行测试。


所以我们输出:

/?password=0xaaaa&value[]=375&value[]=307&value[]=364&value[]=355&value[]=304&value[]=365&value[]=357&value[]=351&value[]=340&value[]=367&value[]=351&value[]=329&value[]=339&value[]=323&value[]=323&value[]=306&value[]=304&value[]=305&value[]=313

我们试试0x91d


当值是get或者post输入的时候,默认为字符串,而不是数字,所以他是字符串转数字,所以报错了输出为0,变成intval(‘0xaaaa’+1)时,会将0xaaaa转换成十六进制再进行+1

你可能感兴趣的:(web类)