PHP中解析CTF特性函数有哪些技巧和长尾词应用?

2026-04-05 21:392阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1064个文字,预计阅读时间需要5分钟。

PHP中解析CTF特性函数有哪些技巧和长尾词应用?

目录+前言+`intval()`+`strpos()`+`sha1`+数组比较+强类型+`array_push()`+结语+前言+上篇文章为大家带来了PHP中最基本的特性,不知道大家学习的情况如何了。回顾上文,我们讲到了MD5加密、强碰撞以及正则匹配等内容。

目录
  • 前言
  • intval()
  • strpos()
  • sha1
    • 数组比较
    • 强类型
  • array_push()
    • 结语

      前言

      上篇文章给大家带来了PHP中最基本的特性,不知道大家学习的怎样了,回顾上文,我们讲了MD5强弱碰撞以及正则匹配的绕过,总体来看还是很简单的,下面给大家带来新的PHP特性讲解,会稍微比上一篇难一些。

      intval()

      上一篇在最后时简单介绍了一下这个函数,我们看看官方是怎样定义的:

      简单来说就是让输入的数字变成整数,下面我们举个例子:

      echo intval(1145.14); // 1145 echo intval('114514'); // 114514

      可以发现只对有小数点的数字起作用,正常的整数还是照常输出,那么它在CTF中是如何考察的呢,查看下面代码:

      if($num==="1145"){ die("no no no!"); } if(intval($num,0)===1145){ echo $flag; }

      要我们强类型传入的不能等于1145,但后面经过intval函数又要等于1145,这不和前面的矛盾了,我们要怎样做呢?

      这里介绍一下intval的特性,如果我们在函数里传入字符串,那么该函数就会返回不是数字的字符之前的数字,也就是说我们传入:

      sum=1145a

      intval就会判断我们传入的是1145,从而实现了绕过,还有另一种绕过方法:

      PHP中解析CTF特性函数有哪些技巧和长尾词应用?

      当base为0时,intval会自动进行进制转换,我们可以传入1145的十六进制形式来绕过。

      strpos()

      根据手册可以看到,该函数以及与其类似的函数,作用都是匹配第一个或者最后一个字符,根据该函数特性,题目会经常围绕它作为一个限制头部的点,比如上面那题可能会增加限制:

      if(!strpos($num, "0")){ die("no no no!");

      因为八进制开头通常为0,检测到的话就不能通过进制转换来绕过了。

      sha1

      p>该函数的利用以及绕过方法类似于MD5函数,都是运用了PHP特性来做,这里简单看一下:

      数组比较

      类似于MD5,在SHA1里我们也可以使用数组绕过,具体可以看下面例子:

      if(sha1($a)==sha1($b) && $a!=$b){ echo $flag; }

      可以看到,也是一个弱比较,根据PHP特性sha1函数无法对数组进行处理,,于是我们传入数组来使结果为NULL:

      a[]=1 b[]=2

      强类型

      与MD5相同,当然也存在强类型比较,我们不能用数组来进行绕过了:

      if(sha1($a)===sha1($b) && $a!=$b){ echo $flag; }

      这里同样有类似于MD5函数的解决方法:

      a=aaK1STf //0e7665852665575620768827115962402601 b=aaO8zKZF //0e89257456677279068558073954252716165

      array_push()

      可以理解为向数组尾部插入参数,我们看看是如何考察的:

      <?php highlight_file(__FILE__); $allow = array(); for ($i=36; $i < 0x36d; $i++) { array_push($allow, rand(1,$i)); } if(isset($_GET['n']) && in_array($_GET['n'], $allow)){ file_put_contents($_GET['n'], $_POST['content']); } ?>

      可以看到题目先向数组里插入随机数,in_array()是搜索数组中是否存在指定的值,根据它的语法:

      type会判断类型是否匹配,这就是我们利用的点,因为数组里数据为int型,根据PHP特性比较后字符串会转成int型,也就是说我们传入1.php也是没有问题的,后面有个写入文件操作,正好可以设置一句话木马连接后门,或者进行命令执行:

      get: n=1.php post: content=&lt;?=`tac f*`;

      结语

      今天这篇文章可能有的地方不是很好理解,但总体来说还是很简单的,PHP特性很多以至于只能挑出一些著名的来说,更多关于CTF PHP特性函数的资料请关注自由互联其它相关文章!

      本文共计1064个文字,预计阅读时间需要5分钟。

      PHP中解析CTF特性函数有哪些技巧和长尾词应用?

      目录+前言+`intval()`+`strpos()`+`sha1`+数组比较+强类型+`array_push()`+结语+前言+上篇文章为大家带来了PHP中最基本的特性,不知道大家学习的情况如何了。回顾上文,我们讲到了MD5加密、强碰撞以及正则匹配等内容。

      目录
      • 前言
      • intval()
      • strpos()
      • sha1
        • 数组比较
        • 强类型
      • array_push()
        • 结语

          前言

          上篇文章给大家带来了PHP中最基本的特性,不知道大家学习的怎样了,回顾上文,我们讲了MD5强弱碰撞以及正则匹配的绕过,总体来看还是很简单的,下面给大家带来新的PHP特性讲解,会稍微比上一篇难一些。

          intval()

          上一篇在最后时简单介绍了一下这个函数,我们看看官方是怎样定义的:

          简单来说就是让输入的数字变成整数,下面我们举个例子:

          echo intval(1145.14); // 1145 echo intval('114514'); // 114514

          可以发现只对有小数点的数字起作用,正常的整数还是照常输出,那么它在CTF中是如何考察的呢,查看下面代码:

          if($num==="1145"){ die("no no no!"); } if(intval($num,0)===1145){ echo $flag; }

          要我们强类型传入的不能等于1145,但后面经过intval函数又要等于1145,这不和前面的矛盾了,我们要怎样做呢?

          这里介绍一下intval的特性,如果我们在函数里传入字符串,那么该函数就会返回不是数字的字符之前的数字,也就是说我们传入:

          sum=1145a

          intval就会判断我们传入的是1145,从而实现了绕过,还有另一种绕过方法:

          PHP中解析CTF特性函数有哪些技巧和长尾词应用?

          当base为0时,intval会自动进行进制转换,我们可以传入1145的十六进制形式来绕过。

          strpos()

          根据手册可以看到,该函数以及与其类似的函数,作用都是匹配第一个或者最后一个字符,根据该函数特性,题目会经常围绕它作为一个限制头部的点,比如上面那题可能会增加限制:

          if(!strpos($num, "0")){ die("no no no!");

          因为八进制开头通常为0,检测到的话就不能通过进制转换来绕过了。

          sha1

          p>该函数的利用以及绕过方法类似于MD5函数,都是运用了PHP特性来做,这里简单看一下:

          数组比较

          类似于MD5,在SHA1里我们也可以使用数组绕过,具体可以看下面例子:

          if(sha1($a)==sha1($b) &amp;&amp; $a!=$b){ echo $flag; }

          可以看到,也是一个弱比较,根据PHP特性sha1函数无法对数组进行处理,,于是我们传入数组来使结果为NULL:

          a[]=1 b[]=2

          强类型

          与MD5相同,当然也存在强类型比较,我们不能用数组来进行绕过了:

          if(sha1($a)===sha1($b) &amp;&amp; $a!=$b){ echo $flag; }

          这里同样有类似于MD5函数的解决方法:

          a=aaK1STf //0e7665852665575620768827115962402601 b=aaO8zKZF //0e89257456677279068558073954252716165

          array_push()

          可以理解为向数组尾部插入参数,我们看看是如何考察的:

          <?php highlight_file(__FILE__); $allow = array(); for ($i=36; $i < 0x36d; $i++) { array_push($allow, rand(1,$i)); } if(isset($_GET['n']) && in_array($_GET['n'], $allow)){ file_put_contents($_GET['n'], $_POST['content']); } ?>

          可以看到题目先向数组里插入随机数,in_array()是搜索数组中是否存在指定的值,根据它的语法:

          type会判断类型是否匹配,这就是我们利用的点,因为数组里数据为int型,根据PHP特性比较后字符串会转成int型,也就是说我们传入1.php也是没有问题的,后面有个写入文件操作,正好可以设置一句话木马连接后门,或者进行命令执行:

          get: n=1.php post: content=&lt;?=`tac f*`;

          结语

          今天这篇文章可能有的地方不是很好理解,但总体来说还是很简单的,PHP特性很多以至于只能挑出一些著名的来说,更多关于CTF PHP特性函数的资料请关注自由互联其它相关文章!