web刷题记录(3)

[NISACTF 2022]checkin

简单的get传参,好久没做过这么简单的题了

王德发?????!,看了源代码以后,本来以为是js脚本的问题,但是禁用js脚本没用,看了大佬的wp以后才发现,是有字符被隐藏了,具体推测是因为对高亮的使用,这里第二段注释部分颜色不对。(url通过show_source函数在高亮源代码时按照php.ini中的设置来渲染)

而且,鼠标扫前面,会有后面的代码被同步

这里尝试复制源代码到winhex里面看看。

确实存在,将这些特殊符号用URL编码以后再次进行传参,这里用到的知识点就是特殊字符识别。

payload

ahahahaha=jitanglailo&%E2%80%AE%E2%81%A6%55%67%65%69%77%6F%E2%81%A9%E2%81%A6%63%75%69%73%68%69%79%75%61%6E=%E2%80%AE%E2%81%A6%20%46%6C%61%67%21%E2%81%A9%E2%81%A6%4E%31%53%41%43%54%46

得到了flag

[UUCTF 2022 新生赛]ez_rce

进来就是一个正则啊,看来这题就是各种过滤了·

这种题我觉得一般就是过滤了平时比较常用的OS命令,然后要用点稍微冷门的命令或者格式来进行绕过。然后这里有就是php的函数以及讲解(PHP中的输出:echo、print、printf、sprintf、print_r和var_dump-腾讯云开发者社区-腾讯云

然后就是反引号的作用,之前也遇到过,但是没有仔细的考虑过,这里做出介绍:

1.反引号常见在SQL语句中来包含关键字,比如

$sql = "select `user`,username from `Content`";

此SQL中有反引号,也没有反引号

加上反引号就不会有因为字段是关键字而出错的问题。

为了保险起见,我们建议在所有字段中都加上反引号,即上面的SQL建议写成

$sql = "select `user`,`username` from `Content`";

2.反引号还有种功能是执行系统命令,比如:echo `dir d:\php`;注意,此句中的引号是反引号,而不是单引号。此句在足够权限的系统环境中,将列举D盘PHP目录的一些文件信息。

3.注:反引号位于键盘左边Esc下面,数字1按钮前,Tab上。

4.例如:SELECT `setting` FROM `$tablename` WHERE $where LIMIT 1

然后呢,这里的命令执行没有过滤 <> ? \/ 所以可以 ?>闭合(这个闭合针对括号也被过滤,但是这里的括号并没有被过滤,所以还是可以用括号进行过滤)

构造第一步payload:

?code=printf(`l\s `);

这里用var_dump也可以

看一下根目录,找到了和flag有关的文件

查看的话 ,一种是使用被过滤的字符,但是要用到/,还有一种,也可以用没有被过滤的命令,比如rev和nl(这里的rev是逆序输出,所以输出的flag是反的,需要人为改正一下,或者跑个脚本,有兴趣的可以试试,我看了一下,就没有复制上)。这里因为第一种很简单,所以采用第二种来示例:

得到了flag

[SWPUCTF 2022 新生赛]ez_ez_php(revenge)

进来以后,发现应该是和伪协议有关

尝试读取flag.php

应该是读取到了,尝试解码看看

得到了一段php代码,给了关键信息,大概意思应该是说,真正的flag在'/flag'下,不是flag.php下,

尝试修改以后再次读取

成功得到了flag

[CISCN 2019华东南]Web11

看起来都是比其他题吊一点

看到了提示

根据下面的三张图提示,可以看出是smart ssti,在XFF处构造payload

介绍一下smart

smart是php的模板引擎,模板引擎的作用就是分离前端页面和数据的,题目中显示API的URL由于环境的原因无法使用,但我们的IP依旧显示在了页面的右上角,且根据它的提示XFF我们很容易想到,在X-Forwarded-For里构造ssti.然后呢ssti,我也写过相关的博客,详细内容,可以在这里找关于ssti(简介)-CSDN博客

在利用SSTI注入时,在Smarty中一般用{php}{/php}标签来进行包裹执行php语句,在查询wp和一些资料后,得知{php}标签被强烈建议不使用,只有在SmartyBC中可用;

然后{if}标签和php中的if判断类似,而且可以正常使用php中的函数和符号,不过在使用时,要配上{/if}

然后是php的没必要去,模板引擎的作用就是分离前端页面和数据的,题目中显示API的URL由于环境的原因无法使用,但我们的IP依旧显示在了页面的右上角,且根据它的提示XFF我们很容易想到,在X-Forwarded-For里构造ssti:payload

抓包,改xff

经典${7*7}回显是$49

进行下一步判断7{*comment*}7

基本可以判断是是Smarty类型,可以开始包裹php语句进行查询了(除了加个{if}标签,还是用的php语句)

找到了flag相关文件,查看

找到了flag

[LitCTF 2023]这是什么?SQL !注一下 !

这个图我都不敢放加载完的

抓包一下,搞sqlmap,时间盲注,布尔盲注

爆库

感觉应该和ctf有关,看看信息

光是用户名的话,可能没什么用,看看另外一个ctf的库里面有什么

运气很好,找到了flag相关信息,接着往下爆破

爆字段

得到了flag

[HNCTF 2022 Week1]easy_html

提示了cookie里面有东西

f12查看

%2f是url编码,说明这里给了有关文件地址的提示 ,即f14g.php,访问一下看看

让输入手机号,但是位数被限制了,限制到了十位

然后就弹了这个提示

f12改一下位数限制 ,再登陆

得到了flag

[NISACTF 2022]babyupload

传🐎啊,我最熟了,先上个图片🐎看看·

传不上,看看源码

给了提示,意思是要叫我下个什么东西,看看

zip文件

解压以后里面是个python文件

这里是全部代码

from flask import Flask, request, redirect, g, send_from_directory
import sqlite3
import os
import uuid

app = Flask(__name__)

SCHEMA = """CREATE TABLE files (
id text primary key,
path text
);
"""


def db():
    g_db = getattr(g, '_database', None)
    if g_db is None:
        g_db = g._database = sqlite3.connect("database.db")
    return g_db


@app.before_first_request
def setup():
    os.remove("database.db")
    cur = db().cursor()
    cur.executescript(SCHEMA)


@app.route('/')
def hello_world():
    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')
def source():
    return send_from_directory(directory="/var/www/html/", path="www.zip", as_attachment=True)


@app.route('/upload', methods=['POST'])
def upload():
    if 'file' not in request.files:
        return redirect('/')
    file = request.files['file']
    if "." in file.filename:
        return "Bad filename!", 403
    conn = db()
    cur = conn.cursor()
    uid = uuid.uuid4().hex
    try:
        cur.execute("insert into files (id, path) values (?, ?)", (uid, file.filename,))
    except sqlite3.IntegrityError:
        return "Duplicate file"
    conn.commit()

    file.save('uploads/' + file.filename)
    return redirect('/file/' + uid)


@app.route('/file/<id>')
def file(id):
    conn = db()
    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__':
    app.run(host='0.0.0.0', port=80)

我们直接看最关键的def uploaddef file里的内容,意思是,上传的文件不能有后缀名,且文件名前会拼接一个前缀upload/,使得输出的文件只能是在目录upload/下的,这里就涉及到os.path.join()的绝对路径拼接漏洞:

绝对路径拼接漏洞

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

然而,这个函数有一个少有人知的特性,如果拼接的某个路径以 / 开头,那么包括基础路径在内的所有前缀路径都将被删除,该路径将视为绝对路径,若我们使得res[0]='/flag',则可以读取到根目录下的flag文件,因此利用bp抓包,修改文件名为/flag即可:

所以若使得res[0]='/flag',则可以读取到根目录下的flag文件,因此利用bp抓包,修改文件名为/flag即可:

得到路径以后,访问即可

得到了flag

相关推荐
Martin -Tang13 分钟前
vite和webpack的区别
前端·webpack·node.js·vite
迷途小码农零零发14 分钟前
解锁微前端的优秀库
前端
王解1 小时前
webpack loader全解析,从入门到精通(10)
前端·webpack·node.js
我不当帕鲁谁当帕鲁1 小时前
arcgis for js实现FeatureLayer图层弹窗展示所有field字段
前端·javascript·arcgis
那一抹阳光多灿烂1 小时前
工程化实战内功修炼测试题
前端·javascript
放逐者-保持本心,方可放逐2 小时前
微信小程序=》基础=》常见问题=》性能总结
前端·微信小程序·小程序·前端框架
毋若成4 小时前
前端三大组件之CSS,三大选择器,游戏网页仿写
前端·css
红中马喽4 小时前
JS学习日记(webAPI—DOM)
开发语言·前端·javascript·笔记·vscode·学习
Black蜡笔小新5 小时前
网页直播/点播播放器EasyPlayer.js播放器OffscreenCanvas这个特性是否需要特殊的环境和硬件支持
前端·javascript·html
秦jh_6 小时前
【Linux】多线程(概念,控制)
linux·运维·前端