DASCTF Oct X 吉林工师 迷路的魔法少女
挺久没做php的题目了,有点捞,我写的博客主要也都是分享自己的思路,欢迎各位大佬指点
话不多说,直接进入正题
这题题目直接给了源代码,典型的php命令执行题目吧,做这类题我一般喜欢先找可利用函数,毫无疑问,这题就是eval了
这题目eval这里的利用好奇怪,说实话,可能因为做得少我是没见过这种形式的,所以直接百度了一下看看有没有相关的利用
这里有点运气好haha,直接搜到了有篇文章有相关源代码
这篇文章直接就分析了String2Array($data)这个函数要想利用data得是一个数组,那我直接拿题目的一部分源码来做做试验
事实证明确实是这样的,那就证明题目的剩下的代码要构造出一个数组来的
这段代码还是挺容易看懂的吧,相当于把两个数组凑一起了,比如我下面举的例子,两个数组长度都是3,他取attrid数组的值做新数组的键名,attrvalue数组的值做新数组的键值,具体的可能因为语言表达功底较差不好形容haha所以大家可以自己动手试试
这是我自己做的实验,证明只要自己正常传进去两个数组就可以执行任意命令了,这里因为是本地实验,所以我是直接给数组赋值了,到了题目得get传参,那我们动手试试
裂开了,这里传参就不行了,明明是一样的数组,但是为什么命令没有得到执行呢???哪里出了问题啊?是通过传参传入的数组出了问题吗?加两个var_dump看看吧
不看不知道一看吓一跳,传进去的数组都变成了一个长度为1的数组的键值,有点离谱了
,我们再看看这两个数组经过合并代码后产生的数组
也就是上图鼠标选中部分,果然如之前分析的一样,attrid数组的值做新数组的键名,因为代码中用了intval函数,所以键名不是个字符串而是数字,不过键名是什么都不重要了,因为前面的实验显示eval会执行的是数组的键值
而attrvalue数组的值做新数组的键值
所以这里我得想办法让构造让恶意代码作为数组单独的键值逃逸出来
这里我在前面加了个双引号闭合原来的双引号和逗号闭合了原来的双引号的前面部分,在最后一个键值的前面也加了个双引号闭合原来双引号的后半部分
?attrid[]=1=>2,2=>3,3=>4&attrvalue[]=1=>8,2=>system(whoami),3=>10 //修改前
?attrid[]=1=>2,2=>3,3=>4&attrvalue[]=",1=>8,2=>system(whoami),3=>"10 //修改后
两次修改的区别如上,而我们也是在本地成功执行了whoami命令
扔靶机里看看
系统命令是成功执行了,接下来找flag吧,cat /flag无果,那就可能在phpinfo()里面
成功找到了flag
做这类题说实话需要多动手多试试会好做很多