当前位置: 首页 > news >正文

nss刷题

文件上传

[NISACTF 2022]babyupload(js源+控制台覆盖源码)

1.打开环境,上面叫我们传图片,测试了一下,传什么都不能通过

2.提示里面个给了一个文件,访问一下

3.得到一个www.zip文件,是一个python的脚本,也就是页面运行的框架

from flask import Flask, request, redirect, g, send_from_directory
import sqlite3
import os
import uuidapp = Flask(__name__)SCHEMA = """CREATE TABLE files (       #定义数据库表的创建语句,用于存储文件的id和路径。
id text primary key,
path text 
);
"""def db():                                  #定义一个函数db,用于获取数据库连接。   g_db = getattr(g, '_database', None)    #在db函数中,使用Flask的全局对象g来存储数据库连接对象,以确保整个应用生命周期中只创建一次数据库连接。if g_db is None:g_db = g._database = sqlite3.connect("database.db")return g_db@app.before_first_request         
def setup():                      #定义一个钩子函数setup,它将在应用处理第一个请求之前执行,用于初始化数据库。os.remove("database.db")        #在setup函数中,首先删除已存在的数据库文件(如果存在),然后获取数据库连接并执行SCHEMA来创建files表。cur = db().cursor()cur.executescript(SCHEMA)@app.route('/')                   #定义应用的根路由/,当用户访问这个路由时,将调用hello_world函数。
def hello_world():                #hello_world函数返回一个HTML表单,允许用户上传文件。return """<!DOCTYPE html>      
<html>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">Select image to upload:<input type="file" name="file"><input type="submit" value="Upload File" name="submit">
</form>
<!-- /source -->
</body>
</html>"""@app.route('/source')       #定义/source路由,用于提供文件下载。
def source():return send_from_directory(directory="/var/www/html/", path="www.zip", as_attachment=True) #source函数使用send_from_directory函数从指定目录发送www.zip文件,并将其作为附件。@app.route('/upload', methods=['POST'])   #定义/upload路由,它接受POST请求,用于处理文件上传
def upload():                             #在upload函数中,检查是否有文件被上传,并且文件名中是否包含非法字符(如.),如果有,则重定向回首页或返回错误信息if 'file' not in request.files:return redirect('/')file = request.files['file']if "." in file.filename:return "Bad filename!", 403conn = db()                         #创建数据库连接和游标,生成一个唯一的文件ID,尝试将文件信息插入数据库,如果出现重复则返回错误信息,否则提交事务。cur = conn.cursor()uid = uuid.uuid4().hextry:cur.execute("insert into files (id, path) values (?, ?)", (uid, file.filename,))except sqlite3.IntegrityError:return "Duplicate file"conn.commit()file.save('uploads/' + file.filename)     #将上传的文件保存到uploads/目录下,并重定向到文件查看页面。return redirect('/file/' + uid)@app.route('/file/<id>')     #定义/file/<id>路由,用于根据文件ID获取文件内容
def file(id):conn = db()             #在file函数中,创建数据库连接和游标,查询文件路径,如果未找到,则返回404错误。cur = conn.cursor()cur.execute("select path from files where id=?", (id,))res = cur.fetchone()if res is None:return "File not found", 404# print(res[0])with open(os.path.join("uploads/", res[0]), "r") as f:        #如果找到了文件路径,就打开文件并返回其内容。return f.read()if __name__ == '__main__':       #如果直接运行这个脚本,就启动Flask应用,监听所有IP地址的80端口请求。app.run(host='0.0.0.0', port=80)

4,根据我们审计的代码,可以得到几个关键信息:

字符.被过滤了,意思就是只要我们上传的文件有后缀.xxx,该文件就不能成功上传;

除此以外,这里利用的是一个函数点,os.path.join(path,*paths)函数用于将多个文件路径连接成一个组合的路径。第一个函数通常包含了基础路径,而之后的每个参数被当作组件拼接到基础路径之后。

关键点:

  • os.path.join 会自动根据当前操作系统的文件路径分隔符拼接路径。
  • 处理路径时,它会避免出现多余的分隔符,比如在 Windows 上 os.path.join("folder", "file.txt") 会自动拼接成 folder\file.txt,而不会出现 folder\\file.txt
  • 如果任何部分是绝对路径(例如 /home/userC:\Windows),os.path.join 会忽略之前的路径部分,直接使用绝对路径。

这就是我们利用的地方,我们在上传文件的同时抓包,然后修改文件名为/flag,在代码中,如果能正常运行,就会滤过前面的/uploads,根据函数特性,我们原本的路径/upoloads/flag,就会变为/flag(前提是根目录下真的有flag文件,不然就访问不到)

提示说叫我们访问一个路径,访问得到flag


 

[NISACTF 2022]bingdundun~

[GXYCTF 2019]BabyUpload

先测试一下,传了哟个图片马,可以上传

传php的不让,内容都不能是php标签的

用一个script标签的木马作为jpg文件上传,再用配置文件解析jpg码,成功执行,思路是这样,操作是:

上传木马

传配置文件

链接蚁剑

得到flag

[HNCTF 2022 Week1]easy_upload

打开环境传马直接连,没有任何过滤

得到flag

rce

[鹤城杯 2021]Middle magic

打开环境,代码审计

<?php
highlight_file(__FILE__);
include "./flag.php";
include "./result.php";
if(isset($_GET['aaa']) && strlen($_GET['aaa']) < 20){$aaa = preg_replace('/^(.*)level(.*)$/', '${1}<!-- filtered -->${2}', $_GET['aaa']);if(preg_match('/pass_the_level_1#/', $aaa)){echo "here is level 2";if (isset($_POST['admin']) and isset($_POST['root_pwd'])) {if ($_POST['admin'] == $_POST['root_pwd'])echo '<p>The level 2 can not pass!</p>';// START FORM PROCESSING    else if (sha1($_POST['admin']) === sha1($_POST['root_pwd'])){echo "here is level 3,do you kown how to overcome it?";if (isset($_POST['level_3'])) {$level_3 = json_decode($_POST['level_3']);if ($level_3->result == $result) {echo "success:".$flag;}else {echo "you never beat me!";}}else{echo "out";}}else{die("no");}// perform validations on the form data}else{echo '<p>out!</p>';}}else{echo 'nonono!';}echo '<hr>';
}?>

第一关:要求是get传参aaa的内容为apass_the_level_1,且字符长度小于20,正则匹配过滤了含有level和pass_the_level_1#的字符串,但是这里的正则用.匹配任意字符,并不包括换行符,^ $说不在同一行的过滤不到,因此,开始我们加一个换行符,%0a就可以。

将#转码为%23,浏览器才会将其作为实义字符处理,加入使用原来的#在浏览器中会将其识别为网页的某一个位置,如,http://www.example.com/index.html#print就代表网页index.html的print位置

payload:?aaa=%0apass_the_level_1%23

level2:post传参adminroot_pwd,弱比较,用数组绕过,

level3:

要求我们POST传参level_3,是json格式的。要满足level_3变量的result键的值 与$result变量相等,但是$result变量在index.php中未定义,在result.php中不知道有没有定义,所以$result变量值不可得知。先当成未定义,值为空,NULL。

 

实际测试证明,这里level_3只要POST了就行,值是多少都可以。因为空NULL和什么东西弱比较都是true,那么就验证了我们的猜想,$result变量未定义。

[NISACTF 2022]level-up

[MoeCTF 2021]babyRCE

题目描述

RCE, remote code execution,泛指能在远端机器上执行任意代码的情况。可是网站管理员添加了种种入侵检测,这该如何是好?
https://github.com/XDSEC/moeCTF_2021

打开环境,直接给了,过滤的内容都写好了,比较关键的有cat,tac,flag,空格

 <?php$rce = $_GET['rce'];
if (isset($rce)) {if (!preg_match("/cat|more|less|head|tac|tail|nl|od|vi|vim|sort|flag| |\;|[0-9]|\*|\`|\%|\>|\<|\'|\"/i", $rce)) {system($rce);}else {echo "hhhhhhacker!!!"."\n";}
} else {highlight_file(__FILE__);
} 

先看一下flag在哪里

直接抓吧,payload:?rce=ca\t${IFS}$fla\g.php

 [SWPUCTF 2022 新生赛]ez_rce

打开环境没上面什么也没有,问你真的什么也没有么,查看源码也没有什么,扫一下,有一个robots.txt,访问得到一个目录

访问一下是thinkphp5,网上有很多利用的poc

直接用工具,暂放

[WUSTCTF 2020]朴实无华

打开环境,只有一个hack me,源码什么也没有,这种情况需要扫描一下,得到robots.txt

给了一个新的地址,假flag

扫描得到的还有一个Fl4g.php,访问一下

接下来是rce

<?php
header('Content-type:text/html;charset=utf-8');
error_reporting(0);
highlight_file(__file__);//level 1
if (isset($_GET['num'])){$num = $_GET['num'];if(intval($num) < 2020 && intval($num + 1) > 2021){echo "我不经意间看了看我的劳力士, 不是想看时间, 只是想不经意间, 让你知道我过得比你好.</br>";}else{die("金钱解决不了穷人的本质问题");}
}else{die("去非洲吧");
}
//level 2
if (isset($_GET['md5'])){$md5=$_GET['md5'];if ($md5==md5($md5))echo "想到这个CTFer拿到flag后, 感激涕零, 跑去东澜岸, 找一家餐厅, 把厨师轰出去, 自己炒两个拿手小菜, 倒一杯散装白酒, 致富有道, 别学小暴.</br>";elsedie("我赶紧喊来我的酒肉朋友, 他打了个电话, 把他一家安排到了非洲");
}else{die("去非洲吧");
}//get flag
if (isset($_GET['get_flag'])){$get_flag = $_GET['get_flag'];if(!strstr($get_flag," ")){$get_flag = str_ireplace("cat", "wctf2020", $get_flag);echo "想到这里, 我充实而欣慰, 有钱人的快乐往往就是这么的朴实无华, 且枯燥.</br>";system($get_flag);}else{die("快到非洲了");}
}else{die("去非洲吧");
}
?>
去非洲吧

一层层来吧,第一层,intval()函数是强制转换函数,无论你传什么,都会将其转换为int型的数据,eg:如下,该函数会抛弃小数部分,使其成为整数

<?php
// 将浮点数转换为整数并赋值给变量a
$a = intval(2000.1);// 将变量a的值赋值给变量b
$b = $a;// 输出变量a的值
echo $a;
?>

同时它还有一个特殊科学记数法的用法,结果是3000

<?php
$a = intval(3e3);   //意思是2*10的三次方
$b = $a;
echo $a;
?>

如何加值,结果是3001

<?php
$a = intval(3e3);
$b = $a;
echo $a+1;
?>

成功绕过

第二关的意思是叫我们传一个值,这个值和它的md5值相等,在php中0e开头的值都认为是科学计数法,而php无法识别,只会=0,找几个放这里

         值                                     值的MD5

0e215962017    0e291242476940776845150308577824
0e1284838308    0e708279691820928818722257405159
0e1137126905    0e291659922323405260514745084877
0e807097110    0e318093639164485566453180786895
0e730083352    0e870635875304277170259950255928

后面是第三关先看看flag在哪里,然后再抓,应该是那个长的

抓吧,cat被禁用了,还有空格,没关系,用tac和$IFS$9,payload:?num=3e3&&md5=0e215962017&&get_flag=tac$IFS$9fllllllllllllllllllllllllllllllllllllllllaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaag

[FSCTF 2023]webshell是啥捏

用emoji表情代替字符,最后那个哭的表情是passthru();get传参的内容。

直接传参

反序列化

ssti

js分析

[GDOUCTF 2023]hate eat snake

打开环境是一个游戏,一般来说是在源码,尝试查看源码

 先玩一下游戏,看报错,在查看源码

根据关键词快速定位,让然后看一下它定义的getScore赢得游戏的关键条件是什么

搜索getScore

找到

if(this['getScore']()>-0x1e9*-0xf+0x5*0x6d+-0x2e*0xaa)return alert(_0x324fcb(0x2d9,0x2c3,0x2db,0x2f3)+'k3r_h0pe_t'+_0xe4a674(0x5a1,0x595,0x59e,0x57c)+'irlfriend}'),![];

意思是:if (this['getScore']() > 60),然后返还一个字符串,预计是flag

在控制台执行,此段代码重新定义了getScore,让它的值始终为61,就满足了上面的条件

Snake.prototype.getScore = () => 61

在控制台执行,让代码添加到源代码中

 然后重玩游戏就可以得到flag

[HGAME 2023 week1]Classic Childhood Game

小游戏,在js源码中找信息,搜索flag关键字,在/Res/Events.js中有类似flag的字段

得到

'\x59\x55\x64\x6b\x61\x47\x4a\x58\x56\x6a\x64\x61\x62\x46\x5a\x31\x59\x6d\x35\x73\x53\x31\x6c\x59\x57\x6d\x68\x6a\x4d\x6b\x35\x35\x59\x56\x68\x43\x4d\x45\x70\x72\x57\x6a\x46\x69\x62\x54\x55\x31\x56\x46\x52\x43\x4d\x46\x6c\x56\x59\x7a\x42\x69\x56\x31\x59\x35'

 cyberchef一把梭

[MoeCTF 2022]ezhtml

[SWPUCTF 2022 新生赛]js_sign(js+tapcode)

打开页面是一个验证的按钮,查看源码。

document.getElementsByTagName("button")[0].addEventListener("click", ()=>{flag="33 43 43 13 44 21 54 34 45 21 24 33 14 21 31 11 22 12 54 44 11 35 13 34 14 15"if (btoa(flag.value) == 'dGFwY29kZQ==') {alert("you got hint!!!");} else {alert("fuck off !!");}    
})

将flag要等于的值拿去base64解码,得到

document.getElementsByTagName("button")[0].addEventListener("click", ()=>{flag="33 43 43 13 44 21 54 34 45 21 24 33 14 21 31 11 22 12 54 44 11 35 13 34 14 15"if (btoa(flag.value) == 'dGFwY29kZQ==') {alert("you got hint!!!");} else {alert("fuck off !!");}    
})

tapcode编码

tapcode解码得到

sql

http相关

[HNCTF 2022 Week1]Interesting_http(请求头伪造+post)

打开环境叫我们post传一个want,那want什么呢,肯定是想要flag嘛

说我们不是admin ,可以看到cookie的最后有一个notadmin,改成admin

说非本地,加上一个X-Forward-For:127.0.0.1

得到flag

[SWPUCTF 2022 新生赛]xff

题目描述:我是本地人

打开环境,是这样一句话,意思是必须使用xiaohong自己的电脑,才能进入,但是这里不是用户的意思,它说的电脑是指本地,抓包改一下X-Forwarded-For:127.0.0.1

Must be accessed from Xiaohong's own computer.

后面又说,需要跳到家的页面,也就是Referer:主页面地址,得到flag

[MoeCTF 2021]Web安全入门指北—小饼干

打开环境,上面说我们不是vip,抓包看一下,可以看到cookie后面有一个vip=0

修改后得到flag

信息搜集

[SWPUCTF 2022 新生赛]where_am_i

打开环境,上面说叫我们输入一个11位的数字,还有一张图片,看起来是一个酒店

百度识图一下

11位的数字就是电话号码

得到flag

[FSCTF 2023]源码!启动!

打开环境,ctrl+u查看源码


http://www.mrgr.cn/news/81865.html

相关文章:

  • HashMap、TreeMap、LinkedHashMap的区别
  • 机器学习详解(11):分类任务的模型评估标准
  • C高级:Day3
  • 模仿微信小程序wx.showModal自定义弹窗,内容可以修改
  • 为什么要用ZGC
  • UCAS 24秋网络认证技术 CH15 Kerberos复习
  • vue 基础学习
  • win10、win11-鼠标右键还原、暂停更新
  • Linux 笔记 /etc 目录有什么用?
  • Datawhale-AI冬令营二期
  • llm知识梳理
  • 深度学习笔记(9)——神经网络和反向传播
  • ESP-IDF学习记录(2)ESP-IDF 扩展的简单使用
  • STM32F103RCT6学习之三:串口
  • 若依定时任务
  • Qt 中实现系统主题感知
  • GAN对抗生成网络(一)——基本原理及数学推导
  • CSS 居中技术完全指南:从基础到高级应用
  • Java重要面试名词整理(十二):Netty
  • Windows Knowledge
  • RTLinux和RTOS基本知识
  • Oracle数据库中用View的好处
  • Doris使用注意点
  • java相关学习文档或网站整理
  • 小程序基础 —— 02 微信小程序账号注册
  • GDPU 数据库原理 期末复习(持续更新……)