[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 upload
和def file
里的内容,意思是,上传的文件不能有后缀名,且文件名前会拼接一个前缀upload/
,使得输出的文件只能是在目录upload/
下的,这里就涉及到os.path.join()
的绝对路径拼接漏洞:
绝对路径拼接漏洞
os.path.join(path,*paths)函数用于将多个文件路径连接成一个组合的路径。第一个函数通常包含了基础路径,而之后的每个参数被当作组件拼接到基础路径之后。
然而,这个函数有一个少有人知的特性,如果拼接的某个路径以 / 开头,那么包括基础路径在内的所有前缀路径都将被删除,该路径将视为绝对路径,若我们使得
res[0]='/flag'
,则可以读取到根目录下的flag文件,因此利用bp抓包,修改文件名为/flag
即可:
所以若使得res[0]='/flag'
,则可以读取到根目录下的flag文件,因此利用bp抓包,修改文件名为/flag
即可:
得到路径以后,访问即可
得到了flag