说明:本文持续更新BUUCTF平台上web的题解WP,请持续关注……
0x01 [SUCTF 2019]EasySQL1(介绍2种解法)
1、审题
打开靶场后,是一个POST表单,变量名为query(可查看源代码或BurpSuite抓包获取变量名),如下:
2、解法一
- 常规办法判断注入点及注入类型,发现回显是Nonono,猜测单双引号、union select、报错注入均被过滤
- 接下来,尝试一下堆叠注入,果然存在堆叠注入漏洞,利用堆叠注入查看数据库和数据表,如下:
- 在上面步骤中我们知道有一个名为Flag的数据表,尝试查看一下该数据表的字段名都有哪些,如下图所示,然而并没有得到我们想要的结果,web界面回显Nonono,造成这个的原因应该是from关键字被过滤了。
- 回到表单本身,通过POST表单提交的变量肯定会被拼接到SQL语句里面,形成诸如select $_POST['query'] from Flag之类的SQL语句。因此,我们尝试构造select * from Flag这样的语句,其中星号()用来代替其他字段,SELECT语句会返回数据表的所有字段值,然而当我们直接传递的时候却没有任何回显,如下:
构造select * from Flag语句
此时,没有输出Nonono,大致可判断:**星号(*)没有被过滤掉,只是被某种方式暂时屏蔽 了** (记下这个,涉及后面第二种解法)
- 我们知道Select查询数据时可以指定表的字段名或者将数字作为字段名,如下所示:
- 综上,我们构造(*,6,9)来尝试绕过对星号(*)的屏蔽,果然成功得到flag,如下:
** 3、解法二**
在解法一中,我们知道“星号(*)没有被过滤,只是被某种方式暂时屏蔽了”,那到底是如何屏蔽的呢?
这里首先介绍一下Mysql的一个逻辑运算符:逻辑或(||、OR),逻辑运算符用来判断表达式的真假。如果表达式是真,结果返回 1。如果表达式是假,结果返回 0。
来看下面这个例子感受一下逻辑或的作用:
回到题目中,我们输入任何非0的数字,其返回值均为1,因此在构建SQL语句的时候大概率使用了逻辑或运算符,形成诸如select $_POST['query'] || flag_value from Flag的SQL语句,这样:
- 当我们POST传递非0数字时,逻辑运算结果为真,返回1
- 当我们POST传递数字0时,逻辑运算结果为假,返回0(此时前端无回显)
select 1 || flag_value from Flag
综上,我们解题的思路变得清晰:绕过逻辑或运算符。在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
最终,成功获取了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看看效果:
可见后台成功执行了“ping 127.0.0.1”这条命令,那么本题基本上就是考虑命令执行了,接下来便是使用管道符拼接命令了,常见管道符有: **||、|、&、&&、; **逐个测试看看哪个可用
发现封号(;)可用,于是拼接ls(linux)或dir(windows)命令,查看目录下是否有flag相关的文件,如下:
有个flag.php,flag值大概率在这个文件里面,浏览器访问flag.php试试,发现无任何回显,接下来需要想办法读取flag.php的源文件内容,使用cat flag.php读取:
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!”
此时,应该是后台过滤了flag关键字。在命令执行漏洞钟,当关键字被过滤的时候,一般有两个绕过思路:
思路一:base64编码绕过,将base64编码结果重定向到bash、sh、zsh等linux shell
echo "bHM="|base64 -d|bash 表示将bHM=进行base64解码后的字符串传递给shell执行(此处shell是bash,也可是sh/zsh等)
思路二:base64编码绕过,利用反引号执行系统命令
思路三:定义变量,拼接命令(Linux)
此处先使用思路三进行尝试,如下:(思路一、思路二见解题方法二)
此时,页面无过滤提示信息,但是却看不到flag信息,查看页面源代码,终于找到flag,晕啊……
没太明白此处为何查看源码才能找到flag,查看index.php查看其中执行过滤的相关代码,如下:
preg_math()函数使用正则表达式匹配字符串,print_r() 函数用于打印变量,以更容易理解的形式展示。之所以cat flag.php没有直接回显出flag值,是因为$flag被包裹在<?php ?>之中,而php代码再前端界面是无法显示的,因此需要查看源码。
3、解题方法二
使用base64编码绕过关键字过滤,对cat flag.php进行base64编码:Y2F0IGZsYWcucGhw。
第一种姿势:echo Y2F0IGZsYWcucGhw|base -d|sh,使用$IFS$1代替空格
第二种姿势:echo Y2F0IGZsYWcucGhw|base64 -d
,使用$IFS$1代替空格
0x03 [极客大挑战 2019]Secret File 1
1、审题
开启靶机,打开靶场连接,如下:
2、解题
只看题干有点不知所云,先查看源代码试试能不能找到线索,果然有个Archive_room.php文件:
浏览器访问Archive_room.php文件,如下所示:
点击红色SECRET按钮,页面跳转如下:
此时,既然提示“没看清么?回去再仔细看看吧”,那么在点击红色SECRET按钮时使用BurpSuite抓包分析(使用Repeater模块放包),看看能不能找到有用信息:
此时可以发现,点击红色SECRET按钮后,页面跳转至action.php文件,而action.php向服务器请求了一段html代码,从这段代码钟发现有个secr3t.php文件,浏览器访问该文件试试:
可见,此时存在文件包含漏洞,并且提示flag放在了flag.php里,接下来使用伪协议php://filter读取flag.php文件,如下:
对读取的base64编码内容进行解码,如下:
成功获取到flag值,不容易啊,一环套一环,全是套路……
0x04 [极客大挑战 2019]LoveSQL 1
1、审题
开启靶机,访问靶场链接,发现是一个登陆界面,这种存在写入数据的题型一般都是SQL注入
2、解题
但凡这种登陆界面,先尝试万能密码看看能否破解,如下:
发现竟然登陆成功了,并且将用户名和密码返回在前端界面上,可见此处有两个回显位置:用户名、密码。使用order by验证一下数据表有几个字段,order by 3的时候正常显示,但是order by 4的时候报错了,由此可知有3个字段,如下:
利用联合查询查看数据库名称,如下所示,其中and 1=2是为了将union select查询结果显示出来,而不是显示原本查询用户数据表的结果。此时,找到数据库名为geek。
利用mysql数据库information_schema数据库检索geek中有哪些数据表,如下:
(关于information_schema数据库和group_concat()函数相关内容请自寻学习)
此时,发现geek数据库中有两个数据表:geekuser和l0ve1ysq1,geekuser为存放用户的数据表,flag大概率在数据表l0ve1ysq1之中,利用information_schema获取数据表l0ve1ysq1的字段值,如下:
此时,发现数据表l0ve1ysq1有三个字段:id、username和password,读取一下字段值看看有没有flag,如下:
调整limit值逐个读取,limit 1,1、limit 2,1、limit 3,1……直到limit 15,1的时候成功读取到flag值,如下:
0x05 [极客大挑战 2019]Http 1
即将到来……
版权归原作者 AkangBoy 所有, 如有侵权,请联系我们删除。