N1CTF web eatcms

Do it!

对服务器后台扫描发现有注册,登陆等等界面,注册好账号后登陆发现url中有page=guest
于是尝试使用php://filter/read=convert.base64-encode/resource=index查看源代码,发现顺藤摸瓜可获得index.php,function.php,config.php的源码其中function.php中有对重定向的源码:

	function filter_directory()
	{
	    $keywords = ["flag","manage","ffffllllaaaaggg"];
	    $uri = parse_url($_SERVER["REQUEST_URI"]);
	    parse_str($uri['query'], $query);
	//    var_dump($query);
	//    die();
	    foreach($keywords as $token)
	    {
	        foreach($query as $k => $v)
	        {
	            if (stristr($k, $token))
	                hacker();
	            if (stristr($v, $token))
	                hacker();
	        }
	    }
	}

其中过滤之前对url的解析依靠:

$uri = parse_url($_SERVER["REQUEST_URI"]);
parse_str($uri['query'], $query);

此处有一个trick,在url内加入’/‘可使parse_url()函数无法正常分段,返回false,故可以达成绕过。所以我们输入url:
http://ip:port///user.php?page=php://filter/read=convert.base64-encode/resource=ffffllllaaaagggg
可以获得该页面的源代码,继续查找“m4aaannngggeee”,找到’templates/upload.html’,该页面有一个上传按钮,通过抓包发现该包是发给’templates/upllloadddd.php’的,但是upllloadddd.php不在templates/目录下,经尝试发现在根目录下,继续用php://获取其源代码可知要求上传"gif",“png”,"jpg"格式文件,并且其中还有执行系统命令功能:

$picdata = system("cat ./upload_b3bb2cfed6371dfeb2db1dbcceb124d3/".$filename." | base64 -w 0");
echo "";

而且没有任何过滤,所以考虑从这里进行命令注入。通过bp修改文件名,在’1.jpg’后加入’;ls’给uplloadddd.php发包,发现可以通过其回显得到当前目录的base64编码,通过对上一目录看到flag_2333333,通过将文件名改为"1.jpg;cd …;cat flag_233333",即获得flag。

你可能感兴趣的:(php,ctfweb,php)