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

步骤二:代码审计
源码如上图
分析代码可以得到以下信息:
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,得到了一个敏感输出,是一个文件名

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

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

步骤五:对query进行测试
1、先使用true使语句恒成立

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

综上可以看到存在注入点 query,注入类型为数字类型,成立有回显,不成立无回显
步骤六:这里直接使用联合查询完成sql注入不对列数、回显位进行判断,按照其常规注入步骤进行即可,判断库名,库中表,表中字段名,字段对应的值… 最终得到flag;注:注入时为防止空格被多虑,一般直接使用 /**/ 替代空格
1、库名判断:?query=-1/**/union/**/select/**/database();#

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

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

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

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

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

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

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



浙公网安备 33010602011771号