这题就是各种php黑魔法的集合,先上payload /?msg=php://input&key1=1337&key2=000000000000000000000000000000000001337$&cc[]=&k1=2&bb=system(‘cat flag.php’);// Post数据加上Hello Challenge! 介绍几个Php黑魔法姿势:
首先要学会本地调试,加echo,var_dump之类的,方便知道程序过到哪一关。
这个地方需要读取msg这个文件的内容,使得它等于Hello Challenge! 此函数可以获取本地的内容,也可以支持HTTP、FTP等协议远程抓取内容。
当使用该函数打开某个文件时
result=file_get_contents($_GET[‘xxx’]) 可以在url里使用?xxx=php://input 然后将要赋值的数据写入POST里绕过
由于这里逻辑运算符用的是||,所以两者都需要为假才能绕过,php是弱类型语言,get获取的都当做string处理,你需要什么类型,它就转化为什么类型,所以输入1337,var_dump出来也是string(4),因此intval( k 1 ) 为 i n t 的 1337 , 和 k1)为int的1337,和 k1)为int的1337,和cc相等,但是===为强类型比较,会先比较两者的变量类型,所以不会相等,所以key1=1337.
在正则表达式/^\d+$/,那个美元符号不是正常的编码可以识别的,比正常的美元符号大一点,是用mathtype打出来的,所以key2中必须要带这个符号才能匹配 is_numeric的作用是判断变量是否为数字,如果是则ture如果是字符串则false,这里要过这个if,则k2需要匹配并且不能是数字 如果表达式是/^\d+$/这样的,则匹配的是出现次数大于一次的数字,那么这个if就很难绕过了(应该要用16进制),也算是神坑的好处,这里出现了一个不知名的符号,所以k2输入000000000000000000000000000000000001337$就过了if (最后那个是符号,所以k2为字符串,满足长度为42)
foreach变量覆盖原理如下 这个地方需要满足后面if($$a !== $k1) 需要覆盖a的变量,但是神坑又来了: 最后有一行代码 ,这个地方用了unicode控制符导致了反向显示,所以读的时候应该是b=“2”;a=“b”;//;1=b a在变量覆盖后又被重新赋值,所以覆盖a没有用,好在这里用了,使得a成为一个可定义变量,也就是b ,而且k1的值是可以覆盖,所以k1=2。
如果 assertion是字符串,它将会被 assert()当做 PHP 代码来执行。assertion 是字符串的优势是当禁用断言时它的开销会更小,并且在断言失败时消息会包含assertion表达式。这意味着如果你传入了 boolean 的条件作为assertion,这个条件将不会显示为断言函数的参数;在调用你定义的assert_options()处理函数时,条件会转换为字符串,而布尔值 FALSE 会被转换成空字符串。 如果输入bb=1,可以过到下一条语句good job 但是并不会打印出flag,说明只能通过assert来执行命令,但是关键在$cc,会变成 Array 这样就不是php代码。。所以必须要在bb的最后用//把CC注释掉。 所以bb=system(‘cat flag.php’);// 只能说这题很常规,除了那两个神坑,其他的没有什么,就是要绕很久,而且有趣的是这题居然可以反弹shell,反弹以后在可用的资源下还可以写fork炸弹。
Idea_share 看了两天发现了点,是绕过recaptcha验证 谷歌最新才爆出来的洞 所有的idea只要一次性通过验证,不出错,都会变成good 但是idea4不论验证成功还是失败都是bad 只要5个idea都是good,在about里面competition就会成功,然后拿到flag(最符合题意的猜测) 所以idea4一定要绕过那个验证,需要Http污染 但是网络上介绍的绕过recaptcha需要找到Post到谷歌的一个请求,说是点击验证就可以截取到,我截取的都是get的,不知道为什么 没有做出来,但是思路应该没有错,只能说这次web题目太少了,下次继续努力把
