DVWA实验--SQL手工注入(Low)
什么是SQL注入?
SQL Injection,即SQL注入,是指攻击者通过注入恶意的SQL命令,破坏SQL查询语句的结构,从而达到执行恶意SQL语句的目的。
Sql 注入带来的威胁主要有如下几点
- 猜解后台数据库,这是利用最多的方式,盗取网站的敏感信息。
- 绕过认证,列如绕过验证登录网站后台。
- 注入可以借助数据库的存储过程进行提权等操作
自动化的注入神器sqlmap固然好用,但还是要掌握一些手工注入的思路,下面简要介绍手工注入(非盲注)的步骤。
1.判断是否存在注入,注入是字符型还是数字型
2.猜解SQL查询语句中的字段数
3.确定显示的字段顺序
4.获取当前数据库
5.获取数据库中的表
6.获取表中的字段名
7.下载数据
我们使用有现成漏洞的dvwa实验环境来进行注入,选择安全级别为LOW
查看SQL注入测试页面的源码:
通过源码我们发现它对参数没有任何的过滤 直接带入数据库进行查询 我们猜测肯定给存在字符型sql注入
开始工作:
1. 判断是否存在注入,注入是字符型还是数字型
输入1,
查询成功。
输入1’and ‘1’ =’2,查询失败,返回结果为空:
输入1’or ‘1234 ’=’1234,查询成功:
说明存在字符型注入
接下来我们猜解sql查询语句中的字段数 (逐渐增加order by后面的数字的大小进行猜测)
当输入3#时就出现了错误,说明只有两列的数据 查询的表的字段数是2
union 运算符可以将两个或两个以上 select 语句的查询结果集合合并成一个结果集合显示,即执行联合查询。需要注意在使用 union 查询的时候需要和主查询的列数相同,而我们之前已经知道了主查询列数为 2,接下来就好办了。
输入1' union select database(),user()#
进行查询 :
- database()将会返回当前网站所使用的数据库名字.
- user()将会返回执行当前查询的用户名.
同理我们再输入 1' union select version(),@@version_compile_os#
进行查询:
version() 获取当前数据库版本.
@@version_compile_os 获取当前操作系统
进行回显:
接下来我们尝试获取 dvwa 数据库中的表名。information_schema
是 mysql 自带的一张表,这张数据表保存了 Mysql 服务器所有数据库的信息,如数据库名,数据库的表,表栏的数据类型与访问权限等。该数据库拥有一个名为 tables 的数据表,该表包含两个字段 table_name 和 table_schema,分别记录 DBMS 中的存储的表名和表名所在的数据库。
我们输入1' union select table_name,table_schema from information_schema.tables where table_schema= 'dvwa'#
进行查询:
通过上图返回信息,我们再获取到:dvwa 数据库有两个数据表,分别是 guestbook 和 users .
接下来我们获取表中的字段名 1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users'#
其中,user和password正是我们想要的
下面我们获得字段中的数据 1' union select user,password from users#
通过md5解密即可得到密码