wechall php0816

admin 2022年5月17日04:07:38评论113 views字数 2378阅读7分55秒阅读模式

Ox01 php0816
little hann大牛带我飞 和little hann大牛一起做的
一道题 记录一下 是个php代码审计的
题目的链接
http://www.wechall.net/challenge/php0816/

Ox02 code.php 白名单
code.php是的功能是用来查看源码的 可以设置一些高亮的选项
我们的目的是要查看到 solution.php这个文件 里面有key
如果能code.php?src=solution.php就可以查看到key了

code.php部分源码

foreach ($_GET as $key => $value)
{
  if ($key === 'src') {
    php0816SetSourceFile($value);
  }
  elseif ($key === 'mode') {
    php0816execute($value);
  }
.....

function php0816SetSourceFile($filename)
{
	$filename = (string) $filename;
	
	static $whitelist = array(//这里白名单了 一直绕不过去 过滤得很严格 好伤心
		'test.php',
		'index.php',
		'code.php',
	);

	# Sanitize by whitelist
	if (!in_array($filename, $whitelist, true))//不在白名单里就给设置成false
	{
		$_GET['src'] = false; 
	}
}
......

这里先分析一下第一个函数php0816SetSourceFile 有个白名单的机制 我们都认为这个很严格 饶不过去 就一直卡在这里了 如果没有白名单 直接就去src=solution.php就可以看到源码了 后来才发现这个函数不是重点,白名单是绕不过去的,重点在后面一个函数。但是这个src参数在后面有作用。

Ox03 php0816Highlighter分析
code.php的部分源码

...
function php0816execute($mode)
{
	switch($mode)
	{
		case 'hl': php0816Highlighter(); break;
	}
}
...

这里跟进去看一下这个php0816Highlighter()
code.php的部分源码

...
function php0816Highlighter()
{
	global $highlights; # <-- global highlights :D	
	# SOMEONE SAID THIS WILL FIX IT, BUT PEOPLE CAN STILL SEE solution.php :(  //这里给出了tips 就是要通过这个函数来查看到solution.php
	$filename = str_replace(array('/', '\\', '..'), '', Common::getGet('src'));//这里是关键,使用Common类中的getGet方法 使用了和之前相同的src参数  跟进去查看 那个方法
	//通过使用Common::getGet获取了一个文件名,做了一些跨目录的过滤,防止读取到任意的文件,但是没有加上之前的白名单的机制 代码在下面


	if (false === ($text = @file_get_contents($filename)))//先判断一下文件是否存在
	{
		echo 'File not Found: '.htmlspecialchars($filename, ENT_QUOTES).'';
		return false;
	}
	
	$text = htmlspecialchars($text, ENT_QUOTES);//转换为 HTML 实体

foreach ($highlights as $highlight)//高亮设置
	{
		$stlye = 'color:#CD7F32; background-color:white; padding: 0 8px;'; 
		$text = str_replace($highlight, ''.$highlight.'', $text);
	}
	
	echo '<pre>'.$text.'</pre>';//这里输出了文件的内容,可以尝试读取到solution.php的内容
}
...

Common类

...
final class Common
{
	public function getGet($varname, $default=false)
	{
		if (!isset($_GET[$varname])) {
			return $default;
		}
		return 
			get_magic_quotes_gpc() > 0 ?
			stripslashes($_GET[$varname]) : //这里做了一个过滤之后 get了一个文件名,可以发现这里没有之前的白名单,也就是这里出现了问题
			$_GET[$varname];//GET了src参数
	}
}
...

Ox04 参数传递的顺序

要注意到参数传递顺序的不同 是会有影响的

http://www.wechall.net/challenge/php0816/code.php?src=solution.php&mode=hl

输出 File not Found:

这里是因为 之前的 foreach ($_GET as $key => $value)
src参数先传入的话 被白名单过滤 $_GET['src'] = false; src会被赋值为假 就无法输出页面内容了

http://www.wechall.net/challenge/php0816/code.php?mode=hl&src=solution.php

这个就会输出solution.php的内容 就是之前分析的过程
输出

<?php
# The solution is 'AnotherCodeflowMistake';
?>
NOTHING MORE?
END OF FILE!

FROM :appleu0.sinaapp.com | Author:appleu0

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年5月17日04:07:38
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   wechall php0816http://cn-sec.com/archives/1012421.html

发表评论

匿名网友 填写信息