BUUCTF-Web-题目详解(持续更新……)

目录

0x01 [SUCTF 2019]EasySQL1(介绍2种解法)

0x02 [GXYCTF2019]Ping Ping Ping 1

0x03 [极客大挑战 2019]Secret File 1

0x04 [极客大挑战 2019]LoveSQL 1

0x05 [极客大挑战 2019]Http 1


说明:本文持续更新BUUCTF平台上web的题解WP,请持续关注……


0x01 [SUCTF 2019]EasySQL1(介绍2种解法)

1、审题

打开靶场后,是一个POST表单,变量名为query(可查看源代码或BurpSuite抓包获取变量名),如下:

BUUCTF-Web-题目详解(持续更新……)_第1张图片

2、解法一

  • 常规办法判断注入点及注入类型,发现回显是Nonono,猜测单双引号、union select、报错注入均被过滤

BUUCTF-Web-题目详解(持续更新……)_第2张图片

  • 接下来,尝试一下堆叠注入,果然存在堆叠注入漏洞,利用堆叠注入查看数据库和数据表,如下:

BUUCTF-Web-题目详解(持续更新……)_第3张图片

BUUCTF-Web-题目详解(持续更新……)_第4张图片

  • 在上面步骤中我们知道有一个名为Flag的数据表,尝试查看一下该数据表的字段名都有哪些,如下图所示,然而并没有得到我们想要的结果,web界面回显Nonono,造成这个的原因应该是from关键字被过滤了。

BUUCTF-Web-题目详解(持续更新……)_第5张图片

  • 回到表单本身,通过POST表单提交的变量肯定会被拼接到SQL语句里面,形成诸如select $_POST['query'] from Flag之类的SQL语句。因此,我们尝试构造select * from Flag这样的语句,其中星号(*)用来代替其他字段,SELECT语句会返回数据表的所有字段值,然而当我们直接传递*的时候却没有任何回显,如下:
BUUCTF-Web-题目详解(持续更新……)_第6张图片 构造select * from Flag语句

       此时,没有输出Nonono,大致可判断:星号(*)没有被过滤掉,只是被某种方式暂时屏蔽  了 (记下这个,涉及后面第二种解法)

  •  我们知道Select查询数据时可以指定表的字段名或者将数字作为字段名,如下所示:

BUUCTF-Web-题目详解(持续更新……)_第7张图片

  •  综上,我们构造(*,6,9)来尝试绕过对星号(*)的屏蔽,果然成功得到flag,如下:

BUUCTF-Web-题目详解(持续更新……)_第8张图片

 3、解法二

在解法一中,我们知道“星号(*)没有被过滤,只是被某种方式暂时屏蔽了”,那到底是如何屏蔽的呢?

这里首先介绍一下Mysql的一个逻辑运算符:逻辑或(||、OR),逻辑运算符用来判断表达式的真假。如果表达式是真,结果返回 1。如果表达式是假,结果返回 0。

来看下面这个例子感受一下逻辑或的作用:

BUUCTF-Web-题目详解(持续更新……)_第9张图片

回到题目中,我们输入任何非0的数字,其返回值均为1,因此在构建SQL语句的时候大概率使用了逻辑或运算符,形成诸如select $_POST['query'] || flag_value from Flag的SQL语句,这样:

  • 当我们POST传递非0数字时,逻辑运算结果为真,返回1
  • 当我们POST传递数字0时,逻辑运算结果为假,返回0(此时前端无回显)
BUUCTF-Web-题目详解(持续更新……)_第10张图片 select 1 || flag_value from Flag

BUUCTF-Web-题目详解(持续更新……)_第11张图片

综上,我们解题的思路变得清晰:绕过逻辑或运算符。在Mysql数据库中我们可以把逻辑运算符(||)的作用转换成连接符,达到类似concat()函数的效果:

# 将逻辑或运算符||转换为concat()
set sql_mode=pipes_as_concat

因此我们构建如下payload:

9;set sql_mode=pipes_as_concat;select 9
此时,构造的SQL语句形如:
select 9;set sql_mode=pipes_as_concat;select concat(9,flag_value) from Flag

BUUCTF-Web-题目详解(持续更新……)_第12张图片

最终,成功获取了flag值flag{c126e55f-463c-4cfb-81e3-c333d42cad66}

0x02 [GXYCTF2019]Ping Ping Ping 1

1、审题

启动靶场,访问靶场连接,如下图所示,应是GET传递,结合题目名称为Ping Ping Ping,那么基本可以肯定是GET传递ip地址,在后台执行ping命令。

2、解题方法一:

传递127.0.0.1看看效果:

BUUCTF-Web-题目详解(持续更新……)_第13张图片

可见后台成功执行了“ping 127.0.0.1”这条命令,那么本题基本上就是考虑命令执行了,接下来便是使用管道符拼接命令了,常见管道符有: ||、|、&、&&、; 逐个测试看看哪个可用

BUUCTF-Web-题目详解(持续更新……)_第14张图片

发现封号(;)可用,于是拼接ls(linux)或dir(windows)命令,查看目录下是否有flag相关的文件,如下:

BUUCTF-Web-题目详解(持续更新……)_第15张图片

有个flag.php,flag值大概率在这个文件里面,浏览器访问flag.php试试,发现无任何回显,接下来需要想办法读取flag.php的源文件内容,使用cat flag.php读取:

BUUCTF-Web-题目详解(持续更新……)_第16张图片

cat不行,有可能被过滤了,那么使用 more、less、head、tac、nl、tail、od、sort、uniq、file -f、strings 逐个尝试,是了一圈没一个可以读取到flag.php的内容……郁闷……

回过头,看看web界面回显是“fxck your space!”,有可能是空格被过滤了,接下来使用 %09(Tab)、%20(space)、${IFS}、$IFS$1、$IFS、{cat,/etc/passwd}、<>、< 逐个代替空格,发现使用$IFS$1的时候,页面回显变为“fxck your flag!”

BUUCTF-Web-题目详解(持续更新……)_第17张图片

此时,应该是后台过滤了flag关键字。在命令执行漏洞钟,当关键字被过滤的时候,一般有两个绕过思路:

思路一:base64编码绕过,将base64编码结果重定向到bash、sh、zsh等linux shell

echo "bHM="|base64 -d|bash 表示将bHM=进行base64解码后的字符串传递给shell执行(此处shell是bash,也可是sh/zsh等)

思路二:base64编码绕过,利用反引号执行系统命令

BUUCTF-Web-题目详解(持续更新……)_第18张图片

思路三:定义变量,拼接命令(Linux)

BUUCTF-Web-题目详解(持续更新……)_第19张图片

此处先使用思路三进行尝试,如下:(思路一、思路二见解题方法二)

BUUCTF-Web-题目详解(持续更新……)_第20张图片

 此时,页面无过滤提示信息,但是却看不到flag信息,查看页面源代码,终于找到flag,晕啊……

没太明白此处为何查看源码才能找到flag,查看index.php查看其中执行过滤的相关代码,如下:

BUUCTF-Web-题目详解(持续更新……)_第21张图片

preg_math()函数使用正则表达式匹配字符串,print_r() 函数用于打印变量,以更容易理解的形式展示。之所以cat flag.php没有直接回显出flag值,是因为$flag被包裹在之中,而php代码再前端界面是无法显示的,因此需要查看源码。

3、解题方法二

使用base64编码绕过关键字过滤,对cat flag.php进行base64编码:Y2F0IGZsYWcucGhw。

第一种姿势:echo Y2F0IGZsYWcucGhw|base -d|sh,使用$IFS$1代替空格

BUUCTF-Web-题目详解(持续更新……)_第22张图片

 第二种姿势:`echo Y2F0IGZsYWcucGhw|base64 -d`,使用$IFS$1代替空格

BUUCTF-Web-题目详解(持续更新……)_第23张图片

0x03 [极客大挑战 2019]Secret File 1

1、审题

开启靶机,打开靶场连接,如下:

BUUCTF-Web-题目详解(持续更新……)_第24张图片

2、解题

只看题干有点不知所云,先查看源代码试试能不能找到线索,果然有个Archive_room.php文件:

BUUCTF-Web-题目详解(持续更新……)_第25张图片

 浏览器访问Archive_room.php文件,如下所示:

BUUCTF-Web-题目详解(持续更新……)_第26张图片

点击红色SECRET按钮,页面跳转如下:

BUUCTF-Web-题目详解(持续更新……)_第27张图片

此时,既然提示“没看清么?回去再仔细看看吧”,那么在点击红色SECRET按钮时使用BurpSuite抓包分析(使用Repeater模块放包),看看能不能找到有用信息:

BUUCTF-Web-题目详解(持续更新……)_第28张图片

此时可以发现,点击红色SECRET按钮后,页面跳转至action.php文件,而action.php向服务器请求了一段html代码,从这段代码钟发现有个secr3t.php文件,浏览器访问该文件试试:

BUUCTF-Web-题目详解(持续更新……)_第29张图片

可见,此时存在文件包含漏洞,并且提示flag放在了flag.php里,接下来使用伪协议php://filter读取flag.php文件,如下:

BUUCTF-Web-题目详解(持续更新……)_第30张图片

对读取的base64编码内容进行解码,如下:

BUUCTF-Web-题目详解(持续更新……)_第31张图片

成功获取到flag值,不容易啊,一环套一环,全是套路……

0x04 [极客大挑战 2019]LoveSQL 1

1、审题

开启靶机,访问靶场链接,发现是一个登陆界面,这种存在写入数据的题型一般都是SQL注入

BUUCTF-Web-题目详解(持续更新……)_第32张图片

2、解题

但凡这种登陆界面,先尝试万能密码看看能否破解,如下:

BUUCTF-Web-题目详解(持续更新……)_第33张图片

发现竟然登陆成功了,并且将用户名和密码返回在前端界面上,可见此处有两个回显位置:用户名、密码。使用order by验证一下数据表有几个字段,order by 3的时候正常显示,但是order by 4的时候报错了,由此可知有3个字段,如下:

BUUCTF-Web-题目详解(持续更新……)_第34张图片

利用联合查询查看数据库名称,如下所示,其中and 1=2是为了将union select查询结果显示出来,而不是显示原本查询用户数据表的结果。此时,找到数据库名为geek。

BUUCTF-Web-题目详解(持续更新……)_第35张图片

 利用mysql数据库information_schema数据库检索geek中有哪些数据表,如下:

(关于information_schema数据库和group_concat()函数相关内容请自寻学习)

BUUCTF-Web-题目详解(持续更新……)_第36张图片

此时,发现geek数据库中有两个数据表:geekuser和l0ve1ysq1,geekuser为存放用户的数据表,flag大概率在数据表l0ve1ysq1之中,利用information_schema获取数据表l0ve1ysq1的字段值,如下:

BUUCTF-Web-题目详解(持续更新……)_第37张图片

此时,发现数据表l0ve1ysq1有三个字段:id、username和password,读取一下字段值看看有没有flag,如下:

BUUCTF-Web-题目详解(持续更新……)_第38张图片

调整limit值逐个读取,limit 1,1、limit 2,1、limit 3,1……直到limit 15,1的时候成功读取到flag值,如下: 

BUUCTF-Web-题目详解(持续更新……)_第39张图片

0x05 [极客大挑战 2019]Http 1

即将到来……

你可能感兴趣的:(CTF靶场通关,安全,web安全)