Google 2017年12月的Android安全公告中提到了一个漏洞,该漏洞能让攻击者绕过应用程序签名验证并将恶意代码注入Android应用程序。

15129699455914 300x109 Android系统高危“Janus”漏洞,绕过签名检测机制,任意篡改App

移动安全公司GuardSquare的研究团队发现,该漏洞存在于Android操作系统读取应用程序签名的机制中。
研究人员表示,Android操作系统会在各个位置检查字节,以验证文件的完整性。如下图:

15129699553382 Android系统高危“Janus”漏洞,绕过签名检测机制,任意篡改App

对于APK和DEX文件,这些字节的位置是不同的,研究人员发现他们可以在APK中注入DEX文件,Android操作系统仍然会认为它正在读取原始的APK文件。

这是因为DEX的插入过程不会改变Android检查完整性的字节,而且文件的签名也不会改变。研究人员把这个漏洞称为Janus。

此外,由于更新后的应用程序会继承原来应用程序的权限,所以通过这种方法,恶意软件可以通过替换应用来获取敏感权限。

Janus攻击的唯一不足之处在于,它不能通过在官方Play商店中推送恶意更新,攻击者必须让用户到第三方应用商店安装更新。

根据GuardSquare的报告,Janus漏洞只影响使用v1签名方案签名的应用程序。使用签名方案v2签署的应用不受影响。

目前,安卓5.0到8.0等版本系统均受影响,预计影响过亿用户。

漏洞补丁

Google已经推送更新,其他厂商应该也会陆续推送,请大家尽快更新补丁。
另外大家尽可能从手机厂商提供的官方应用市场下载安装应用程序。
若从网页下载,请确认是应用开发者官方的网站,并要有https安全标识。
同时,避免安装未知应用。

Typecho是一个轻量级的开源博客系统,近日有网友爆出该系统的安装文件install.php存在反序列化可控点,能导致任意代码执行。
快速修补方法:
删除install.php及install目录
漏洞细节:
在 install.php 文件的 288-235行

    $config = unserialize(base64_decode(Typecho_Cookie::get('__typecho_config')));
    Typecho_Cookie::delete('__typecho_config');
    $db = new Typecho_Db($config['adapter'], $config['prefix']);
    $db->addServer($config, Typecho_Db::READ | Typecho_Db::WRITE);
    Typecho_Db::set($db);

第230行获取cookie中的__typecho_config值base64解码,然后反序列化。想要执行,只需isset($_GET[‘finish’])并且__typecho_config存在值。
反序列化后232行把$config[‘adapter’]和$config[‘prefix’]传入Typecho_Db进行实例化。然后调用Typecho_Db的addServer方法,调用Typecho_Config实例化工厂函数对Typecho_Config类进行实例化。

跟踪 Typecho_Db 类,构造方法,Db.php 114-135行

public function __construct($adapterName, $prefix = 'typecho_')
{
    /** 获取适配器名称 */
    $this->_adapterName = $adapterName;

    /** 数据库适配器 */
    $adapterName = 'Typecho_Db_Adapter_' . $adapterName;

    if (!call_user_func(array($adapterName, 'isAvailable'))) {
        throw new Typecho_Db_Exception("Adapter {$adapterName} is not available");
    }

    $this->_prefix = $prefix;

    /** 初始化内部变量 */
    $this->_pool = array();
    $this->_connectedPool = array();
    $this->_config = array();

    //实例化适配器对象
    $this->_adapter = new $adapterName();
}

发现第120行对传入的$adapterName进行了字符串的拼接操作。那么如果$adapterName传入的是个实例化对象,就会触发该对象的__toString()魔术方法。

全局搜索__toString():发现三处,跟进发现 Typecho_Query类的__toString()魔术方法,Query.php 488-519行:

public function __toString()
{
    switch ($this->_sqlPreBuild['action']) {
        case Typecho_Db::SELECT:
            return $this->_adapter->parseSelect($this->_sqlPreBuild);
        case Typecho_Db::INSERT:
            return 'INSERT INTO '
            . $this->_sqlPreBuild['table']
            . '(' . implode(' , ', array_keys($this->_sqlPreBuild['rows'])) . ')'
            . ' VALUES '
            . '(' . implode(' , ', array_values($this->_sqlPreBuild['rows'])) . ')'
            . $this->_sqlPreBuild['limit'];
        case Typecho_Db::DELETE:
            return 'DELETE FROM '
            . $this->_sqlPreBuild['table']
            . $this->_sqlPreBuild['where'];
        case Typecho_Db::UPDATE:
            $columns = array();
            if (isset($this->_sqlPreBuild['rows'])) {
                foreach ($this->_sqlPreBuild['rows'] as $key => $val) {
                    $columns[] = "$key = $val";
                }
            }

            return 'UPDATE '
            . $this->_sqlPreBuild['table']
            . ' SET ' . implode(' , ', $columns)
            . $this->_sqlPreBuild['where'];
        default:
            return NULL;
    }
}

第492行$this->_adapter调用parseSelect()方法,如果该实例化对象在对象上下文中调用不可访问的方法时触发,便会触发__call()魔术方法。
继续跟进发现Typecho_Plugin类的__call()魔术方法存在回调函数,Plugin.php 479-494行:

public function __call($component, $args)
{
    $component = $this->_handle . ':' . $component;
    $last = count($args);
    $args[$last] = $last > 0 ? $args[0] : false;

    if (isset(self::$_plugins['handles'][$component])) {
        $args[$last] = NULL;
        $this->_signal = true;
        foreach (self::$_plugins['handles'][$component] as $callback) {
            $args[$last] = call_user_func_array($callback, $args);
        }
    }

    return $args[$last];
}

$component是调用失败的方法名,$args是调用时的参数。均可控,但是根据上文,$args必须存在array(‘action’=>’SELECT’),然后加上我们构造的payload,最少是个长度为2的数组,但是483行又给数组加了一个长度,导致$args长度至少为3,那么call_user_func_array()便无法正常执行。所以此路就不通了。
继续跟进Typecho_Feed类的__toString()魔术方法,Feed.php 340-360行

} else if (self::ATOM1 == $this->_type) {
            $result .= '_baseUrl . '"
>' . self::EOL;

            $content = '';
            $lastUpdate = 0;

            foreach ($this->_items as $item) {
                $content .= '' . self::EOL;
                $content .= '<![CDATA[' . $item['title'] . ']]>' . self::EOL;
                $content .= '' . self::EOL;
                $content .= '' . $item['link'] . '' . self::EOL;
                $content .= '' . $this-&gt;dateFormat($item['date']) . '' . self::EOL;
                $content .= '' . $this-&gt;dateFormat($item['date']) . '' . self::EOL;
                $content .= '
    ' . $item['author']-&gt;screenName . '
    ' . $item['author']-&gt;url . '
' . self::EOL;

第358行$item[‘author’]调用screenName属性,如果该实例化对象用于从不可访问的属性读取数据,便会触发__get()魔术方法。
全局搜索__get():
发现了几处,最终确定Typecho_Request类存在可利用的地方
__get()魔术方法调用get()方法,Request.php 293-309行:

public function get($key, $default = NULL)
{
    switch (true) {
        case isset($this->_params[$key]):
            $value = $this->_params[$key];
            break;
        case isset(self::$_httpParams[$key]):
            $value = self::$_httpParams[$key];
            break;
        default:
            $value = $default;
            break;
    }

    $value = !is_array($value) && strlen($value) > 0 ? $value : $default;
    return $this->_applyFilter($value);
}

308行调用_applyFilter()方法,传入的$value是$this->_params[$key]的值,$key就是screenName。
跟进_applyFilter(),Request.php 159-171行:

private function _applyFilter($value)
{
    if ($this->_filter) {
        foreach ($this->_filter as $filter) {
            $value = is_array($value) ? array_map($filter, $value) :
            call_user_func($filter, $value);
        }

        $this->_filter = array();
    }

    return $value;
}

第163行array_map和164行call_user_func均可造成任意代码执行。

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

QQ截图20171130163343 MacOS重大漏洞:反复按键即可创建root账号
攻击场景是:用户没有锁定Mac就离开了办公桌。
攻击者通过反复按键就可以创建root账号,之后就可以登陆设备,root账号也可以被用来远程访问。

利用方法步骤

1. 打开macOS系统设置

2. 移步至用户和用户组

3. 点击左下角的锁

4. 在用户名处输入root

5. 把光标移到密码区域

6. 反复点击解锁按钮

演示视频

漏洞影响了macOS High Sierra 10.13.1和10.13.2 Beta。一个临时的解决方案是用户可以通过自己创建含密码的root账号防止被攻击。

来自土耳其的开发者Lemi Orhan Ergin发现了漏洞,现在苹果正在抓紧修复漏洞。

Andrey Konovalov最近披露了本地特权升级的漏洞,他在Linux网络子系统内部发现了漏洞,同时使用工具syzcaller“fuzzing”。在oss – sec的邮件线程中,Konovalov写道:“当构建一个带有MSG_MORE __ip_append_data()的UFO包时,调用ip_ufo_append_data()来追加。然而,在两个send()调用之间,append路径可以从UFO切换到非UFO,这会导致内存损坏。

NIC分流和UFOs

网络接口卡(NIC)卸载允许协议栈传输大于以太网最大传输单元(MTU)的数据包,默认情况下是1500字节。当启用NIC offload时,内核将把多个数据包组装成一个大数据包,并将其传递给硬件,硬件处理IP碎片并将其分割成mtu大小的包。这种卸载经常使用高速网络接口来提高吞吐量,因为UFO可以发送大型的UDP数据包。

Linux内核可以利用各种NICs的分段卸载功能。

引发POC

下面是一个简单的概念证明

15108897525359 Linux内核漏洞可能导致特权升级

要在内核中构建UFO数据包,我们可以采取以下两个步骤之一:

使用UDP_CORK套接字选项,该选项告诉内核将此套接字上的所有数据累加到单个图中,以在禁用该选项时传输;

调用send / sendto / sendmsg时,使用MSG_MORE标志,告诉内核将此套接字上的所有数据累加到单个图中,以便在未指定此标志的调用时发送。此方法触发此漏洞。

在内核中,udp_sendmsg函数负责构造UDP数据包并将其发送到下一层。以下代码显示了在调用send / sendto / sendmsg时,由用户程序使用UDP_CORK套接字选项或MSG_MORE标志启用的UDP软木塞功能的剥离实现。启用UDP连接时,会调用ip_append_data函数将多个数据包累积为单个大数据包。
2221 Linux内核漏洞可能导致特权升级

 

函数ip_append_data是__ip_append_data的封装,它负责管理套接字缓冲区,方法是分配一个新的套接字缓冲区来存储传递给它的数据,或者在套接字被塞住时将数据附加到现有的数据。这个功能执行的一个重要任务是处理UFO。套接字缓冲区在套接字的发送队列中进行管理。在塞住套接字的情况下,队列中可以添加附加数据的条目。数据位于发送队列中,直到udp_sendmsg确定是时候调用udp_push_pending_frames,udp_push_pending_frames完成套接字缓冲并调用udp_send_skb。

Linux内核将数据包存储在结构sk_buff(套接字缓冲区)中,所有网络层都使用它来存储它们的标题,有关用户数据(有效负载)的信息以及其他内部信息。

2223 Linux内核漏洞可能导致特权升级

内核中的套接字缓冲区。

在上图中,sk_buff的头部,数据,尾部和尾部成员指向存储协议头部和用户有效载荷的内存区域的边界。头部和终点指向分配给缓冲区的空间的开始和结束。数据和尾部指向整个空间内的用户数据的开始和结束。紧接在结束边界后面,结构skb_shared_info包含IP分片的重要信息。

内存腐败

如前面的POC中所示,当第一次调用“send”时,MSG_MORE标志被调用,__ip_append_data通过调用ip_ufo_append_data创建一个新的套接字缓冲区,如下面的代码所示:

311 Linux内核漏洞可能导致特权升级

当这个调用完成,并且创建了新的套接字缓冲区时,用户数据被复制到片段中,共享信息结构被更新为片段信息,如下图所示。新创建的sk_buff被放入队列中。

321 Linux内核漏洞可能导致特权升级

在下一步中,PoC通过设置选项SO_NO_CHECK来更新套接字以不计算UDP上的校验和; 这将覆盖套接字结构的sk-> sk_no_check_tx成员。在__ip_append_data里面,这个变量被检查为调用ip_ufo_append_data之前的一个条件。

在POC第二次调用“发送”的过程中,在__ip_append_data内部采用非UFO路径,该路径进入片段长度计算循环。在循环的第一次迭代期间,副本的值变为负值,这会触发新的套接字缓冲区分配。另外碎片计算超过MTU并触发碎片。这会导致通过使用skb_copy_and_csum_bits函数将用户有效载荷从第一个发送调用创建的sk_buff复制到新分配的sk_buff。这将从源缓冲区中复制指定数量的字节到目标sk_buff并计算校验和。调用长度大于新创建的sk_buff边界结束限制的skb_copy_and_csum_bits会覆盖套接字缓冲区之外的数据,并破坏之前为sk_buff的skb_shared_info结构。

411 Linux内核漏洞可能导致特权升级

接下来是损坏的skb_shared_info结构。地址0xffff88003a4ca900处的内存是新创建的sk_buff,结尾= 1728,其中分段被触发。

42 Linux内核漏洞可能导致特权升级

当大多数默认的Ubuntu桌面系统允许非特权用户命名空间时,这个bug可以被非特权用户利用。用户应该可以做两件事情:

1:建立一个启用了UFO的接口(可能来自用户名字空间),或者使用那个接口(如果它已经存在)。(“lo”界面默认启用UFO。)

2:禁用NETIF_F_UFO接口功能或设置SO_NO_CHECK套接字选项。

代码执行可以通过在一个大缓冲区末尾简单地创建一个伪造的skb_shared_info结构并将回调成员设置为shellcode来转移到用户模式的shellcode。第二个“send”会触发套接字缓冲区的超出边界条件,用用户模式shellcode地址覆盖skb_shared_info-> destructor_arg,在从内核内存释放sk_buff之前调用该地址。

当暴露给非特权用户时,Linux内核提供了一个大的攻击面。所有的用户应该保持他们的系统补丁与最新的更新。

风讯DOTNETCMS是一款具有强大功能的系统,基于.NET构架的内容管理软件,国内领先的第一款开源的.集成WEB2.0元素的模块化的CMS建站系统。
近日有网友在审计该系统代码的时候发现存在可以利用的漏洞,绕过管理员账号信息验证,直接进入后台,可谓是非常危险的一个利用漏洞。

下面给大家分享一下漏洞细节:

先从DotNetCMS的登录逻辑处代码分析,如下图:

15099322942920 300x154 风讯DotNetCMS v2.0被爆出存在后台登录绕过漏洞

24 300x78 风讯DotNetCMS v2.0被爆出存在后台登录绕过漏洞

验证登录的逻辑大致可以整理为以下四步

1.从${pre}_sys_User表中取出UserNum,UserName,SiteID

2.如果是管理员,则adminLogined=1;另外,info.uncert的默认值为false

3.将UserNum,UserName,SiteID,adminLogined,uncert用逗号隔开组成字符串,再使用源码内的加密算法进行加密

4.加密后的字符串写入cookie,name是SITEINFO

也就是说只要得到UserNum,然后给他加密起来写入到cookie中,就可以直接进入到后台了。

但是 UserNum是在安装Foosun CMS时,随机产生的一个12位的值,如果暴力枚举的话太耗费时间,也容易被网站管理员发现。

这时候需要利用到这系统的另一处注入漏洞,帮助拿到UserNum。

审计代码后发现 http://localhost/user/City_ajax.aspx?CityId=1 的CityId字段存在SQL注入漏洞,看下图:

31 风讯DotNetCMS v2.0被爆出存在后台登录绕过漏洞

 

所以可以在这个地方拿到 UserNum ,构造如下注入链接:

http://localhost/user/City_ajax.aspx?CityId=1%27%20union%20all%20select%20UserNum,UserNum%20from%20dbo.fs_sys_User%20where%20UserName=%27admin

访问上面链接如下图:

41 1024x109 风讯DotNetCMS v2.0被爆出存在后台登录绕过漏洞

 

可以看到已经UserNum已经显示出来了。

接下来只要将得到的UserNum代入上面所说的加密方法,得到加密串,写入cookie即可以成功登陆。

使用该程序建站的站长朋友请尽快更新官方的安全补丁,以免网站被人非法入侵利用。

以上方法步骤仅供技术学习研究,请勿用于非法用途。

 一、病毒介绍

近日有研究人员发现了一种通过OFFICE 使用DDE进行攻击的方法。通过DDE在OFFICE中执行任意文件,这种攻击方式不依赖于OFFICE漏洞或者宏。攻击者可以通过社工方式发送钓鱼邮件诱使受害者打开office文档,一旦受害者打开文档,并且点击了允许更新引用,恶意代码就会执行。

在Windows系统中,各个应用程序之间常常需要交换、传递数据,动态数据交换(DDE)技术就是为了进程之间更方便传递数据提出的,最早是随着Windows 3.1由微软公司实现的进程间的数据通信的协议。动态数据交换(DDE)已经成为Windows的一部分,并且很多Windows应用程序都使用了DDE技术来实现进程之间的数据交换,而office也支持这个协议。

二、病毒攻击过程

攻击者首先构造office文档 通过添加域的方式 插入恶意代码。

当受害者打开word之后 就会弹出如下窗口,会提示是否允许,此时如果点击 “是” ,恶意代码就会运行起来。

图1 见到这个提示,说明你已经中了最新的office病毒!

可以看到恶意代码成功执行,弹出了windows计算器

图2 见到这个提示,说明你已经中了最新的office病毒!

上面我们为了演示弹出了一个计算器,在实际的攻击行动中,攻击者可以写入powershell 、vbs等脚本,执行更多恶意功能,还可以下载并运行更多恶意程序,可谓是非常危险的漏洞。

图3 见到这个提示,说明你已经中了最新的office病毒!

三、防御措施

防御这种攻击,需要做到以下几点:

1、避免打开未知来源的文档

2、慎重决定是否点允许

3、安装杀毒软件拦截查杀

无忧主机是一家专注于php主机的IDC企业,相比其他建站语言,php更简单易用,用户量也是非常大的。而不管哪款语言都避免不了漏洞的出现,今天无忧主机小编就给大家介绍一下php语言常见的漏洞以及对于的防范措施。

第一:SQL注入漏洞

在进行网站开发的时候,程序员由于对用户输人数据缺乏全面判断或者过滤不严导致服务器执行一些恶意信息,比如用户信息查询等。黑客可以根据恶意程序返回的结果获取相应的信息。这就是所谓的SQL注入漏洞。

sql注入地步骤:

  1. a)  寻找注入点(如:登录界面、留言板等)
  2. b)  用户自己构造sql语句(如:’ or 1=1#,后面会讲解)
  3. c)  将sql语句发送给数据库管理系统(dbms)
  4. d)  dbms接收请求,并将该请求解释成机器代码指令,执行必要地存取操作
  5. e)  dbms接受返回地结果,并处理,返回给用户

对SQL注入漏洞的防范

黑客进行SQL注入手段很多,而且灵活多变,但是SQL注人的共同点就是利用输入过滤漏洞。因此,要想从根本上防止SQL注入,根本解决措施就是加强对请求命令尤其是查询请求命令的过滤。具体来说,包括以下几点:

1、把过滤性语句进行参数化处理,也就是通过参数化语句实现用户信息的输入而不是直接把用户输入嵌入到语句中。

2、在网站开发的时候尽可能少用解释性程序,黑客经常通过这种手段来执行非法命令;

3、在网站开发时尽可能避免网站出现bug,否则黑客可能利用这些信息来攻击网站;仅仅通过防御SQL注入还是不够的,另外还要经常使用专业的漏洞扫描工具对网站进行漏洞扫描。

第二:脚本执行漏洞

脚本执行漏洞常见的原因是由于程序员在开发网站时对用户提交的URL参数过滤较少引起的,用户提交的URL可能包含恶意代码导致跨站脚本攻击。脚本执行漏洞在以前的PHP网站中经常存在,但是随着PHP版本的升级,这些间题已经减少或者不存在了。

对脚本执行漏洞的防范

客利用脚本执行漏洞进行攻击的手段是多种多样的,而且是灵活多变的,对此,必须要采用多种防范方法综合的手段,才能有效防止黑客对脚本执行漏洞进行攻击。这里常用的方法方法有以下四种:

1、对可执行文件的路径进行预先设定。可以通过safe_moade_exec_dir来实现;

2、对命令参数进行处理,一般用escapeshellarg函数实现;

3、用系统自带的函数库来代替外部命令;

4、在操作的时候进可能减少使用外部命令。

第三:跨网站请求伪造漏洞

CSRF(Cross Site Request Forgeries),意为跨网站请求伪造,也有写为XSRF。攻击者伪造目标用户的HTTP请求,然后此请求发送到有CSRF漏洞的网站,网站执行此请求后,引发跨站请求伪造攻击。攻击者利用隐蔽的HTTP连接,让目标用户在不注意的情况下单击这个链接,由于是用户自己点击的,而他又是合法用户拥有合法权限,所以目标用户能够在网站内执行特定的HTTP链接,从而达到攻击者的目的。

防范方法

防范CSRF要比防范其他攻击更加困难,因为CSRF的HTTP请求虽然是攻击者伪造的,但是却是由目标用户发出的,一般常见的防范方法有下面几种:

1、检查网页的来源

2、检查内置的隐藏变量

3、使用POST,不要使用GET

第四:xss跨站脚本攻击

SS(Cross Site Scripting),意为跨网站脚本攻击,为了和样式表css(Cascading Style Sheet)区别,缩写为XSS。跨站脚本主要被攻击者利用来读取网站用户的cookies或者其他个人数据,一旦攻击者得到这些数据,那么他就可以伪装成此用户来登录网站,获得此用户的权限。

跨站脚本攻击的一般步骤:

1、攻击者以某种方式发送xss的http链接给目标用户

2、目标用户登录此网站,在登陆期间打开了攻击者发送的xss链接

3、网站执行了此xss攻击脚本

4、目标用户页面跳转到攻击者的网站,攻击者取得了目标用户的信息

5、攻击者使用目标用户的信息登录网站,完成攻击

第五:session文件漏洞

Session攻击是黑客最常用到的攻击手段之一。当一个用户访问某一个网站时,为了免客户每进人一个页面都要输人账号和密码,PHP设置了Session和Cookie用于方便用户的使用和访向。

从前面的分析可以知道,Session攻击最常见的就是会话劫持,也就是黑客通过各种攻击手段获取用户的Session ID,然后利用被攻击用户的身份来登录相应网站。

session文件漏洞防范:

一是定期更换Session ID,更换Session ID可以用PHP自带函数来实现;二是更换Session名称,通常情况下Session的默认名称是PHPSESSID,这个变量一般是在cookie中保存的,如果更改了它的名称,就可以阻档黑客的部分攻击;

三是对透明化的Session ID进行关闭处理,所谓透明化也就是指在http请求没有使用cookies来制定Session id时,Sessioin id使用链接来传递.关闭透明化Session ID可以通过操作PHP.ini文件来实现;

四是通过URL传递隐藏参数,这样可以确保即使黑客获取了session数据,但是由于相关参数是隐藏的,它也很难获得Session ID变量值。

综述
2017年7月7日,Apache Struts发布最新的安全公告,Apache Structs2的strus1插件存在远程代码执行的高危漏洞,漏洞编号为CVE-2017-9791(S2-048)。攻击者可以构造恶意的字段值通过Struts2的struts2-struts1-plugin的插件,远程执行代码
漏洞分析
(1) 漏洞简介
Apache Struts2.3.x系列版本中struts2-struts1-plugin存在远程代码执行漏洞,进而导致任意代码执行。
(2) 漏洞分析
官方的漏洞描述如下:
从官方的漏洞描述我们可以知道,这个漏洞本质上是在struts2-struts1-plugin这个jar包上。这个库是用将struts1的action封装成struts2的action以便在strut2上使用。本质原因还是在struts2-struts1-plugin包中Struts1Action.java中execute函数调用了getText函数,这个函数会执行ognl表达式,更可恶的是getText的输入内容还是攻击者可控的。以下分析基于struts2的官方示例struts2-showcase war包。首先Struts1Action的execute方法代码如下,从红框中信息可以看出其实质是调用SaveGangsterAction.execute方法,然后再调用getText(msg.getKey()….)。

111 300x178 Struts2高危漏洞S2 048动态分析

在struts2-showcase的integration模块下有SaveGangsterAction.java的execute方法的实现。具体如下:

211 300x70 Struts2高危漏洞S2 048动态分析

在这个方法中就带入有毒参数gforn.getName()放到了messages结构中,而gform.getName()的值是从客户端获取的。Gangsterform.getName()的实现如下:

36 300x50 Struts2高危漏洞S2 048动态分析

我们这里传入了${1+1}。有毒参数已经带入,就差ognl表达式。继续回到Struts1Action.java的execute方法下半部分,这里有getText()的入口,能清晰看到参数已经被污染,具体如下图:

43 300x111 Struts2高危漏洞S2 048动态分析

下面进入getText的实现函数:这个调用栈比较深,首先我们给出栈图:

5 300x62 Struts2高危漏洞S2 048动态分析

从Struts1action.execute函数开始,到ActionSupport的getText()方法,方法如下:

6 300x26 Struts2高危漏洞S2 048动态分析

接着进入TextProviderSuppport.getText,接着调用其另一个重载类方法getText(),示例如下:

7 300x58 Struts2高危漏洞S2 048动态分析

如图所示,进入LocalizeTextUtil.findText,继续分析其实现:从名字上也能看出其是根据用户的配置做一些本地化的操作。代码如下:

8 300x34 Struts2高危漏洞S2 048动态分析

熟悉struts2的童鞋跟到这一步就能发现这就是一个很典型的ognl表达式入口,先是得到一个valueStack,再继续递归得到ognl表达式的值。

这里不再描述,详情可参考官方链接:https://struts.apache.org/maven/struts2-core/apidocs/com/opensymphony/xwork2/util/LocalizedTextUtil.html

翻页