重邮毕业实习—day5

今日任务

1.总结SQL注入原理、SQL注入常用函数及含义,SQL注入防御手段,SQL注入常用绕过waf的方法
2.sqli-labs通关前5关,并写出解题步骤,必须手工过关,禁止使用sqlmap
3.总结SQLi的手工注入的步骤
4.使用sqlmap通过或验证第六关

一、SQL注入漏洞

1.漏洞原理

        SQL注入漏洞的原理主要基于Web应用程序对用户输入的数据处理不当。当应用程序将用户输入的数据直接拼接到SQL语句中,并且没有对这些数据进行充分的验证和过滤时,攻击者就可以通过构造恶意的输入来篡改SQL语句的结构,从而执行非预期的数据库操作。

2.SQL注入常用函数

        1)系统信息获取函数

  1. version():返回数据库的版本信息。
  2. user():返回当前数据库用户名。
  3. database():返回当前数据库名。
  4. @@datadir:返回数据库文件存放路径。
  5. @@basedir:返回数据库安装路径。
  6. @@version_compile_os:返回操作系统版本。
  7. system_user():返回系统用户名(在某些数据库系统中可用)。
  8. current_user():返回当前数据库连接的用户名。
  9. session_user():返回与当前会话相关联的用户名。

        2)字符处理函数

  1. concat():无分隔符地连接字符串。
  2. concat_ws():指定分隔符地连接字符串。这个函数需要两个以上的参数,第一个参数是分隔符,后续参数是待连接的字符串。
  3. group_concat():将多个字符串值连接成一个字符串,并以逗号分隔。这个函数常用于将某个列的所有值连接成一个单一的字符串。
  4. substring() / substr() / mid():这三个函数功能相似,都是用来截取字符串的一部分。substring(str, pos, len)substr(str, pos, len)mid(str, pos, len)中的str是要截取的字符串,pos是开始位置(注意,位置计数通常从1开始),len是要截取的字符数。
  5. left():返回字符串最左边的几个字符。
  6. right():与left()函数相反,返回字符串最右边的几个字符。
  7. length():返回字符串的长度。
  8. ascii() 和 ord():这两个函数都用于返回字符串最左边字符的ASCII值。
  9. char():将ASCII值转换为对应的字符。

        3)延时函数

  1. sleep():使当前语句暂停执行指定的秒数。这个函数常用于时间盲注攻击中,通过测量响应时间来推断数据库中的信息。

        4)其他辅助函数

  1. if():条件函数,如果第一个参数为真,则返回第二个参数的值,否则返回第三个参数的值。这个函数在SQL注入中常用于构造逻辑判断。
  2. load_file():读取服务器上的文件内容。这个函数在文件读取权限足够的情况下,可以用于读取敏感文件。
  3. into outfile:将查询结果写入到服务器上的文件中。这个函数在具有写文件权限的情况下,可以用于写入恶意代码或敏感数据。
  4. extractvalue() 和 updatexml():这两个函数是MySQL特有的,用于对XML数据进行处理。在SQL注入中,它们常被用于构造报错注入攻击,通过触发数据库错误来泄露信息。

3.SQL注入防御手段

        1. 使用预编译语句和参数化查询

        预编译语句(Prepared Statements)和参数化查询是预防SQL注入的最有效方法之一。通过预编译SQL语句,可以确保SQL语句的结构在编译时就确定下来,之后传入的参数不会改变语句的结构,因此可以避免注入攻击。这种方式在大多数编程语言中都有支持,如Java的PreparedStatement、Python的SQLAlchemy框架等。

        2. 验证和过滤用户输入

        对所有用户输入进行严格的验证和过滤是防范SQL注入的重要手段。验证用户输入的数据是否符合预期的格式和类型,并过滤掉特殊字符,如单引号、双引号、分号等,这些字符在SQL注入中常被用于改变SQL语句的结构。可以使用正则表达式、输入验证库等工具来辅助验证和过滤。

        3. 使用ORM框架

        对象关系映射(ORM)框架是一种将对象数据与关系型数据库之间相互转换的技术。ORM框架可以自动处理参数化查询和过滤用户输入等操作,从而提供一定程度的安全性。常见的ORM框架包括Django(Python)、Hibernate(Java)、Entity Framework(.NET)等。

        4. 限制数据库用户权限

        为应用程序使用的数据库账户只赋予必要的权限,避免使用具有高级权限的账户。这样即使发生SQL注入攻击,攻击者能做的也非常有限,无法对数据库进行大规模的数据泄露或破坏。

        5. 使用Web应用防火墙(WAF)

        WAF是一种可以在网络上防止各种攻击的安全设备。对于Web应用程序,WAF可以检测和拦截各种类型的攻击,包括SQL注入攻击、跨站脚本攻击(XSS)等。WAF可以提供实时的威胁检测和防护,增强Web应用程序的安全性。

        6. 定期更新和打补丁

        保持数据库管理系统(DBMS)和应用程序的更新到最新,及时安装数据库厂商提供的安全更新和补丁。修补已知的安全漏洞可以减少被SQL注入攻击的风险。

        7. 安全编码规范

        制定并执行严格的安全编码规范,确保开发人员在编写代码时遵循最佳的安全实践。这包括使用安全的编程语言和函数、避免使用不安全的数据库操作等。

        8. 安全审计和代码审查

        定期进行安全审计和代码审查,检查潜在的安全漏洞并及时修复。这有助于发现潜在的SQL注入风险点,并采取相应的措施进行修复。

4.SQL注入常用绕过waf的方法

        1. 注释符号绕过

  • 攻击者可以使用SQL注释符号(如--/**/#)来隐藏恶意SQL代码,使其不会被WAF识别或过滤。例如,在查询中使用--来注释掉后面的SQL代码,从而绕过WAF的检测。

        2. 编码绕过

  • 攻击者可以使用不同的字符编码来绕过WAF的检测。这包括URL编码、Unicode编码等。例如,将admin编码为%61%64%6D%69%6E,或将SQL关键字进行URL编码,以绕过WAF的过滤。

        3. 大小写绕过

  • 利用数据库系统对大小写不敏感的特性,将SQL关键字的大小写进行变换。例如,将SELECT写成SeLeCt,以绕过基于大小写的过滤器。

        4. 特殊字符绕过

  • 使用特殊字符(如引号、空格的替代字符等)来构造恶意SQL代码。例如,使用%09%0a%0b%0c%0d等替代空格,或使用/**//*somewords*/等注释符号来绕过WAF对空格的过滤。

        5. 逻辑漏洞绕过

  • 利用应用程序或数据库的逻辑漏洞,使用盲注技术绕过WAF的检测。例如,通过构造特定的查询条件,使WAF无法识别其恶意性,但数据库却能正常执行。

        6. 关键字替换

  • 如果WAF对特定的SQL关键字进行了过滤,可以尝试使用它们的等效或类似代码进行替换。例如,使用CONCAT()函数替换+操作符,或使用MID()SUBSTR()等函数替换SUBSTRING()函数。

        7. 混淆技术

  • 通过在SQL查询中插入大量的无用代码或注释,混淆WAF的检测机制。这种方法虽然简单,但在某些情况下可能有效。

        8. HTTP参数污染

  • 提供多个具有相同名称的HTTP参数,并赋予它们不同的值,以混淆WAF的检测。这种方法利用了不同Web服务器在处理HTTP参数时的差异。

        9. 缓冲区溢出

  • 如果WAF存在缓冲区溢出漏洞,攻击者可以通过构造特定的输入来触发该漏洞,从而导致WAF崩溃或无法正常工作。然而,这种方法需要较高的技术水平和对WAF内部机制的深入了解。

        10. 编码与大小写变换结合

  • 将编码和大小写变换结合使用,可以进一步提高绕过WAF的成功率。例如,将SQL关键字进行URL编码并变换大小写后插入查询中

二、sqli-labs通关记录

        搭建sqli-labs靶场

        打开小皮面板,运行Apache和MySQL组件

        访问本地网址http://127.0.0.1/sqli-labs-master/,并进行初始化

Less-1

Less-2

Less-3

三、SQLi的手工注入的步骤

1. 信息收集

  • 确定目标:明确攻击目标,包括网站地址、可能存在的注入点等。
  • 扫描工具:使用工具如nmap、dirb等进行端口扫描和目录扫描,收集目标网站的基本信息。
  • 页面分析:通过查看网页源代码,分析表单提交方式(GET或POST)、参数类型等,确定可能的注入点。

2. 探测注入点

  • 输入测试:在输入框中尝试输入特殊字符(如单引号'、双引号"、注释符号--等),观察页面反馈,判断是否存在SQL注入漏洞。
  • 错误信息:利用数据库错误消息中的信息,如“语法错误”、“未知列”等,来识别数据库的类型和版本。

3. 确定注入类型

  • 基于错误的注入:通过触发数据库错误消息来获取数据库信息。
  • 基于布尔的盲注:根据页面是否返回特定信息(如True/False)来判断SQL语句的执行结果。
  • 基于时间的盲注:利用SQL语句执行时间的长短来判断数据库信息。
  • 联合查询(UNION SELECT):利用UNION SELECT语句将额外的SQL查询结果与原始查询结果合并返回。

4. 提取数据

  • 确定字段数量:使用ORDER BY语句来确定查询结果中的字段数量。
  • 确定回显点:通过UNION SELECT语句和特定的函数(如version()、database()等)来确定哪些位置可以显示数据。
  • 提取数据库信息
    • 获取数据库版本和当前数据库名。
    • 查询数据库中的表名,通常使用information_schema.tables表。
    • 查询特定表中的字段名,通常使用information_schema.columns表。
    • 提取表中的数据,特别是敏感数据如用户名和密码。

5. 权限提升

  • 尝试提权:如果可能,尝试利用数据库中的漏洞或配置不当来提升权限,如读取系统文件、执行系统命令等。

6. 维持访问

  • 后门植入:在数据库中植入后门,以便后续持续访问和控制目标系统。

7. 清除痕迹

  • 清理日志:删除或修改数据库中可能记录攻击行为的日志信息。
  • 恢复数据:如果进行了数据篡改,尝试恢复原始数据以避免被发现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值