ApachePHP/5.4.45strpos()

0x01 源码

  1. <?php
  2. include("flag.php");
  3. highlight_file(__FILE__);
  4. if(isset($_GET['num'])){
  5. $num = $_GET['num'];
  6. if($num==4476){
  7. die("no no no!");
  8. }
  9. if(preg_match("/[a-z]|\./i", $num)){
  10. die("no no no!!");
  11. }
  12. if(!strpos($num, "0")){
  13. die("no no no!!!");
  14. }
  15. if(intval($num,0)===4476){
  16. echo $flag;
  17. }
  18. }

换成弱比较了,并且屏蔽了小数点和字母,可以考虑使用八进制前加空格或者+号。传入?num=+010574,strpos匹配0的位置为1,加上!返回0。

0x02 Payload

  1. ?num= 010574
  2. ?num=+010574

0x03 PHP函数

1. strpos

strpos — 查找字符串首次出现的位置

  1. strpos ( string $haystack , mixed $needle [, int $offset = 0 ] ) : int

返回 needle 在 haystack 中首次出现的数字位置。

参数

haystack
在该字符串中进行查找。
needle
如果 needle 不是一个字符串,那么它将被转换为整型并被视为字符的顺序值。
offset
如果提供了此参数,搜索会从字符串该字符数的起始位置开始统计。 如果是负数,搜索会从字符串结尾指定字符数开始。

返回值

返回 needle 存在于 haystack 字符串起始的位置(独立于 offset)。同时注意字符串位置是从0开始,而不是从1开始的。
如果没找到 needle,将返回 FALSE