今日任务
1.总结SQL注入原理、SQL注入常用函数及含义,SQL注入防御手段,SQL注入常用绕过waf的方法
2.sqli-labs通关前5关,并写出解题步骤,必须手工过关,禁止使用sqlmap
3.总结SQLi的手工注入的步骤
4.使用sqlmap通过或验证第六关
一、SQL注入漏洞
1.漏洞原理
SQL注入漏洞的原理主要基于Web应用程序对用户输入的数据处理不当。当应用程序将用户输入的数据直接拼接到SQL语句中,并且没有对这些数据进行充分的验证和过滤时,攻击者就可以通过构造恶意的输入来篡改SQL语句的结构,从而执行非预期的数据库操作。
2.SQL注入常用函数
1)系统信息获取函数
- version():返回数据库的版本信息。
- user():返回当前数据库用户名。
- database():返回当前数据库名。
- @@datadir:返回数据库文件存放路径。
- @@basedir:返回数据库安装路径。
- @@version_compile_os:返回操作系统版本。
- system_user():返回系统用户名(在某些数据库系统中可用)。
- current_user():返回当前数据库连接的用户名。
- session_user():返回与当前会话相关联的用户名。
2)字符处理函数
- concat():无分隔符地连接字符串。
- concat_ws():指定分隔符地连接字符串。这个函数需要两个以上的参数,第一个参数是分隔符,后续参数是待连接的字符串。
- group_concat():将多个字符串值连接成一个字符串,并以逗号分隔。这个函数常用于将某个列的所有值连接成一个单一的字符串。
- substring() / substr() / mid():这三个函数功能相似,都是用来截取字符串的一部分。
substring(str, pos, len)
、substr(str, pos, len)
和mid(str, pos, len)
中的str
是要截取的字符串,pos
是开始位置(注意,位置计数通常从1开始),len
是要截取的字符数。 - left():返回字符串最左边的几个字符。
- right():与
left()
函数相反,返回字符串最右边的几个字符。 - length():返回字符串的长度。
- ascii() 和 ord():这两个函数都用于返回字符串最左边字符的ASCII值。
- char():将ASCII值转换为对应的字符。
3)延时函数
- sleep():使当前语句暂停执行指定的秒数。这个函数常用于时间盲注攻击中,通过测量响应时间来推断数据库中的信息。
4)其他辅助函数
- if():条件函数,如果第一个参数为真,则返回第二个参数的值,否则返回第三个参数的值。这个函数在SQL注入中常用于构造逻辑判断。
- load_file():读取服务器上的文件内容。这个函数在文件读取权限足够的情况下,可以用于读取敏感文件。
- into outfile:将查询结果写入到服务器上的文件中。这个函数在具有写文件权限的情况下,可以用于写入恶意代码或敏感数据。
- 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. 清除痕迹
- 清理日志:删除或修改数据库中可能记录攻击行为的日志信息。
- 恢复数据:如果进行了数据篡改,尝试恢复原始数据以避免被发现。