World-of-Attack-Defense-II

 · 2019-10-26 · 次阅读


攻防世界进阶区

1.upload1(http://111.198.29.45:52414)
  这道题有两种做法,可以直接F12把JS中的检验的check()删除了,就可以直接上传一句话木马了,这里说一下连接的坑,之前我一直连接不上,是因为路径不对,路径一定得选到上传路径,这也是一句话木马执行的条件之一,上传的php需要被执行,且需要知道其上传的路径。第二种方法可以用Bp抓包后用%00截断,也可以上传上php。
2.抓住那只猫(http://111.198.29.45:34577)
  进入页面后,提示请输入你的域名,例如loli.club.我先搜索下这个是什么东西。这里顺带说一下这个输入框的标题:
  Cloud Automated Testing(CAT,云拨测),它是利用分布于全球的服务质量监测点,对您的网站、域名、后台接口等进行周期性监控,您可以通过查看可用率和延时随时间区间变化来帮助分析站点质量情况。云拨测对可用率指标提供自定义阈值告警功能,您可以通过配置告警实现异常实时通知。可视化性能数据和告警通知可帮助您及时对业务质量作出反应,保证业务稳定正常运行。
  通过域名查询,这个代表香港的腾讯云,那就是不是重要信息了。继续,域名的话,我试试localhost算不算,果然,给出了ping命令。那么这道题跟新手区应该类似可以直接通过命令查询到对应文件下的flag信息。这里试试localhost && ls,提示Invalid URL.
  这里就需要再了解一种叫FUZZ的东西了,fuzz测试(模糊测试)是一种安全测试方法,他介于完全的手工测试和完全的自动化测试之间。
模糊测试的执行过程大致如下:
1.准备好随机或者半随机方式生成的数据;
2.将准备好的数据导入被测试的系统
3.用程序打开文件观察被测试系统的状态
4.根据状态判断是否存在漏洞
  在fuzz测试下发现了@没有被过滤,然后,尝试输入�让其报错,果然报错了,在下面的发现了关键信息:/api/ping,复制到本地,试试直接搜索ctf,没有发现。接着搜索敏感信息database,/opt/api/database.sqlite3.这里找到了这样一个数据库,怎么样访问呢。先百度以下这个路径,百度下了解到这是python语言写的,使用的框架是django,而这个框架默认使用的是sqlites数据库。而在settings.py中是设置密码。接下来怎么样访问到这个路径呢,之前我们知道@是没有过滤的那么这个@怎么用呢,再继续的百度之下。发现这道题原题在比赛有个提示,RTFM OF PHP CURL===>>>read the fuck manul of PHP curl???而做题的大佬也是发现了,在CURLOPT_POSTFIELDS中说明到,全部数据使用http协议中的POST操作来发送,要发送文件,在文件名前面加上@前缀并使用完整路径。也就是说用@可以读取文件内容。结合刚刚搜索到的重要内容构造
payload:@/opt/api/database.sqlite3
再在报错信息中搜索CTF,拿到FLAG。
3.ics-05(http://111.198.29.45:53091)
  进入页面后,发现了一个工控云管理系统。先逐个点击页面,发现只有设备维护中心可以进去,这个页面是index.php。打开御剑扫描一下。发现只有index.html和index.php。那么这个系统进去是index.html,然后设备维护中心是index.html.再次进入这个维护中心,发现这个页面的云平台设备维护中心可以点动,点后发现URL上存在page=index,并且页面上也显示出了内容。这里想到了使用PHP的filter协议,于是构造page=php://filter/read=convert.base64-encode/resource=index.php
这里读取到了index.php的内容,里面有很多php部分,这会儿就是代码审计了。

                    die();
                }

                if (strpos($page, 'ta:text') > 0) {
                    die();
                }

                if (strpos($page, 'text') > 0) {
                    die();
                }

                if ($page === 'index.php') {
                    die('Ok');
                }
                    include($page);
                    die();
                ?>
        </p>
if ($_SERVER['HTTP_X_FORWARDED_FOR'] === '127.0.0.1') {

    echo "<br >Welcome My Admin ! <br >";

    $pattern = $_GET[pat];
    $replacement = $_GET[rep];
    $subject = $_GET[sub];

    if (isset($pattern) && isset($replacement) && isset($subject)) {
        preg_replace($pattern, $replacement, $subject);
    }else{
        die();
    }

}```
仔细分析可以可看这里的preg_replace函数是存在问题的,可以利用这个函数来实现远程代码执行。先构造第一个pattern中应该包含e,这样的话第二个函数中的replacement中就可以执行php代码了,当然还需要用XFF来构造本地127.接下来用BP抓包后在url中构造```payload:?pat=/abc/e&rep=system("find+-iname+flag")&sub=123```
这里说明一下+号在url中是被解析成空格的,这里用%20也可以。然后是find的-i选项搜索名字中含有flag的文件名,这里在BP构造后,GO之后给出了提示:./s3chahahaDir/flag
那么继续构造```payload:?pat=/123/e&rep=system("cd+./s3chahahaDir/flag")&sub=123```这里没有任何响应,cd只是进去了没有看到这其中内容,因而还得用一个ls命令,那么就得&&ls.没有效果,换编码的&:%26,发现提示了一个flag.php.接下来用cat命令直接查看flag.php的内容:
```payload:?pat=/123/e&rep=system("cat+./s3chahahaDir/flag/flag.php")&sub=123```这里再说一下preg_replace,这个函数要有用还有一个因素是第三个参数,也就是第三个参数需要是第一个正则表达式中的内容。这里简单的/123/,和123就能满足条件。好了拿下flag.
&emsp;&emsp;summary:今天对这个题大致做一下总结。感觉攻防世界的题很不一样,他可能涉及到更多关于Linux系统的知识点,很多都涉及从web延伸到系统。这里就需要更加熟练的运用Linux的命令才可以帮助自己更好的解题。还有就是进阶题都好难,自己还需要学很多知识,继续努力吧。
4.ics-06([http://111.198.29.45:38198/](http://111.198.29.45:38198/))
&emsp;&emsp;由提示说报表中心的数据被删除了,攻击者只留下了一处痕迹。这里进去后只有一个id=1,猜测是否是id=某值为留下的那一处痕迹。故送入BP,用数字字典爆破,最后爆破出来是2333,因而发送id=2333,拿下flag.
,这道题算是easy了一盘。
5.Lottery!([http://111.198.29.45:40855/index.php](http://111.198.29.45:40855/index.php))
&emsp;&emsp;进入页面后,是一个买彩票的页面,这时我的头上???然后这道题附件可以直接下载下来源码。其实这道原题是需要利用.git获取源码的。很多writeup用的是AWVS扫描出.git再利用hackgit这个软件就能复原工程,以便于进一步代码审计。
这道题的代码审计主要看一下中彩票的规则:
```function buy($req){
    require_registered();
    require_min_money(2);

    $money = $_SESSION['money'];
    $numbers = $req['numbers'];
    $win_numbers = random_win_nums();
    $same_count = 0;
    for($i=0; $i<7; $i++){
        if($numbers[$i] == $win_numbers[$i]){
            $same_count++;
        }
    }
    switch ($same_count) {
        case 2:
            $prize = 5;
            break;
        case 3:
            $prize = 20;
            break;
        case 4:
            $prize = 300;
            break;
        case 5:
            $prize = 1800;
            break;
        case 6:
            $prize = 200000;
            break;
        case 7:
            $prize = 5000000;
            break;
        default:
            $prize = 0;
            break;
    }```
我们可以清晰的看到,中彩票的方式是通过比较输入的7位数字和产生的随机数:
compared code:```if($numbers[$i] == $win_numbers[$i])```
上面这一句话就存在绕过,由于PHP是若类型语言,当我们给数字输入true时,我另外写了个简单的php验证过if(true=1234567)这句话是成立的,这道题也是同理直接绕过,抓包后,构造[true,true,true,true,true,true,true]
之所以这样构造是因为判断语句中也把他当成一个数组进行的处理正好用来绕过。
6.NewsCenter([http://111.198.29.45:41496/](http://111.198.29.45:41496/))
&emsp;&emsp;进入页面后,只有一个post框可以search东西,没有提示任何东西,猜测是sql,注入。尝试输入1',页面崩溃,说明这里存在注入的
爆表:1'  union select 1,2,database()#
其他的顺着来就可以了,没有过滤任何东西,拿下flag.


7.mfw([http://111.198.29.45:52719](http://111.198.29.45:52719))
&emsp;&emsp;进入页面后先测试各个功能点并获取有用的信息。在About页面下,作者提到了使用了Git.猜测其可能存在源码泄露的问题。然后我们访问/.git/发现了其源文件。接下来采用githack获取其源码。

if (isset($_GET[‘page’])) {
$page = $_GET[‘page’];
} else {
$page = “home”;
}

$file = “templates/“ . $page . “.php”;

// I heard ‘..’ is dangerous!
assert(“strpos(‘$file’, ‘..’) === false”) or die(“Detected hacking attempt!”);

// TODO: Make this look nice
assert(“file_exists(‘$file’)”) or die(“That file doesn’t exist!”)
require_once $file;```
这里仔细分析一下代码,首先要设置page用get传入。其次file的路径会变成templates/下的page.php
然后下一行是说..是不能使用的,因为..可以代表上一个目录的路径。这里的利用点在哪里呢,很明显我们看到了这个assert函数。在代码审计书中我们看到了这个函数也会导致命令执行。因为它会把传入的值当作php代码处理。在书中
称起为动态执行代码。因而这里可以拼接一个命令让其执行payload:assert(“strpos(‘$file’, ‘..’) or system(“cat templates/flag.php”) //===false”)
而真正的构造还需要替代,将$page构造成
flag’,’..’) or system(“cat templates/flag.php”);//

8.php2(http://111.198.29.45:58273/)
  进入页面后,提示Can you anthenticate to this website?要认证这个网页,那么先查看以一下源代码,或者是用御剑扫描一下。好的,没有任何有用信息。接下来用御剑扫描。很好,没有任何信息。接下来使用BP抓包,还是没有得到什么有用的信息。现在来仔细分析一下这个提示,要认证一个网页,直接百度anthenticate a website.哎,这个题就涉及到一个没有学习过的概念了:
.phps后缀
phps的文件就是php的源代码文件,通常用于提供给用户(访问者)查看php代码,由于php是服务器端语言,是客户看不到的,所以提供这么个文件可以让用户看到php代码。
好的,转过去题目。我们访问一下index.phps.出现了一些源代码:

not allowed!

"); exit(); } $_GET[id] = urldecode($_GET[id]); if($_GET[id] == "admin") { echo "

Access granted!
"; echo "

Key: xxxxxxx
";

首先id的值要为admin,然后是id的值要和经过url解码.那么就很容易了,直接构造?id=admin的url二次编码就可以了,为什么要二次编码,因为在url中本身就要解码一次。这里我遇到了一个坑,由于是在BP中进行的url编码,而其中将编码字母都使用了小写,当在二次编码后会出现错误而url解析不回admin.什么意思呢。这里的m在url编码后变为%6d.这里BP使用小写的“d”然后二次编码后会变成%25%36%64.而事实上应该用大写%6D我们观察url上一般url编码都会解析成大写,而大写的”D”是%25%36%34.因而要注意,以后二次编码有些题需要改第一次编码后的字母为大写,为什么说有些呢,因为之前有些题目我就这样二次编码也可以直接拿下flag.这道题就到这结束了,拿下flag.最后在网上检索后,大家都说url大小写编码是不一样的因而以后注意一下这个问题,可以采用双向的。

9.web2(http://111.198.29.45:50940/)
  这道题很有意思,进来看到代码后直接让我写一个解密的算法,解密密文就是flag.贴一下其加密代码:


function encode($str){
    $_o=strrev($str);
    // echo $_o;

    for($_0=0;$_0<strlen($_o);$_0++){

        $_c=substr($_o,$_0,1);
        $__=ord($_c)+1;
        $_c=chr($__);
        $_=$_.$_c;   
    } 
    return str_rot13(strrev(base64_encode($_)));
}

highlight_file(__FILE__);```
接下来直接先打开我的神器-notepad++.哈哈哈。。然后启动phpstudy准备好test.
```//return str_rot13(strrev(base64_encode($_)));
    //先从return分析起,密文需要先str_rot13,这个函数最有意思的是编码两次就回到了原来的字符串
    function decode($miwen){
        $_=base64_decode(strrev(str_rot13($miwen)));
        //写出了return的逆过程后,便得到了经过循环后的$_.
        $_o=$_;
        for($_0=0;$_0<strlen($_o);$_0++){
        //ord()返回首个字符的ASCII值
        //chr()返回ASCII对应字符
        //这两个函数倒是相反的
        //原for循环中相当于是进行了移一位的加密
        /* $_c=substr($_o,$_0,1);
        $__=ord($_c)+1;
        $_c=chr($__);
        $_=$_.$_c;*/
            $_c=substr($_o,$_0,1);
            $__=ord($_c)-1;
            $_c=chr($__);
            $_=$_.$_c;
        //经过分析,直接把每一位的字符又前移一个字母就回到了原来的长度
        }
        $mw=strrev($_);
        return $mw;
    }
    $miwen="a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws";
     $mw2=decode($miwen);
     echo $mw2;```
以上即为这道题的wp,其中详细过程均已注释方式给出,拿下flag.

10.bug([http://111.198.29.45:55705](http://111.198.29.45:55705))
&emsp;&emsp;这道题进入后是一个登陆框,还有注册与修改密码功能,在百度后知道了这道题主要考察的是逻辑漏洞,也就是其中的一些功能存在逻辑错误,导致非管理员用户可以越权登陆并执行恶意操作。
首先我尝试了注册admin账户,失败。在我注册admim1111111111111111111111111111111111111111,提示注册成功,但不知道为什么登陆不上。与是我注册了一个普通账户,上去后,有个Manage功能,发现提示you are  not admin.也就是说我们第一步先要成为admin.继续测试其他功能点,然后是Personal,没什么可操作的,就是一个显示,然后logout就是出去了,还有个Change Pwd试试,进入修改密码,抓包后可控参数只有oldPwd和newPwd故也无法利用,并且cookie的user是加密的无法修改,于是先退出账户测试其他功能点,最后只剩下外面的change pWD了,抓包后发现user是明文传输的并且可控,于是直接修改user为admin,然后密码就为自己修改的密码了。就是这儿存在逻辑错误,这里将修改密码的用户作为用户可以控制的参数,并且没有设置对应的cookie等标识对用户进行绑定认证,导致直接修改用户名而修改密码能直接成功。好了,登入admin用户后,再去试试manage功能,却提示IP不对,抓包修改XFF为127地址,在Response中提示了:
```index.php?module=filemanage&do=???```
可以知道这个url也是可以控制的,???因该是需要猜解的东西,猜测应该是upload..我是看其他人WP的,我还真没猜到,然后修改???为upload后访问该路径,最后是一个上传页面,我们首先上传了一个正常php的jpg文件,但是怎么也绕不过,00截断也不行,猜测其可能是检查了文件内容为<?php这样的关键字就不行,于是去jpg内容修改为:
```<script language="php">system("Is")</script>```
然后上传后抓包,响应中说需要一个php文件,那么修改后缀为php,却又说检测出来了,试试php5,果然成功绕过,看样子上传中使用的是黑名单检测机制,没有过滤完整。之后拿到FLag.
&emsp;&emsp;这道题我收获挺大的,可能代码审计会遇到很多逻辑错误问题,但我之前还很少遇到这种题型,这种也是很实用的,因为程序员编程不可能是完美的,总会出现逻辑错误,而我们审计员能够敏锐的核查到他们的这些逻辑错误并帮助改正就是减少漏洞产生的最好方式。然后测试功能点,也像这道题一样,逐一去排查,之后我准备自己写一个完整的这样的程序,这样我自己才能更清楚其中的逻辑判断,并通过查找自己的漏洞,来进行学习。



11.Training-WWW-Robots([http://111.198.29.45:44556/](http://111.198.29.45:44556/))
&emsp;&emsp;这道题主要是让我们学习爬虫协议,也就是robots.txt协议。直接打开robots.txt即可看到了体格fl0g.php访问即拿到了flag.这里主要学习一下这个robots.txt。
robots协议用来告知搜索引擎哪些页面能被抓取,哪些页面不能呗抓取;
文件写法:User-agent: \*这里的\*代表的所有的搜索引擎种类,\*是一个通配符
Disallow:/admin/这里定义是禁止怕寻admin目录下面的目录,其他目录写法类似
Disallow:/\*?\*禁止访问网站中所含问号的网站
Disallow:/.jpg$禁止抓取网页所有的.jpg格式的图片
Disallow:/ab/adc.html禁止爬取ab文件夹下面的adc.html文件。


12.NaNNaNNaNNaN-Batman
&emsp;&emsp;这道题算是一道综合杂项的js审计题,打开zip解压后是一个无后缀文件。加上后缀.html后打开是一个输入框。先用notepad++打开却发现全是乱码。上网搜了一圈,说是把eval改成alert就可以消除乱码,还真是,,弹框出来的竟然没有乱码了,整理一哈。有以下关键代码:
```if(e.length==16)
if(e.match(/^be0f23/)!=null)
if(e.match(/233ac/)!=null)
if(e.match(/e98aa$/)!=null)
if(e.match(/c7be9/)!=null)```
也就是这几个正则都匹配就给flag.仔细看,要求总长度是16但下面的数字和字母一共有21个,然后第三后加了$说明是匹配前面的数字,猜测第三行匹配的应该在最后。第一行包含^说明第一行的应该是开始,那么拼接16个字母数字就应该是:be0f233ac7be98aa.将其输入进输入框,拿到flag.



13.baby_web([http://111.198.29.45:43019/1.php](http://111.198.29.45:43019/1.php))
&emsp;&emsp;进入页面后,就只有一个hello,world,然后提示了最初的页面在哪里,最初的页面理解应该就是默认页面,那么就应该是进入111.198.29.45这个页面内。但是直接浏览器这么访问,进入不了,可能被直接强制送到了1.php下,那么就抓包去。最后在response中看到了flag.


14.php_rce
进入页面后,先看源代码,发现没什么有用的,到是页面上的ThinkPHP v5有用,结合题目名,百度搜索thinkphp5远程代码执行。