网络对抗课题4.3.1 SQL注入原理与实践

网络对抗课题4.3.1 SQL注入原理与实践

原理

SQL注入漏洞是指在Web应用对后台数据库查询语句处理存在的安全漏洞。也就是,在输入字符串中嵌入SQL指令,在设计程序中忽略对可能构成攻击的特殊字符串的检查。

后台数据库将其认作正常SQL指令后正常执行,可能实现对后台数据库进行各种操作,甚至造成破坏后台数据库等严重后果。

SQL注入一般分为普通注入和盲注。

普通注入:后台数据库会回显有价值的提示信息,通过这些可能的报错信息可以更容易地进行注入,适合新手入门训练。

盲注:后台管理员在给出错误页面时,没有提供详细错误信息。攻击者需要运用脚本通过仅有的判断信息(比如时间差)对表中的每一个字段进行探测,从而实现注入。

本次实践主要是普通注入。

环境搭建

1.靶机组成:wampserver + DVWA-1.9 + MYSQL

2.搭建过程:

(1)下载安装wamp和MYSQL

(2)下载DVWA安装包,解压缩到wampserver下的www目录

(3)在地址栏输入http://localhost/DVWA-1.9/setup.php

(4)进入setup界面,点击“Create/Reset Database”按钮时如果出现“Could not connect to the database - please check the config file.”的错误信息,那么请打开DVWA-1.9/config/config.inc.php文件,将下面这段内容

$_DVWA[ 'db_password' ] = 'p@ssw0rd';

中的密码部分替换成在步骤2中设置的MySQL root用户的密码(此处为空,直接把'p@ssw0rd'改为''就行了,即密码为空),再重新创建数据库即可。

(5)进入链接http://localhost/DVWA-1.9/login.php,默认的用户名和密码为“admin/password”


(6)调整实验难度为简单,并且打开左边SQL注入按钮,进入训练页面。



手工注入实践

1.输入框中键入 ' 并且提交

回显:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''''' at line 1

数据库发现错误字符 ' 说明可能存在注入漏洞,并且可以知道后台数据库是MYSQL。说明这个系统可能通过回显让我们知道后台的关键数据。

分析:假设后台查询语句为:select 列 from 表 where ID= ? ,那么当在SQL语句后加上 or 1=1 ,则会变成 : select 列 from 表 where ID= ? or 1=1 ,或许能将数据全部显示。

2.输入框中键入 'or 1=1' 并且提交

回显:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '''' at line 1

分析:说明SQL语句仍然有错误,或许整个注释掉SQL语句后面的部分能够解决问题。在MYSQL中使用 -- 来完成注释工作。

3.输入框中键入 'or 1=1 --' 并且提交

回显:

分析:假设后台查询语句为:select 列 from 表 where ID= '?' ,那么提交后查询语句变为: select 列 from 表 where ID= ''or 1=1 --'' 。-- 后部分注释掉,实际执行语句为:select 列 from 表 where ID= ''or 1=1 条件永真,从而显示全部信息。同时,我们可以知道一共有5列。

总结:首先发现SQL注入漏洞,找到合适的终止字符构造可执行的SQL语句,找到返回所有行的方法,最后找到特殊的注释SQL字符忽略剩余SQL语句。

分析:找到select语句执行方法后,我们可以使用UNION语句查找更多信息并显示。

Union的用法为:select [列]1,...,[列]n from [表] Union select [列]1,...,[列]n from [表]

其中子select查询语句的列数必须相同。

4.输入框中键入 'Union select 1,--' 并且提交

回显:

分析:发现列数不对,应该为两列

5.输入框中键入 'Union select 1,2--'并且提交

回显:

分析:证明其查询的列数为2列。

6.输入框中键入 'Union select 1,table_name from INFORMATION_SCHEMA.tables -- '并且提交

回显:


分析:通过对系统表INFORMATION_SCHEMA的查询,可以看到每一个表的表名。从中可以看到两行 guestbook、users应该是DVWA所用表。

7.输入框中键入 'Union select 1,column_name from INFORMATION_SCHEMA.columns where table_name = 'users' -- '并且提交

回显:

分析:通过这个语句,我们可以看到users表中的全部列的列名。从中可以发现password列。

8.输入框中键入 'Union select NULL,password from users -- '并且提交

回显:

分析:这样我们可以得到密码的MD5值。

通过concat()函数,我们可以连接参数,组成字符串。

使用方法:CONCAT(str1,str2,…)

9.输入框中键入 'Union select password,concat(first_name,' ',last_name,' ',user) from users -- ' 并且提交

回显:

分析:这样可以方便我们查询多种数据结果。

工具注入实践

各种工具对SQL注入的排名情况:

排名 名称
1 Wapiti
2 Andiparos
3 Paros Proxy
6 Burp Suite
9 W3AF

本次实践使用工具为kali系统下内置的Sqlmap。它由Python语言开发,需要安装2.4版本后的Python解释器,支持 Mysql,Oracle,SQLserver ,access,sqlite等主流数据库。

它支持五种SQL注入技术:基于布尔值得盲注,基于时间的盲注,基于错误的盲注,UNION查询和stacked查询。

同时,它可以自动识别后台账户的哈希口令,并通过字典进行暴力破解。

最后,当数据库是Mysql,PostgreSQL和 SQL Server时,支持上传和下载数据库文件。

1.打开kali的默认浏览器iceweasel的插件Tamper Data。然后访问http://localhost/DVWA-1.9/login.php

2.提交数据aa,Tamper Data选择Tamper,可以看到当前会话的cookie和请求参数等。


3.如图使用sqlmap,附上-u 后跟目标url,--cookie=后跟获取的cookie

结果如下:


分析:工具显示的结果非常丰富。首先它探测出了URL中的id参数存在注入点,并且包含基于布尔变量,基于错误,基于Union联合查询,基于时间的注入类型。同时,目标主机的操作系统为win,Web应用平台为Apache 2.4.9,PHP 5.5.12,后台数据库为MySQL5.0。相关信息被保存在/usr/share/sqlmap/output/192.168.1.4目录下

4.在上述语句后加上 --dbs -v 0,--dbs可以根据所识别的数据库类型来探测包含的数据库名称。-v 参数表明显示过程的复杂程度,从0到6一共7级,0最简单,只显示python错误以及严重的信息。

结果:

分析:结果显示有5个可用数据库,其中dvwa和information_schema应该为我们想找的数据库。后面3个为我主机mysql中原本的数据库。正常查看数据库可见:

5.将指令后缀改为-D dvwa --tables,可以查询指定数据库dvwa下的所有表的名字

结果:

分析:可知在dvwa数据库下有两张表guestbook和users,其中users为我们感兴趣的表。

6.将指令后缀改为-D dvwa -T users --columns,可以查询指定数据库dvwa和指定表users下的所有列的名字

结果:

分析:可见users表下有很多列,我们希望把它们都保存下来。--dump选项可以帮我们完成这项工作

7.将指令后缀改为-D dvwa --tables -T users --columns --dump

结果:






分析:当工具检测到在列password中可能有密码哈希值时,问我们是否想它们另外存储并用其他工具破解。通过选择所用字典攻击模式后,可见工具帮我们完成密码哈希值的破解,并且最终统一显示并保存为csv文件。通过正常查看数据库可以验证结果

总结

通过这次sql注入实践,首先我了解了很多适合用于渗透的工具和练习的靶机环境,同时对于web应用建设的基本环节也有了进一步加深理解。同时,对于数据库的重要性也有了更深的认识。然后,通过sql手工注入操作,我又加深了对常规sql操作的熟练程度,也从一个新的角度来看待sql语句。同时,我也学习到了cookie在web访问中的重要性。最后,通过对sqlmap工具的使用,我完成了一次完整的渗透并拖库,破解数据的过程。这对于我熟悉现实中的注入常规操作非常有利。

原文地址:https://www.cnblogs.com/20135319zl/p/5737119.html