封神台ctf练习靶场——一月靶场

WEB-Filter(过滤绕过)

需要满足什么:num通过is_numeric的检测,并且不等于36,去空后依然不等于36,经过过滤方法后依然等于36

我们可以用跑一下

fuzz脚本跑一下

<?php
for($i = 0; $i<129; $i++){
  $num=chr($i).'36';
  if(trim($num)!=='36' && is_numeric($num) && $num!=='36'){
      echo urlencode(chr($i))."\n";
  }
}
?>

payload:?num=%0c36

WEB-简单的正则(考点:正则)

该题有两种解法

php特性:

preg_match不识别数组,否则返回false,匹配一次返回1,没有返回0

if(0===flase)返回值为false,0不是强等于false的

stripos函数对数组不识别,遇到数组会返回false

方法一

payload:?f=zkaqzkaq[]

方法二:

采用数组绕过的方法,stripos函数会返回null,null!=false,所以可以绕过stripos函数

payload:?f[]=666

WEB-PHP弱类型1(考点:PHP弱类型)

首先可以看到,第一层if,需要我们给变量number赋值

然后第二层if,要求number不等于123

最后第三层if,要求经过intval()函数处理的number,等于123,否则给你错误的flag

所以重点就是intval() 函数,通过查阅资料可以得知,这是一个把变量转为整型的函数

成功了返回转换以后的数,失败了返回0,这样我们可以给number赋值 123(随便加点字符),然后经过intval处理以后就会返回123,成功拿到正确的flag

payload: ?num=123a

WEB-PHP弱类型2(考点:PHP弱类型)

我们看本题的代码,首先我们需要给num变量赋值

然后看is_numeric()函数,该函数用来判断传入的变量是否为数字

是数字的话返回TRUE,不是数字返回FALSE

也就是说如果我们传入的是数字,就会直接die掉,并且告诉我们不允许数字

然后else if中,又要求我们的num变量大于1024

也就是说num变量既不能是数字,又要大于1024,我们才能拿到flag

这时候我们就需要了解PHP的特性了

当一个数字与一个字符串/字符进行大小比较时,首先系统尝试将此字符串/字符转换为整型/浮点型,然后进行比较,如’12bsd’转型为12,’a’转型为0,注意是数字和字符串/字符比较

那我们这里就可以给num变量赋值,12345abc,当num与1024比较时,系统首先将12345abc强转成数字12345,然后再与1024比较

这样我们就成功拿到了flag

WEB-PHP弱类型3(考点:PHP弱类型

这题的代码也很好理解,首先strlen函数用来判断变量的长度,也就是num变量的长度必须小于3,

然后是strcmp函数,该函数用来比较两个变量

strcmp(string1,string2)该函数返回:
0 - 如果两个字符串相等
<0 - 如果 string1 小于 string2
>0 - 如果 string1 大于 string2

其实很简单,这两个函数也是不能处理数组的,我们随便给num传个数组,strlen函数处理以后报错,返回FALSE,与数字比较会被认为是0

0肯定是小于3的,然后strcmp函数处理数组也报错,返回FALSE,与0比较也是相等的,这样就可以成功拿到flag

payload:?number[]=0

WEB-strlen+intval绕过

这题我们需要满足的条件是,num变量的长度小于等于4,并且num+1转成整型以后大于500000

这里我们可以用到科学计数法,5e5 表示 5乘以10的5次方,也就是500000,加1以后就是500001

自然是比500000大了,并且满足长度小于等于4,这里我们只要输入的数据大于等于5e5就可以了

payload: num=5e5

WEB-简单反序列化(考点:反序列化)

这题是很简单的题目了,只需要让序列化以后的fun与传入的un变量相等即可

可以复制代码以后在本地执行,输出ser变量,得到的就是我们需要的字符串

payload: ?un=O:3:"Fun":3:{s:4:"name";s:5:"vFREE";s:3:"age";s:2:"19";s:4:"look";s:8:"handsome";}

WEB-登录(考点:sha1函数绕过)

很好,有发现,使用sha1函数处理以后的用户名和密码只要相等,就会得到flag

但我们又不能让用户名和密码相同。

其实sha1函数,也是不能处理数组的,当我们传入的是一个数组,那么就会返回FALSE,所以这里我们可以用户名和密码都传数组

这样就是FALSE===FALSE,自然就是TRUE了

payload:?username[]=a&password[]=b

WEB-谁的平方等于零?(考点:PHP中的科学计数法)

首先要满足a是一个数字,然后要满足a的长度小于7,最后要满足$a*$a也就是变量a的平方等于0

此题可以用到科学计数法

php有一个特性是,小数点后超过161位做平方运算时会被截断,我们可以用科学计数法来代替,即1e-162

WEB-Easy_PHP(考点:strpos() 函数)

WEB-Easy_Extract(考点:extract函数)

首先变量auth=100,然后是一个extract函数,里面的传参是$_GET,那么做过变量覆盖靶场的同学应该不陌生,这个函数可以把数组中键和值生成相应的变量,可以用来做变量覆盖。

那可以看到输出flag的条件是需要auth变量值为1000,此时我们就可以传参

?auth=1000,便可以成功拿到flag了

WEB-Easy_Extract-2(考点:extract函数)

源码中不难看出,解题的关键点还是extract函数,我们能通过该函数覆盖的变量有,ac和fn,但我们需要让ac全等于变量f,f的来源是由file_get_contents函数读取的文件内容,去掉空格,而该文件就是我们传入的fn变量。

然后看我们最后一行的提示,目录下有一个txt文件,那么猜测可能是flag.txt,为了验证猜测,我们去访问一下。

访问成功,内容为flags,所以我们可以让fn变量等于flag.txt,这样最终变量f的值就会等于flags,那很显然,ac变量也就应该等于flags,这样我们就可以拿到flag了

WEB-JSON_DECODE(考点:json_decode函数)

首先看代码,可以看到,如果没给变量num赋值,或者变量num的长度为0,就会直接die掉

那么肯定是得给num传点东西的,然后继续往下走,变量b等于json_decode($num),然后$y = $b === NULL,最后是 变量y全等于TRUE,才能拿到flag

也就是说,我们要让 $b === NULL 返回TRUE,这样 $y 才会等于TRUE,所以我们要让json_decode函数返回NULL,但我们并不能不给num变量赋值

所以我们就要另辟蹊径了,这里有几种方法, num=NULL 或者 num=%20(get传参才行)或者 num= (一个空格,可以burp抓包改)

payload: num=NULL || num=%20 || num= (空格)

WEB-文件?(考点:is_file+highlight_file)

  1. is_file — 判断给定文件名是否为一个正常的文件

  1. is_file ( string $filename ) : bool

  1. 我们的目的是不能让is_file检测出是文件,并且 highlight_file可以识别为文件。这时候可以利用php伪协议。

  1. 可以直接用不带任何过滤器的filter伪协议

  1. file=php://filter/resource=flag.php

  1. 也可以用一些没有过滤掉的编码方式和转换方式

  1. file=php://filter/read=convert.quoted-printable-encode/resource=flag.php

  1. file=compress.zlib://flag.php

WEB-MD5()(考点:MD5函数绕过)

首先看源码,变量num等于get传参的num

第一层if需要我们给num变量赋值,第二层if需要变量num不等于0

第三层if,是变量num经过md5编码的以后,等于FALSE

前面两个好说,主要就是md5编码以后等于FALSE,通过查阅资料可以发现

md5函数如果是对数组进行编码,便会报错,此时它会返回FALSE

那么答案就很明显了。

WEB-数组KEY溢出(考点:PHP数组key溢出)

本题的考点是数组key溢出

通过PHP创建关联数组的时候,键值Key如果是数值型(可通过is_numeric()判断)

则会在int有效范围内被自动转换为int型,如果超过int有效范围就会有问题,这就涉及到数组键值Key作为int型时的有效范围判断。

PHP的int型数据取值范围,与操作系统相关,32位系统上为2的31次方,即-2147483648到2147483647,64位系统上为2的63次方,即-9223372036854775808到9223372036854775807。

一般来说,我们往数组里插入一个值是可以正常插入的,当我们的数组下标key足够大的时候,9223372036854775807,这个时候想要再往里面插入元素,就会报错

而这一点正是这道题最内层if语句的考点

这时候往里a传参9223372036854775806,要比上面提到的那个数字小1

因为题目是++$a,先加上1,变成9223372036854775807,然后执行最内层的if时,因为没有地方可以开数组了,就返回NULL,即false,这样一来就可以执行else里的语句

WEB-不存在的伪协议头(考点:不存在协议头目录穿越)

有关file_get_contents()函数的一个trick,可以看作是SSRF的一个黑魔法

当PHP的 file_get_contents() 函数在遇到不认识的伪协议头时候会将伪协议头当做文件夹

造成目录穿越漏洞,这时候只需不断往上跳转目录即可读到根目录的文件。

此处限制我们只能读http开头的路径,但利用这个特性我们可以构造:

?a=httpsss://../../../../../flag 或 httpsssss://abc../../../../../../flag

WEB-反序列化(考点:反序列化)

不包含source就可执行反序列化,试一下文件读取

先访问一下flag.php,发现文件存在,那我们读取一下flag.php

WEB-MD5()-2(考点:MD5函数绕过)

在php中,所有变量都是若类型的,在使用if判等的时候要格外小心,使用特殊的参数可能会使本来不相等的if判断位相等

上面只要传入参数a=s1885207154a,b=s1836677006a,即可,为什么呢?看一下这两个字符串的md5值可以返现分别如下:

MD5值:

md5(“s1885207154a”) => 0e509367213418206700842008763514

md5(“s1836677006a”) => 0e481036490867661113260034900752

二者都是0e开头,在php中0e会被当做科学计数法,就算后面有字母,其结果也是0,所以上面的if判断结果使true,成功绕过!

WEB-MD5()-3(考点:MD5函数绕过)

同上

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

alunxzhou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值