范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

反序列化漏洞原理详解

  Apache shiro简介
  Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。
  本文针对Shiro进行了一个原理性的讲解,从源码层面来分析了Shiro的认证和授权的整个流程,并在认证与授权的这个流程讲解冲,穿插说明rememberme的作用,以及为何该字段会导致反序列化漏洞。 Apache shiro认证
  在该小节中我们将会详细讲解Shiro是如何认证一个用户为合法用户的
  Shiro漏洞环境测试代码修改自Vulhub中的CVE-2016-4437。
  首先是Shiro的配置文件,代码如下所示 @Configuration public class ShiroConfig {     @Bean     MainRealm mainRealm() {         return new MainRealm();     }      @Bean     RememberMeManager cookieRememberMeManager() {         return (RememberMeManager)new CookieRememberMeManager();     }      @Bean     SecurityManager securityManager(MainRealm mainRealm, RememberMeManager cookieRememberMeManager) {         DefaultWebSecurityManager manager = new DefaultWebSecurityManager();         manager.setRealm((Realm)mainRealm);         manager.setRememberMeManager(cookieRememberMeManager);         return (SecurityManager)manager;     }      @Bean(name = {"shiroFilter"})     ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {         ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();         bean.setSecurityManager(securityManager);           //设置登录页面uri         bean.setLoginUrl("/login");           //设置登录失败页面uri         bean.setUnauthorizedUrl("/unauth");          Map map = new LinkedHashMap<>();         map.put("/doLogin", "anon");         map.put("/doLogout", "authc");         map.put("/user/add","perms[user:add]");         map.put("/user/update","perms[user:update]");         map.put("/user/delete","perms[user:delete]");         map.put("/user/select","perms[user:select]");         map.put("/**", "authc");          bean.setFilterChainDefinitionMap(map);          return bean;     } }
  【一>所有资源关注我,私信回复"资料"获取<一】
  1、200份很多已经买不到的绝版电子书
  2、30G安全大厂内部的视频资料
  3、100份src文档
  4、常见安全面试题
  5、ctf大赛经典题目解析
  6、全套工具包
  7、应急响应笔记
  8、网络安全学习路线
  然后是Controller的代码 @Controller public class UserController {     @PostMapping({"/doLogin"})     public String doLoginPage(@RequestParam("username") String username, @RequestParam("password") String password, @RequestParam(name = "rememberme", defaultValue = "") String rememberMe) {         Subject subject = SecurityUtils.getSubject();         try {             subject.login(new UsernamePasswordToken(username, password, rememberMe.equals("remember-me")));         } catch (AuthenticationException e) {             return "forward:/login";         }         return "forward:/";     }      @RequestMapping({"/doLogout"})     public String doLogout() {         Subject subject = SecurityUtils.getSubject();         subject.logout();         return "forward:/login";     }      @RequestMapping({"/"})     public String helloPage() {         return "hello";     }      @RequestMapping({"/unauth"})     public String errorPage() {         return "error";     }      @RequestMapping({"/login"})     public String loginPage() {         return "loginUser";     }      @RequestMapping({"/user/add"})     public String add(){         return "/user/add";     };      @RequestMapping({"/user/delete"})     public String delete(){         return "/user/delete";     };      @RequestMapping({"/user/update"})     public String update(){         return "/user/update";     };      @RequestMapping({"/user/select"})     public String select(){         Subject subject = SecurityUtils.getSubject();         return "/user/select";     };  }
  最后是Realm public class MainRealm extends AuthorizingRealm {      @Autowired     UserServiceImpl userService;      /**该方法用来为登陆的用户进行授权*/     @Override     protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {         System.out.println("执行了=>授权doGetAuthorizationInfo");         SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();         Subject subject = SecurityUtils.getSubject();         System.out.println(subject.isAuthenticated());         System.out.println(subject.isRemembered());         if(!subject.isAuthenticated()){             return null;         }         Users users = (Users) subject.getPrincipal();          if(users.getPerm()!=null){             String[] prems = users.getPerm().split(";");             info.addStringPermissions(Arrays.asList(prems));         }          return info;     }      /**该方法用来校验登陆的用户*/     @Override     protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {         System.out.println("执行了=>认证doGetAuthenticationInfo");         Subject subject= SecurityUtils.getSubject();         System.out.println(subject.isAuthenticated());         System.out.println(subject.isRemembered());         UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) authenticationToken;         String username = usernamePasswordToken.getUsername();         char[] password = usernamePasswordToken.getPassword();          Users users = userService.queryUserByName(username);          if (users.getUsername()==null){             return null;         }         return new SimpleAuthenticationInfo(users,users.getPassword(),"");      } }
  这里来看一下自定义的MainRealm的类继承和实现关系图
  Realm所起到的作用通常是获取后台用户的相关信息,然后获取前端传递进来的用户信息,将二者封装好然后交由shiro进行认证比对从而判断用户是否为合法用户,然后在用户访问后台资源时,为用户授予指定好的权限。
  那么认证是怎么认证的呢?下面来从Shiro源码的角度来进行详细的分析。
  首先是登陆页面,和登陆页面的代码。
  当点击Singn in按钮的时候 后台对应的Controller就会执行
  但是在执行到Controller之前,Shiro会进行一个操作,如下所示
  首先就是Shiro的Filter,在Shiro的配置文件中,通过@Bean注解让SpringBoot在启动的时候自动装配了当前方法的返回值,也就是一个ShiroFilterFactoryBean对象,该对象的类继承关系如下所示。
  该类实现了SpringFrameWork中的FactoryBean接口和BeanPostProcessor接口。SpringBoot在启动的时候会扫描当前目录以及子目录下所有.java文件的注解,然后进行装配,这一过程中就会调用FactoryBean.getObject()方法。也就是FactoryBean的实现类ShiroFilterFactoryBean.getObject()方法,
  在shiroFilter的执行的堆栈中,会创建一个Subject,Subject是Shiro中很重要的一个概念,简单来说就是当前所操作的用户。当前线程中的用户所进行的认证和授权等等操作,都会以操作这个Subject对象来进行,所以Subject也被称之为主体,最终实例化的是一个WebDelegatingSubject对象。
  请求继续往下执行,来到UserController.doLoginPage()方法,该方法中会调用Subject.login()方法,并传入一个UsernamePasswordToken 对象。这个UsernamePasswordToken从这个类的名字我们就可以猜出这个类是用来做什么的,跟进该类中看一下
  从这个类提供的方法和属性就可以看出来,UsernamePasswordToken类就是一个单纯的pojo类,登陆时的用户名和密码以及对应的ip信息都会在这个类中暂时存放。
  跟进Subject.login()方法,经过一系列的调用来到了ModularRealmAuthenticator.doAuthenticate,该方法会获取我们自定义的Realm并一次进行调用,我们自定义的Realm是文章开头的MainRealm,所谓的Realm,就是对传入的用户进行认证和授权的地方,Realm的自定义需要继承自AuthorizingRealm,Realm我们可以自定义多个,只需要将自定义好的多个Realm放入一个Collection对象中,然后在配置文件中通过SecurityManager.setRealms()传入,这样在Shiro在认证时就会依次调用我们自定义的Realms,Shiro本身也自带有一些Reamls可以直接调用,如下图所示
  自定义的Realm有两个方法必须要实现,分别是继承自AuthencationgRealm的doGetAuthenticationInfo()方法,和AuthorizingRealm的doGetAuthorizationInfo方法,如下图所示
  下面根据程序执行流程,先讲doGetAuthenticationInfo,根据之前所讲调用subject.login()方法时会调用到我们自定义的Realm的doGetAuthenticationInfo方法,我们在该方法中的实现非常简单,即从后台数据库中根据用户名进行查询用户是否存在,如果存在则将查询出来的数据封装成Users对象,然后将封装好的Users对象传入和查询出的该用户的密码一同传入SimpleAuthenticationInfo类构造方法中并进行返回。
  这一步说是用来进行用户的认证,但是不难发现,该方法中并没有对用户的密码进行校验,那么真正的校验点在哪里呢,在如下图所示的位置
  在AuthenticatingRealm的getAuthenticationInfo方法中不仅调用了我们自定义的MainRealm中的doGetAuthenticationInfo方法,还调用了自身的assertCredentialsMatch方法,如下图所示,而assertCredentialsMatch方法就是用来校验前端传递来的用户名和密码,以及后台从数据库查询出的密码进行比对的。
  在assertCredentialsMatch方法中跟如cm.doCredentialsMatch(token, info),然后就可以看到shiro如何进行用户密码比对的了。
  token是前端传入的用户名和密码封装成的UsernamePasswordToken对象,info是从数据库中查询出的数据封装成的SimpleAuthenticationInfo对象,如此一来,获取二者的密码,进行equals比对,相同则程序继续执行,不相同则抛出异常,返回登陆界面。
  那么Shiro认证到这里就结束了么?当然不是,之前提到过,Shiro中有一个概念叫Subject,Subject代表的就是用户当前操作的主体,在这第一次登陆认证中我们也是通过调用了一个Subject对象的login方法才进行的身份验证,但是在这个Subject中是没有任何的用户信息的,当用户的信息通过校验之后,Shiro又会实例化一个WebDelegatingSubject,而这个位置就在DefaultSecurityManager的login方法中,如下图所示
  我们之前看到的认证过程就在authenticate方法里,身份真正成功后会返回用户的信息,封装在一个SimplePrincipalCollection对象里,如果认证失败,则会抛出异常。
  认证成功后,Shiro就会根据当前用户的一些信息,再创建一个Subject,后续该用户进行的任何操作都会以这个Subject为主,授权也是Shiro给这个Subject进行授权。
  如此以来我们就了解了Shiro是如何认证一个用户的,下面来总结一下Shiro认证用户的一个思路,首先在用户没有进行认证的时候访问一些资源,Shiro会生成一个Subject,这个Subject没有任何的用户信息。当用户开始登陆,Shiro会调用Subject的login方法,对用户的用户名和密码进行校验,校验通过后,会生成一个新的Subject,后续用户的授权等操作,都会基于这个新生成的Subject。 Apache Shiro授权
  看完了Shiro的认证过程,接下来我们来看Shiro的授权过程。
  我们将每位用户所拥有的授权都存入数据库中如下所示
  这里以admin为例,来分析下Shiro授权的过程。
  书接上文Shiro认证部分,认证完成功Shiro会生成一个新的Subject,而shiro的授权过程也就是围绕着这个Subject来进行的,那么Shiro何时会为用户进行授权行为呢?
  在之前的内容中说过,自定义的Realm有两个方法必须要实现,分别是继承自AuthencationgRealm的doGetAuthenticationInfo()方法,和AuthorizingRealm的doGetAuthorizationInfo方法。
  doGetAuthenticationInfo()方法我们已经清楚了,是用来进行用户身份验证的,而doGetAuthorizationInfo()方法就是用来进行用户授权的。
  再回顾一下之前的配置文件中我们为每个资源所授予的访问权限,权限如下所示。  @Bean(name = {"shiroFilter"})     ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {         ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();         bean.setSecurityManager(securityManager);         bean.setLoginUrl("/login");         bean.setUnauthorizedUrl("/unauth");         /**          * anon:无需认证就可以访问          * authc: 必须认证了才能访问          * user: 必须拥有记住我功能才能访问          * perms: 拥有对某个资源的权限才能访问          * role: 拥有某个角色权限才能访问          * */         Map map = new LinkedHashMap<>();         map.put("/doLogin", "anon");         map.put("/doLogout", "authc");         map.put("/user/add","perms[user:add]");         map.put("/user/update","perms[user:update]");         map.put("/user/delete","perms[user:delete]");         map.put("/user/select","perms[user:select]");         map.put("/**", "authc");          bean.setFilterChainDefinitionMap(map);          return bean;     }
  我们在doGetAuthorizationInfo()方法中下断点,当已经经过认证的用户访问制定资源的时候,shiro就会调用doGetAuthorizationInfo()方法来为该用户进行授权,具体怎么执行到该方法的就不细说了,将调用链粘贴一下。
  doGetAuthorizationInfo()方法的具体实现如下所示     protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {         String name = getName();         System.out.println("执行了=>授权doGetAuthorizationInfo");         SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();       //获取当前用户的subject         Subject subject = SecurityUtils.getSubject();         System.out.println(subject.isAuthenticated());         System.out.println(subject.isRemembered());         if(!subject.isAuthenticated()){             return null;         } //        Users users = userService.queryUserByName((String) subject.getPrincipal());       //       //获取当前用户的信息         Users users = (Users) subject.getPrincipal();             //判断当前用户的权限字段是否为空,如果不为空的话就传入SimpleAuthorizationInfo的addStringPermissions方法中。         if(users.getPerm()!=null){             String[] prems = users.getPerm().split(";");             info.addStringPermissions(Arrays.asList(prems));         }          return info;     }
  之前在认证的那一步中,我们将数据库中的数据封装成一个Users对象,该对象存放入了Subject中,doGetAuthorizationInfo()方法中我们将其取出。
  在该方法中,我们所做的只是将用户数据库中的权限字段取出然后封装入一个SimpleAuthorizationInfo对象中,并进行返回,我们跟随看一下Shiro后续的操作。
  在获取完当前用户的权限后,堆栈返回到AuthorizingRealm的isPermitted方法中,该方法又调用了isPermitted()方法,isPermitted()方法就是用来判断用户是否有权限访问指定资源的方法。
  isPermitted()方法具体内容如下所示
  该方法会讲用户所拥有的权限循环遍历出来,然后和当前资源所需要访问权限进行一一比对,如果相同则返回true。那么比对规则是怎样的呢?
  跟进implies()方法,内容如下所示
  这里简述一下比对的规则,当前资源所需的访问权限[user:add],对于shiro来说所谓的访问权限不过就是一串字符串而已,shiro会将[user:add]以":"进行分割,分割成user和add两个字符串,而假如用户具有[user:add],和[user:select]这两个权限,第一次循环就是判断[user:select]和[user:add]是否相同,会首先判断":"之前的字符串是否相同,也就是user这部分是否相同,相同则继续,不相同则返回false。判断相同以后,会第二次循环判断":"之后的部分是否相同,也就是add和select。那自然是不相同的,所以返回false。shiro接下来会继续判断[user:add]和[user:add]是否相同。
  这就是shiro授权和鉴权的代码流程,也是shiro的核心。了解了shiro的这部分内容之后,我们接下来就该讲CVE-2016-4437这个漏洞的具体内容了。 Apahce Shiro反序列化漏洞的根源
  shiro在用户登陆的时候,除了用户名和密码以外 还有一个可传递的选项,也就是shiro发序列化漏洞产生的根源,Rememberme。
  Rememberme的核心作用时什么呢?就是用户在登录时勾选rememberme选项,Cookie中就会增加一个rememberme字段,该字段中会存储一些序列化数据,开发者可以指定rememberme字段的有效时间,同时开发者可以指定一些资源,这些资源允许携带rememberme字段的用户访问,由于rememberme是存储在浏览器中的,并在用户的每一次请求中被携带,所以只要不清除Cookie,用户就可以在rememberme的有效时间内,无需再次登陆,就可以访问指定资源。在不勾选rememberme的情况下,通常就是浏览器关闭,会话就会立刻结束,活着等待一段时间后结束,届时用户想要访问一些资源则需要重新登陆,勾选rememberme后,即使推出浏览器结束与服务端的会话,rememberme仍然存储在浏览器中,重新打开浏览器访问指定资源,浏览器在请求时仍会携带上rememberme,如此一来就不需要重新登陆了。
  那么接下来就来分析rememberme是如何生成,以及如何实现无需登录即可访问指定资源的。
  如果登陆的时候不勾选rememberme选项的情况下,Shiro是不会生成rememberme的,勾选了rememberme选项后,才会在认证的过程中生成该值。
  生成rememberme的位置在DefaultSecurityManager的login方法中,如下图所示。
  位置就是在Shiro完成用户认证,生成一个新的Subject之后。跟进onSuccessfulLogin()方法,经过嵌套调用,来到AbstractRememberMeManager的onSuccessfulLogin方法,
  在该方法中,会先判断此次请求中remebmberme字段是否存在,如果存在则调用rememberIdentity()方法,想要知道rememberme中存储了什么东西那么就要继续深入。
  这里是获取到了一个PrincipalCollection对象,继续深入。
  接下来就是将这个PrincipalCollection转化成byte数组。这个方法很关键,我们需要跟入看一下
  看到这里大家应该就明白了,Shiro为什么会有反序列化漏洞,以及rememberme所传递的数据就究竟是什么,其实就是一个序列化后的PrincipalCollection对象,而这个encrypt就是通过AES来加密序列化后的数据,密钥呢?当然就是硬编码在AbstractRememberMeManager类中的这段base64编码后的字符串了,如下图所示
  最后的最后,Shiro会将这段加密后的数据base64编码一遍,然后放入Cookie中,至此Shiro生成rememberme的过程就结束了
  那么知道了rememberme是怎么加密生成的,那么自然也就可以很轻易的解密了,尤其还是在密钥硬编码在代码中的这种情况,下面是解密的demo
  那么反序列化漏洞产生的点在哪里呢?当用户在登录时勾选了rememberme的时候,Shiro会返回一个rememberme通过Cookie字段传递,然后存储在浏览器中,正常情况下当用户关闭浏览器或者手动删除浏览器中存储的SesseionID的时候,与服务端的当前会话就结束了,当下次打开浏览器再此访问服务端的时候,就需要重新登录。而勾选了rememberme的用户登录后,关闭浏览器后,会话同样会关闭,但是下次打开浏览器请求访问服务端的时候,Cookie中会携带Rememberme来进行请求,从而达到无需登录的效果。
  漏洞的产生关键就在于再重新建立会话的这个过程,所以想要触发rememberme的话请求包中就不能有SessionID,删除SessionID后再携带rememberme进行一次请求就可以触发rememberme的反序列化点,如下图所示
  最终通过base64解码,然后AES解密,解密后的结果再经过反序列化,就还原成了一个PrincipalCollection对象,至此Shiro rememberme的生成以及作用,还有如何触发rememberme反序列化,都已讲解完毕。
  总结
  Apache Shiro是一款相当优秀的认证授权框架,虽然在护网等大型攻防项目中,经常被作为突破口,但是仍然瑕不掩瑜,shiro的反序列化在流量识别中是比较容易判断的,因为序列化数据的传递必须要通过Cookie中的rememberme字段,但是纵使识别出来,但是如果不知道密钥的话,也无法得知传递的内容。

露营演变史由房车到家用车,由家用车再到新能源汽车?随着我们生活水平的不断提高,如今越来越多人喜欢在假期期间选择去自驾游,这时候就有不少人推荐使用房车出行,但房车只适合假期出行,并不适合日常使用,因此也就衍生出了露营。不过,露营其实冯小刚怒斥孙红雷和黄渤两人真是演员界的耻辱冯小刚曾经怒斥孙红雷和黄渤,甚至说他们两个是演艺圈的耻辱。我们都知道孙红雷和黄渤两人,都是可以被称作为实力派的演员,也有不少的代表作。这样的两个人,又怎么会被称作为是演艺圈的耻辱呢郭进拴春醉龙潭峡2011年4月15日下午4点,我们平顶山市诗词协会一行34人,从平顶山鹰城广场集合,前往鲁山龙潭峡探奇揽胜。我们的车队一起驶入郑尧高速,使我们对大山的兴趣愈来愈浓,不由得各个兴奋起新疆塔克拉玛干沙漠边缘现奇观上千只燕子展翅呢喃中新网乌鲁木齐5月16日电(胡俊建)为迎新燕入,不下旧帘遮。15日19时许,地处塔里木河下游塔克拉玛干沙漠边缘的新疆生产建设兵团第二师三十三团十九连出现近千只燕子漫天飞舞的奇特景象微度假的山系生活市集的烟火气解读新型业态的魅力购物中心的业态层出不穷,始终在围绕最新的商业趋势和年轻人的喜好进行更新换代。一旦出现同质化和不适应最新潮流的业态,将很快被淘汰掉,这迫使购物中心更加关注年轻人的动向,以做到引进最新游园赏花,莫负时光游园赏花莫负时光想躲进夏天的后花园里拥抱初夏游园正当时万物生长满目清芳盛开不如来一场说走就走的户外游看看家门口的初夏美景大秦文明园是世界最大的秦文化主题旅游园区占地面积上千亩园区内有一种美,只属于敦煌穹宇苍苍,大漠茫茫,有一个地方,风沙吹了几千年,见证了盛世之兴,目睹了乱世之衰,如今在苍茫的西北沙漠,巍然矗立。那个地方有个非常好听的名字,敦煌。敦,大地之意,煌,繁盛也。茫茫戈壁乡村休闲农庄一些别致的景观设计创意,这些景观设计值得借鉴随着乡村旅游和休闲农业的发展,很多人都加入到这一大军中来,农庄在增多,产品却没增多,这就很尴尬了。到处都是一样的,我为啥选你家?既然都是一样的,那还再去干嘛?这就要求农庄一要有特色陈三废从乡村少年到4200万大网红,他究竟有什么魄力?陈三废真是会火起来的原因有很多,他有很多机遇和运气他都抓住了。首先是他过去和女友的日常积累了很多粉丝。网友都特别喜欢看他和女友的日常生活,整蛊也好,搞笑也好,都是网友所喜欢的。后来吃这13种食物能让你的头发更茂密更健康分享给你可以通过吃的方式也可以让长发更健康的生长。我们可以享受美味的晚餐同时长出更强壮更长更健康的头发,这听起来像是一个梦想!其实饮食对头发皮肤和指甲的健康起着巨大的作用。下面是1什么是农业4。0催生乡村振兴互联网营销师农业1。0时代是传统农业农业2。0时代是机械农业农业3。0时代是农业自动化阶段。乡村振兴互联网营销师2013年,德国正式提出了工业4。0的概念,明确了信息化在工业化中的重要作用。时
网友集体送别谷爱凌真的舍不得你!我们在中国等你回来北京时间4月27日,谷爱凌发文感谢中国。根据安排,谷爱凌将去美国参加活动,而且将准备进入大学。所以,谷爱凌将暂时告别中国。很多网友都集体送别谷爱凌,感谢她这几个月带来的喜悦。谷爱凌陈小春的尴尬折射多少演员的无奈时代抛弃你时,连招呼都不会打不知道什么时候网大市场成了烂片聚集地,不少曾叱咤风云的一线明星如今竟然纷纷沦到全网吐槽的地步。其中以阿娇两部口碑翻车的网大为代表,先是在封神妲己中扭动水桶腰强行演狐狸精,被笑称为肉王老七联合女演员施压赵本山为何别人吃肉,我们连汤也喝不上?最近,赵本山的徒弟一个个都不省心了,纷纷揭竿而起,冲破阻碍做起了直播。就连憨厚的王老七都频频在线直播,可惜就是不火。眼看着赵四靠炸雷爆火,眼看着谢广坤飞黄腾达。王老七坐不住了,嫌一iPhoneSE3秀出真香价格,网友直言2699还要啥自行车自苹果iPhoneSE3发布后,大部分果粉认为苹果再用iPhone8的情怀设计割韭菜。究其原因iPhoneSE3定价过高,远未能达到果粉们期待的2000档价位的定价。但最近国内知名演员王凯的奋斗史,以及他走红后的两段绯闻01hr1982年,王凯出生于湖北省武汉市。他的父母,都是普通的工薪阶层。王凯上了初中后,开始喜欢唱歌和表演。每次学校有什么文艺演出,他都是第一个报名。久而久之,王凯成了班里的文艺今年春天最流行的5种衬衫,简单好搭不说,关键是搭配简单显气质马上就到五月份了,天气也越来越暖和,暖暖五月天,正是出门踏青的好时节。在这春暖花开的时节,除了可以选择漂亮的连衣裙穿搭,其实衬衫也是这个季节比较流行的穿搭单品。随着时代的发展进步,个头娇小的六位女星有人拍戏踩箱子,有人离不开20cm的恨天高近几年的娱乐圈,女明星们疯狂内卷。卷身材,卷妆容,连身高都变成了她们一争高下的关键因素。就拿最近播出的电视剧且试天下里的赵露思来说,她在一众女星中本身就算不上高个子。可是官方身高1会穿衣比颜值更重要!成熟女性就该这样穿,大方减龄又有气质今天穿什么很多人都会夸大颜值的重要性,认为只要具备高颜值,随便穿衣都很美,但拥有这种逆天颜值的女士毕竟是少数,大多数人还是可以依靠穿衣搭配提升魅力。下面这些穿搭很适合成熟女性,利用李荣浩杨丞琳婚变背后男方太佛系,女方是工作狂,婚后长期分居4月25日,李荣浩突然被媒体曝出婚内与吉克隽逸发生不正当关系,并被妻子杨丞琳目睹的消息。李荣浩杨丞琳官宣离婚的大标题,引发网友们纷纷猜想。如果连李荣浩和杨丞琳都离婚了,我就再也不相长相不算一眼惊艳,但却格外耐看,这7位女星戳中了大家的审美娱乐圈中有这样一群女明星,她们一眼看去并不惊艳,但是越看越好看,她们给人的感觉就是温婉娴静优雅自然,非常符合中国人的传统审美,看着就很舒服。1。俞飞鸿美人在骨不在皮,这句话在俞飞鸿巴罗美国最北端城市,因纽特人的精神故乡巴罗,一个绝大多数中国人都没听说过的地方,却是如今因纽特人的精神故乡。因纽特人,也就是我们小时候课本上的爱基斯摩人,书上说因纽特人吃海豹,住冰屋。但随着时代的发展,他们中绝大多数人林黛玉阴阳怪气口吻经典语录01。瞧瞧,我不过是多说了几句,哥哥就这般模样02。倒是终究被哥哥嫌弃了,不像其他妹妹生的俊俏03。我原是最笨嘴拙舌的,可比不上你列表的那些妹妹04。我大抵是嘴笨比不上别的妹妹,你中东土豪城市迪拜,富人天堂,穷人乐园迪拜市中心迪拜位于中东地区的中央,是面向波斯湾的一片平坦的沙漠之地。面积约为4114平方公里,占阿联酋全国总面积的5。8,继阿布扎比之后排名第二。人口约为339万约占阿联酋全国人口经典语录十则1。躺在成就上就像行进时在雪地里一样危险,你昏昏沉沉,在熟睡中死去。2。成功并不能用一个人达到什么地位来衡量,而是依据他在迈向成功的过程中,到底克服了多少困难和障碍。3。如果一个人最危险的古村落,建于悬崖之上,震撼人心却鲜有人知,你知道几个中国之大,无奇不有,960万平方公里的土地上,总有令你感到震撼的风景!不知你是否跟大奇一样,看惯了名山大川,赏遍了千篇一律的风景,很少能再遇见震撼心灵的景色。但其实还有一些古村落,辽迷高调喊出辽宁王朝,哪来的底气?三地球迷不答应CBA半决赛和总决赛给了球迷一个错觉,首先是辽宁球迷有了错觉,他们看到辽宁队在半决赛和总决赛均占有巨大的优势,3比0横扫广东队,总决赛G1优势明显,吊打广厦队,有可能也是横扫广厦而即将归来!广东队真核伤愈倒计时,有他在,杜锋冲冠底气足4月23日,目前CBA常规赛已经到了总决赛阶段,辽宁20领先广厦队。球迷们非常关注的广东队此前出战了半决赛,最终被辽宁队30横扫。说实话当时很多球迷是没有预料到的,卫冕冠军竟会以这医生建议年轻时多做这4件事情,老了或许能避免中风困扰中风在临床上的称呼是脑卒中,它是一种突发且进展迅速的脑缺血或脑出血性疾病,抓住最佳的治疗时机才是康复的关键,可生活中很多人往往会忽视了中风到来的征兆,由此错过最佳的治疗时机。所以,单亲家庭基本功不稳,秦霄贤凭什么被力捧?郭德纲这句话最关键现在内地最会造星的人,你知道是谁吗?不是各大选秀平台的幕后boss,不是音乐pk节目的制片人,也不是各类综艺的导演们,更不是那些层出不穷的偶像剧剧组,而是德云社。前有岳云鹏,后有郭回娘家吃饭老妈做了9菜1汤晒圈火了,网友看饿了,想去你家蹭饭有一段时间没有回娘家了,昨天给母亲打电话,母亲就让我今天一家三口回家去吃饭。下班后一家三口回到娘家,母亲已经提前张罗,忙乎了一天,准备各种我们爱吃的菜肴,虽然都是一些简单的家常菜,那时我们的爱情感情的文章篇1雪落无绪,梨花弄雨,美丽的相遇,春风依依。淡淡的年华似水,流逝的思念,没有谁不想走出爱的荆棘。一段感情的浓浓蜜意,只是为失落做了更深的苦凄,不是守不住颜花玫丽因为风,人到中年稳住局,沉住气,压住火,藏住事有人说人到中年,不如狗。可是,你不能慌,心急吃不了热豆腐。你是家里的顶梁柱,即便身材瘦小,依旧要活成一座山。没有人告诉你,未来的路何去何从,但是你不要慌,慢慢来,积小流,成江海。0