【BUU刷题日记】--第二周
【BUU刷题日记】——第二周
一、[WUSTCTF2020]朴实无华 1
目录爆破
使用dirsearch扫描发现没有结果,因为如果dirsearch请求过快则会导致超出服务器最大请求,扫描不出本来可以访问的目录,所以需要调小线程数:
python dirsearch.py -u http://d8149651-49cb-4573-a1f7-1fbc8b1ab946.node4.buuoj.cn:81/ -t 30

访问


抓包一下:

直接访问,会出现一堆中文乱码,使用火狐修复一下变成下图:

<img src="/img.jpg">
<?php
header('Content-type:text/html;charset=utf-8');
error_reporting(0);
highlight_file(__file__); //level 1
if (isset($_GET['num'])){
$num = $_GET['num'];
if(intval($num) < 2020 && intval($num + 1) > 2021){
echo "我不经意间看了看我的劳力士, 不是想看时间, 只是想不经意间, 让你知道我过得比你好.</br>";
}else{
die("金钱解决不了穷人的本质问题");
}
}else{
die("去非洲吧");
}
//level 2
if (isset($_GET['md5'])){
$md5=$_GET['md5'];
if ($md5==md5($md5))
echo "想到这个CTFer拿到flag后, 感激涕零, 跑去东澜岸, 找一家餐厅, 把厨师轰出去, 自己炒两个拿手小菜, 倒一杯散装白酒, 致富有道, 别学小暴.</br>";
else
die("我赶紧喊来我的酒肉朋友, 他打了个电话, 把他一家安排到了非洲");
}else{
die("去非洲吧");
} //get flag
if (isset($_GET['get_flag'])){
$get_flag = $_GET['get_flag'];
if(!strstr($get_flag," ")){
$get_flag = str_ireplace("cat", "wctf2020", $get_flag);
echo "想到这里, 我充实而欣慰, 有钱人的快乐往往就是这么的朴实无华, 且枯燥.</br>";
system($get_flag);
}else{
die("快到非洲了");
}
}else{
die("去非洲吧");
}
?>
观察源码可以发现,要想得到flag需要进行三次绕过。
第一关
需要满足:
intval($num) < 2020 && intval($num + 1) > 2021
可以使用科学计数法,使num=2e4,intval函数的处理num会认为num为字符串,从第一个数字开始转换,直到遇到非数字。但是num+1运算时会将num作为科学计数法。
$num=2e4
intval($num)=2
intval($num+1)=20001
第二关
需要满足:
$md5==md5($md5)
只需要$md字符串开头为0e,并且md5($md5)后开头也为0e,这样php中弱等于就会将其作为科学计数法,0==0。
$md5=0e215962017
第三关
两个条件:
!strstr($get_flag," ")
$get_flag = str_ireplace("cat", "wctf2020", $get_flag);
需要$get_flag中不包含空格,不包含cat。
对于空格的规避可以使用:${IFS}、$IFS$1
对于cat的规避可以使用:ca\t、tac、more
总结
- 目录爆破在有些情况下需要调小线程才能爆破成功
- php intval函数的漏洞
- php 在md5函数情况下的等号漏洞
- linux规避空格、关键词过滤
二、[BJDCTF2020]ZJCTF,不过如此
代码:
<?php error_reporting(0);
$text = $_GET["text"];
$file = $_GET["file"];
if(isset($text)&&(file_get_contents($text,'r')==="I have a dream")){
echo "<br><h1>".file_get_contents($text,'r')."</h1></br>";
if(preg_match("/flag/",$file)){
die("Not now!");
} include($file); //next.php }
else{
highlight_file(__FILE__);
}
?>
file_get_contents:把文件中的内容读入字符串。
利用
对于文件读取的协议可以使用data伪协议,它是一个数据流封装协议,从php5.2.0开始生效
构造payload:
?text=data://text/plain,I have a dream
或者
?text=data://text/plain;base64,SSBoYXZlIGEgZHJlYW0=

下面的变量file提示查看next.php,文件包含使用php伪协议,payload如下:
?text=data://text/plain;base64,SSBoYXZlIGEgZHJlYW0=&file=php://filter/convert.base64-encode/resource=next.php
得到的base64字符串解密后:
<?php
$id = $_GET['id'];
$_SESSION['id'] = $id; function complex($re, $str) {
return preg_replace(
'/(' . $re . ')/ei',
'strtolower("\\1")',
$str
);
} foreach($_GET as $re => $str) {
echo complex($re, $str). "\n";
} function getFlag(){
@eval($_GET['cmd']);
}
preg_replace函数:
preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] ) : mixed
其中,
$pattern参数是一个用于匹配的正则表达式,$replacement参数是替换的字符串,$subject参数是需要进行替换的原字符串。$limit参数表示最多替换的次数(默认为 -1,表示不限制替换次数),$count参数是一个用于存储实际替换次数的变量(可选)。上面的代码就是通过变量$re中的模式匹配,将$str中匹配到的字符串转化为小写。
/e漏洞:
在preg_replace的/e模式下,会将替换字符串当做php代码来执行,这样就可以调用getFlag()函数进行命令行操作。
$str = '1 2 3 4 5';
$result = preg_replace('/\d+/e', 'pow($0, 2)', $str);
echo $result; // 输出 1 4 9 16 25
这段代码就是将$str中的变量全部平方。$0代表匹配到的字符串,也就是数字本身。
在本题中,替换字符串部分为'strtolower("\\1")',其中\1等价于$1,代表匹配到的第一个字符串。整个含义就是将匹配到的第一个字符串全变成小写。
foreach:
表示把$GET数组中键值赋值给$re,单元值赋值给$str。
payload:
因为模式串中为$re的值所以GET传入的变量名应该为?.*,因为.用于匹配除了\n的其他任意字符。但是使用GET传入变量时.会被过滤成_,因此换用其他表达式/S*。
同时其值应该为${getFlag()}用于执行getFlag函数,cmd的值为system('cat /flag')。
?\S*=${getFlag()}&cmd=system('cat /flag');
//分号不能丢
其实不太明白为什么要加*号,网上对${}里面的函数调用也描述很少,先记下来。
总结
- data伪协议输入文件流
- preg_match在/e模式下的漏洞
【BUU刷题日记】--第二周的更多相关文章
- Buu刷题
前言 希望自己能够更加的努力,希望通过多刷大赛题来提高自己的知识面.(ง •_•)ง easy_tornado 进入题目 看到render就感觉可能是模板注入的东西 hints.txt给出提示,可以看 ...
- Leetcode | 刷题日记(1)
本文记录个人刷题记录 推荐两个刷题网站: 地址:https://leetcode.com/ 另外一个地址:http://www.lintcode.com/ 1.Write a SQL query to ...
- BUU刷题01
[安洵杯 2019]easy_serialize_php 直接给了源代码 <?php $function = @$_GET['f']; function filter($img){ $filte ...
- python刷题第三周
以下是本周有所收获的题目 第一题: 第4章-4 验证"哥德巴赫猜想" (20 分) 数学领域著名的"哥德巴赫猜想"的大致意思是:任何一个大于2的偶数总能表示为两 ...
- lightoj刷题日记
提高自己的实力, 也为了证明, 开始板刷lightoj,每天题量>=1: 题目的类型会在这边说明,具体见分页博客: SUM=54; 1000 Greetings from LightOJ [简单 ...
- BUU刷题记录
[GWCTF 2019]mypassword xss+csp 打开页面可以注册登录 登进去提示不是sql注入 然后提示源码 看一下 然后有段后端代码写道了注释里 <!-- if(is_array ...
- 刷题日记-JZ25合并有序链表
合并有序链表 递归方式合并链表pHead1,pHead2 base case是 pHead1为空或者pHead2为空 递归方式是 如果pHead1->val < pHead2->va ...
- mysql刷题笔记
近期,为提升自己的工程能力,在休息时常通过刷题来回顾一下基础性知识. 于是选择了牛客网上的mysql知识题库练手,过程中,主要遇到了几个比较有意思的题,记录下来,方便回顾. 题1:SQL29 计算用户 ...
- 牛客SQL刷题第一趴——非技术入门基础篇
user_profile表: id device_id gender age university province 1 2138 male 21 北京大学 Beijing 2 3214 male ...
- python刷题第二周
1: 第3章-5 字符转换 (15 分) 本题要求提取一个字符串中的所有数字字符('0'--'9'),将其转换为一个整数输出. 输入格式: 输入在一行中给出一个不超过80个字符且以回车结束的字符串. ...
随机推荐
- EtherCAT 转CCLINK网关连接三菱plc应用案例
EtherCAT 现场总线协议是由德国倍福公司在 2003 年提出的,该通讯协议拓扑结构十分灵活,数据传输速度快,同步特性好,可以形成各种网络拓扑结构. 捷米特JM-ECT-CCLK 是自主研发的一 ...
- Vue + Volo.Abp 实现Auth2.0客户端授权模式认证
@ 目录 注册Client Auth2.0授权 创建vue-oidc-client 创建Auth2.0认证跳转 获取令牌 创建回调页面 创建退出登录 最终效果 Volo.Abp的身份服务器模块默认使用 ...
- VSCode隐藏一些非必要的文件
VSCode自动编译生成 .exe文件 很烦 所以要隐藏掉 文件,首选项,搜索 files.exclude 在后面添加 **/*.exe 即可
- IIS部署的应用无法自动注册到Nacos
问题描述: 自己开发的某系统后台API接入nacos,在IIS上部署无法自动注册到nacos服务列表中.其根本原因是网站处于休眠状态,当某请求访问该网站时,网站被激活,nacos注册成功. 但这块有个 ...
- 【阅读笔记】低照度图像增强-《Adaptive and integrated neighborhood-dependent approach for nonlinear enhancement of
本文介绍改进INDANE算法的低照度图像增强改进算法(AINDANE算法),<Adaptive and integrated neighborhood-dependent approach fo ...
- C++图像处理函数及程序(一)
C++开源项目: Boost.GIL:通用图像库 CImg :用于图像处理的小型开源C++工具包 CxImage :用于加载,保存,显示和转换的图像处理和转换库,可以处理的图片格式包括 BMP, JP ...
- Django学习笔记:第二章django的安装和创建应用
1.安装Django 终端运行 pip install django 查看django是否安装成功 python -m django --version 1.1 安装虚拟环境 在控制台运行 pip i ...
- Anaconda 使用时,conda activate 失败
今天使用一台电脑上新安装的 anaconda 时,运行 conda activate, 出现如下报错: 错误提示中,说要把 . C:\ProgramData\Anaconda3\etc\profile ...
- TCP 链接关闭 -- 客户端为什么需要60秒的time_wait状态
客户端主动关闭连接时( FIN-> ACK<- FIN<- ACK->),在发送最后一个ack后会进入TIME_WAIT状态,停留2个MSL时间,进入CLOSED状态 MSL就 ...
- grafana Variables 变量的使用
概念澄清 A variable is a placeholder for a value. # 变量是值的占位符. # 参考文档:https://grafana.com/docs/grafana/la ...