web刷题记录(3)

作者 : admin 本文共4246个字,预计阅读时间需要11分钟 发布时间: 2024-06-9 共4人阅读

[NISACTF 2022]checkin

web刷题记录(3)插图

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

web刷题记录(3)插图(1)

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

web刷题记录(3)插图(2)

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

web刷题记录(3)插图(3)

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

web刷题记录(3)插图(4)

确实存在,将这些特殊符号用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

web刷题记录(3)插图(5)

[UUCTF 2022 新生赛]ez_rce

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

web刷题记录(3)插图(6)

        这种题我觉得一般就是过滤了平时比较常用的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 `);

web刷题记录(3)插图(7)

这里用var_dump也可以

web刷题记录(3)插图(8)

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

web刷题记录(3)插图(9)

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

web刷题记录(3)插图(10)

得到了flag

[SWPUCTF 2022 新生赛]ez_ez_php(revenge)

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

web刷题记录(3)插图(11)

尝试读取flag.php

web刷题记录(3)插图(12)

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

web刷题记录(3)插图(13)

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

尝试修改以后再次读取

web刷题记录(3)插图(14)

成功得到了flag

web刷题记录(3)插图(15)

 [CISCN 2019华东南]Web11

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

web刷题记录(3)插图(16)

看到了提示

web刷题记录(3)插图(17)

根据下面的三张图提示,可以看出是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

web刷题记录(3)插图(18)

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

web刷题记录(3)插图(19)

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

web刷题记录(3)插图(20)

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

web刷题记录(3)插图(21)

找到了flag相关文件,查看

web刷题记录(3)插图(22)

找到了flag

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

web刷题记录(3)插图(23)

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

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

web刷题记录(3)插图(24)

爆库

web刷题记录(3)插图(25)

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

web刷题记录(3)插图(26)

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

web刷题记录(3)插图(27)

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

web刷题记录(3)插图(28)

 爆字段

web刷题记录(3)插图(29)

得到了flag

[HNCTF 2022 Week1]easy_html

提示了cookie里面有东西

web刷题记录(3)插图(30)

 f12查看

web刷题记录(3)插图(31)

 

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

web刷题记录(3)插图(32)

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

web刷题记录(3)插图(33)

然后就弹了这个提示

web刷题记录(3)插图(34)

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

web刷题记录(3)插图(35)

得到了flag

web刷题记录(3)插图(36)

[NISACTF 2022]babyupload 

web刷题记录(3)插图(37)

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

web刷题记录(3)插图(38)

传不上,看看源码

web刷题记录(3)插图(39)

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

web刷题记录(3)插图(40)

zip文件

解压以后里面是个python文件

web刷题记录(3)插图(41)

这里是全部代码

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 """



    Select image to upload:
    
    



"""


@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/')
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即可:

web刷题记录(3)插图(42)

得到路径以后,访问即可

web刷题记录(3)插图(43)

得到了flag

本站无任何商业行为
个人在线分享 » web刷题记录(3)
E-->