-
-
[原创]跟着crownless学Web之(4)extract变量覆盖
-
发表于:
2019-1-26 11:40
7817
-
[原创]跟着crownless学Web之(4)extract变量覆盖
本文备份于我的博客
大家好,我是Web安全板块的新版主crownless。最近我将以CTF赛题讲解的形式介绍一系列的Web基础知识,讲解的顺序将是循序渐进,因此不需要读者有任何基础知识。希望能吸引更多人关注看雪的Web安全板块,为板块增加人气和活力。
如果你还没有阅读第一篇教程和第三篇教程,建议你先阅读之后再阅读本文。
在这篇文章中,你将学到:
话不多说,让我们开始吧。首先打开这次的CTF赛题网站:
http://139.224.220.67:23900/dmsj/level2/
你会发现一片空白,网页的源代码也为空。这里,我提供php后端的源代码供你审计:
首先,flag
变量被设置为'xxx'
,一个简单的字符串。
接着,后端运行了extract函数,从$_GET
数组中将变量导入到当前的符号表。什么意思呢?其实很简单。比如如果我们访问了http://139.224.220.67:23900/dmsj/level2/?sixstars=1,那么$_GET["sixstars"]
的值为字符串1
。执行extract($_GET);
时,就相当于执行了$sixstars='1'
。
然后,程序将会执行isset($sixstars)
。我们看到,为了获取flag,必须执行到echo 'flag{xxx}';
,所以isset($sixstars)
的返回值必须为 TRUE
。所以,我们必须通过extract($_GET);
将sixstars
变量设置为任意值,即使是空字符串也可以。也就是说,即使访问http://139.224.220.67:23900/dmsj/level2/?sixstars=也是可以的。但绝对不能不包含sixstars
参数。
接着,程序将会执行$content=trim(file_get_contents($flag));
。我们分步看。首先会执行file_get_contents($flag)
。正常情况下,如果你不通过URL传入flag
参数,那么,因为程序的最开始已经执行过$flag='xxx';
,所以到了这里将会执行file_get_contents('xxx')
。file_get_contents函数可以“将整个文件读入一个字符串”。比如如下代码可以将http://www.example.com/网站的源代码读取到homepage
变量中并显示出来。
接着,php又会执行trim函数,它将会“去除字符串首尾处的空白字符(或者其他字符)”。
最后,php将会执行if ($sixstars==$content)
,如果为TRUE
,那么将会显示flag。
读到这里,你想必已经知道了我们该怎么做:首先,给sixstars
变量传入一个值,比如1
。然后,给flag
变量传入一个我们能控制的网站的地址,并让这个我们能控制的网站的源代码设置为1
。由于extract
能起到“变量覆盖”的作用,在extract
后,flag
变量就会被覆盖为我们能控制的网站的地址,而不再是'xxx'
,这样当执行到file_get_contents
时php后端将会从我们能控制的网站上读取到1
,并将其和sixstars
变量比较,并返回TRUE
,然后就能打印flag。
虽然这个方法是可行的,但是今天我要教你一个更简单的方法,那就是php伪协议。我们可以直接给flag
变量传入data://text/plain,1
。意思是明文1
。这样file_get_contents('data://text/plain,1')
将会直接返回1
,就不需要我们在公网上开一台服务器了。
所以,最后我们的payload是:
这里再强调一下,给后端传参的方法是:在?
后跟变量名字,不同的变量之间用&
隔开。
关于伪协议,我们以后有机会还会碰到。请大家继续关注看雪Web安全板块crownless的CTF赛题讲解。
<?php
$flag='xxx';
extract($_GET);
if(isset($sixstars)) {
$content=trim(file_get_contents($flag));
if ($sixstars==$content) {
echo 'flag{xxx}';
} else {
echo 'Oh.no';
}
}
?>
<?php
$homepage = file_get_contents('http://www.example.com/');
echo $homepage;
?>
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2019-1-26 12:39
被crownless编辑
,原因: