月度归档:2013年10月

公司内部安全培训PPT

介绍 web top 10 漏洞原理、危害、修复方法,有兴趣的同学可以下载看看。

(由于是第一次演讲,内容有什么不好的地方,请各位多多见谅)

下载地址:http://www.leesec.com/download/Web安全的那些事.ppt

如果访问不行复制链接 在下载软件 添加链接下载

代码审计–Dedecms最新版本存储xss

………………………….正在加载中………………………….

由于编辑文章的模板参数 typeid2可控,导致存储XSS发生。

dedecms/dede/templets/article_edit.htm页面316-325行代码如下:

  <tr>
      <td height="24" colspan="2" class="bline"><table width="800" border="0" cellspacing="0" cellpadding="0">
          <tr>
            <td width="90">&nbsp;文章副栏目:</td>
            <td><span id='typeid2ct'></span>
              <input type='text' name='typeid2' id='typeid2' value='<?php echo ($arcRow['typeid2']=='0' ? '' : $arcRow['typeid2']); ?>' style='width:200px;' />
              <img src='images/menusearch2.gif' style='cursor:pointer;' onClick="ShowCatMap(event, this, <?php echo $channelid; ?>, 'typeid2', '<?php echo $arcRow['typeid2']; ?>')" alt='选择副栏目' title='选择副栏目' /></td>
          </tr>
        </table></td>
    </tr>

从上面可以看出,变量$channelid 与 $arcRow[‘typeid2′] 只要可控,就可以造成XSS,接下来我们去找找能控制$channelid和$arcRow[‘typeid2′]的页面。

dedecms/dede/catalog_do.php页面249-310行代码如下:

else if($dopost == 'unitCatalog')
{
    CheckPurview('t_Move');
    require_once(DEDEINC.'/oxwindow.class.php');
    require_once(DEDEINC.'/typelink.class.php');
    require_once(DEDEINC.'/channelunit.func.php');
    if(empty($nextjob))
    {
        $typeid = isset($typeid) ? intval($typeid) : 0;
        $row = $dsql->GetOne("SELECT COUNT(*) AS dd FROM `#@__arctype` WHERE reid='$typeid' ");
        $tl = new TypeLink($typeid);
        $typename = $tl->TypeInfos['typename'];
        $reid = $tl->TypeInfos['reid'];
        $channelid = $tl->TypeInfos['channeltype'];
        if(!empty($row['dd']))
        {
            ShowMsg("栏目: $typename($typeid) 有子栏目,不能进行合并操作!", '-1');
            exit();
        }
        $typeOptions = $tl->GetOptionArray(0, 0, $channelid);
        $wintitle = '合并栏目';
        $wecome_info = "<a href='catalog_main.php'>栏目管理</a> >> 合并栏目";
        $win = new OxWindow();
        $win->Init('catalog_do.php', 'js/blank.js', 'POST');
        $win->AddHidden('dopost', 'unitCatalog');
        $win->AddHidden('typeid', $typeid);
        $win->AddHidden('channelid', $channelid);
        $win->AddHidden('nextjob', 'unitok');
        $win->AddTitle("合并目录时不会删除原来的栏目目录,合并后需手动更新目标栏目的文档HTML和列表HTML。");
        $win->AddItem('你选择的栏目是:', "<font color='red'>$typename($typeid)</font>");
        $win->AddItem('你希望合并到那个栏目?', "<select name='unittype'>\r\n{$typeOptions}\r\n</select>");
        $win->AddItem('注意事项:', '栏目不能有下级子栏目,只允许子级到更高级或同级或不同父级的情况。');
        $winform = $win->GetWindow('ok');
        $win->Display();
        exit();
    }
    else
    {
        if($typeid==$unittype)
        {
            ShowMsg("同一栏目无法合并,请后退重试!", '-1');
            exit();
        }
        if(IsParent($unittype, $typeid))
        {
            ShowMsg('不能从父类合并到子类!', 'catalog_main.php');
            exit();
        }
        $row = $dsql->GetOne("SELECT addtable FROM `#@__channeltype` WHERE id='$channelid' ");
        $addtable = (empty($row['addtable']) ? '#@__addonarticle' : $row['addtable'] );
        $dsql->ExecuteNoneQuery("UPDATE `#@__arctiny` SET typeid='$unittype' WHERE typeid='$typeid' ");
        $dsql->ExecuteNoneQuery("UPDATE `#@__feedback` SET typeid='$unittype' WHERE typeid='$typeid' ");
        $dsql->ExecuteNoneQuery("UPDATE `#@__archives` SET typeid='$unittype' WHERE typeid='$typeid' ");
        $dsql->ExecuteNoneQuery("UPDATE `#@__archives` SET typeid2='$unittype' WHERE typeid2='$typeid' ");
        $dsql->ExecuteNoneQuery("UPDATE `#@__addonspec` SET typeid='$unittype' WHERE typeid='$typeid' ");
        $dsql->ExecuteNoneQuery("UPDATE `$addtable` SET typeid='$unittype' WHERE typeid='$typeid' ");
        $dsql->ExecuteNoneQuery("DELETE FROM `#@__arctype` WHERE id='$typeid' ");
        UpDateCatCache();
        ShowMsg('成功合并指定栏目!', 'catalog_main.php');
        exit();
    }
}

由于变量$channelid 在该文件头部已经被过滤为intval($channelid),所以这个变量利用不了。
弱点代码在这里
$dsql->ExecuteNoneQuery(“UPDATE `#@__archives` SET typeid2=’$unittype’ WHERE typeid2=’$typeid’ “);
只要我们构造好POC,即可修改dede_archives表typeid2的值,从而造成存储XSS,因为编辑文章的时候,typeid2的值已经在数据库改了,所以每次编辑文章即可触发这个恶意代码。
也就是说当提交

URLpostdata:dopost=unitCatalog&nextjob='非空值'&typeid=0&unittype='><img src="x" onerror="alert(1)">

下面这个sql语句就会执行成功
$dsql->ExecuteNoneQuery(“UPDATE `#@__archives` SET typeid2=’$unittype’ WHERE typeid2=’$typeid’ “);
当然执行这条sql语句前提是这个表里的一定要有1条记录

利用方法就是CSRF 让管理员请求这个构造好的URL即可

CSP内容安全策略

0x00 Content Security Policy (CSP)简介

CSP是由 Mozilla Foundation开发的,并首先在FireFox4上使用的机制,主要是用来防止XSS、包嗅探、点击劫持等等。
接下来我们来列举CSP的配置指令

****************************************************************
default-src:默认策略,当其他各个特殊指令源没有赋值时,就按照该指令值,优先级最低
script-src:脚本来源,当default-src或者script-src二者有一个指定了值,那么inline script and eval()就被禁止,除非你分别使用'unsafe-inline' and 'unsafe-eval'来放行
content-src:限制连接的类型(例如XMLHttpRequest、WebSockets和EventSource)
font-src:控制网络字体的来源(@font-face)。例如可以通过font-src https://themes.googleusercontent.com来使用Google的网络字体。
frame-src:列出了可以嵌入的frame的来源(<frame><iframe>元素)。例如frame-src https://youtube.com只允许嵌入YouTube的视频。。
img-src:定义了可加载图像的来源。ABE中没有
media-src:限制视频和音频的来源(<audio><video>元素)。ABE的 INC(MEDIA) 特指HTML5的媒体
object-src:限制Flash和其他嵌入对象的来源。
style-src:类似于Script-src(<style>元素),只是作用于css文件。
***************************************************************
  • 防御XSS配置指令: Content-Security-Policy: script-src scripts.mysite.com //只允许该站点的JS脚本,嵌入该网站,我只是简单的举个例子,其实真正要配置比这个复杂点
  • 防御clickjacking配置指令:Content-Security-Policy: frame-src www.mysite.com
  • 如果嵌入的iframe站点非www.mysite.com,都达不到clickjacking效果。

    阻碍CSP推广的原因:当default-src或者script-src二者有一个指定了值,那么网页里面script标签的代码 and eval()就被禁止。国内很多网站都在网页里面有script标签,而不是全部放在一个js文件里面,然后由script src引入Js文件的。

    0x01 Content Security Policy (CSP)配置

    你可以先去了解nginx如何配置header ==>http://wiki.nginx.org/HttpHeadersModule

    然后在配置文件中 写入你需要的Header,例如:

    规范正确的方法

    add_header Content-Type: ‘text/html; charset=utf-8′;
    配置成功后,服务器返回
    Content-Type: text/html; charset=utf-8
    不规范错误的方法

    add_header Content-Type text/html; charset=utf-8
    配置成功后,服务器返回
    Content-Type: text/html;

    0x02 总结

    这上面是针对 firefox浏览器的。

    原来chrome浏览器和Safari浏览器 是用X-WebKit-CSP,现在高版本Version 25 的chrome浏览器也支持这个CSP.

    另外要熟悉CSP 和 noscript firefox插件还是有些类似的,大家可以装上这个插件玩玩。