1.总结SQL注入原理、SQL注入常用函数及含义,SQL注入防御手段,SQL注入常用绕过waf的方法
SQL注入原理
SQL注入(SQL Injection,简称SQLi)是一种通过在SQL查询中插入恶意SQL
代码,来操控数据库系统的攻击方式。攻击者利用应用程序对用户输入的验证不充分,插入恶意的SQL代码,进而绕过认证、窃取数据、修改数据或执行其他未授权的操作。
原理:
用户输入:攻击者在应用程序的输入字段(如登录框、搜索框)中插入恶意SQL代码。
SQL查询构造:应用程序将用户输入直接嵌入到SQL查询语句中。
SQL执行:数据库执行含有恶意代码的SQL查询,导致数据泄露、篡改或破坏。
SQL注入常用函数及含义
UNION:将两个或多个SELECT查询的结果合并在一起,用于获取额外的数据。
SELECT:从数据库中选择数据,可以用于提取信息。
WHERE:过滤记录,添加条件来操控查询的结果。
AND / OR:用于构造复杂的条件,通常与WHERE结合使用。
SLEEP():延迟数据库响应,常用于盲注(Blind SQL Injection)攻击中,检测SQL注入的存在。
LIMIT:限制查询结果的数量,常用于盲注中提取部分数据。
GROUP_CONCAT():将多个行的结果合并为一个字符串,常用于提取多个数据项。
SQL注入防御手段
使用参数化查询:通过准备好的语句(Prepared Statements)和参数化查询,确保用户输入不能直接操控SQL语句。
存储过程:将SQL查询逻辑封装在数据库存储过程中,减少SQL注入的风险。
输入验证:对用户输入进行严格的验证和过滤,确保输入符合预期格式。
最小权限原则:限制数据库用户的权限,只授予必要的权限,减少潜在的破坏范围。
输出编码:对输出数据进行编码,防止脚本注入和其他类型的攻击。
使用ORM框架:使用对象关系映射(ORM)工具来构造SQL查询,通常这些工具会提供防注入保护。
SQL注入常用绕过WAF的方法
使用不同编码:如URL编码、Unicode编码等,将恶意SQL代码以不同的编码方式传递,绕过WAF的过滤。
注释符号:使用SQL注释符号(如--或/* ... */)来隐藏恶意代码的一部分,使WAF无法检测到完整的注入 payload。
变形攻击:通过将恶意SQL代码变形,如拆分语句、重排关键字等,使其绕过WAF的规则检测。
空格替代:使用SQL中的合法替代字符(如空格替代为/**/),使WAF无法识别注入的实际含义。
盲注和时间延迟:通过盲注技术(如使用SLEEP()函数)和时间延迟,绕过WAF对异常请求的检测。
2.sqli-labs通关前5关,并写出解题步骤,必须手工过关,禁止使用sqlmap
第一关:
1)判断是否存在sql注入
2)判断sql语句是否是拼接,且是字符型还是数字型
3)首先知道表格有几列,如果报错就是超过列数,如果显示正常就是没有超出列数。
4)爆出显示位
5)获取当前数据名和版本号
6)爆表
7)爆字段名
8)通过上述操作可以得到两个敏感字段就是username和password,接下来得到该字段对应的内容。
第二关:
1)判断是字符型还是数字型
2)判断sql语句是否是拼接
3)查看表格有几列
4)获取当前数据名和版本号
5)看看表格里面哪一列是在页面显示的
6)爆表
7)爆字段名
第三关:
1)输入?id=1'的时候看到页面报错信息。可推断sql语句是单引号字符型且有括号,所以我们需要闭合单引号且也要考虑括号
2)使用order by 判断数据库有几列:3列回显正常,4列出现报错,说明只有3列
3)使用联合查询union select 判断回显位置
4)爆数据库名
5)表名
6)users表字段
7)用户、密码、内容
第四关:
1)判断sql语句是字符型还是数字型
2)判断sql语句是否是拼接
3)查看表格有几列
4)获取当前数据名和版本号
5)看看表格里面哪一列是在页面显示的
6)爆表爆字段名
第五关:
1)判断sql语句是字符型还是数字型
2)判断sql语句是否是拼接
3)判断数据库的长度
4)爆库名
5)爆表名
6)只有1列 加入参数
7)爆列名
8)爆出数据
3.总结SQLi的手工注入的步骤
1. 识别注入点
输入测试:在应用的输入字段(如URL参数、表单输入等)中尝试输入特殊字符(如单引号'、双引号"、括号()等),观察应用是否返回数据库错误信息,如语法错误或查询失败的提示。
逻辑测试:对于数字型注入点,可以尝试在URL后添加and 1=1和and 1=2,观察页面返回结果是否不同,以判断是否存在注入点。
2. 判断注入类型
字符型与数字型:通过尝试输入特定的SQL语句(如admin' or '1'='1)判断是字符型注入还是数字型注入。
使用and 1=1和and 1=2:如果两者都能回显,则不是数字型注入。
3. 判断闭合方式
输入特殊字符:在注入点尝试输入单引号',观察错误信息中的SQL语句结构,判断如何闭合SQL语句。
使用注释符:在SQL语句中尝试添加注释符(如--、#、/* */)来绕过原始SQL语句的剩余部分,观察是否成功。
4. 猜解字段数量
使用order by:通过逐步增加order by子句中的数字,观察应用是否返回错误,从而确定表中的字段数量。
5. 确定回显点
使用union联合查询:通过构造union select语句,将恶意查询与原始查询结果联合,通过控制union前面查询语句的错误或无效性,使后端数据库仅执行union后面的查询语句,从而确定数据回显的位置。
6. 信息收集
获取数据库信息:利用SQL内置函数(如version()、database())获取数据库的版本和当前数据库名。
查询数据库表名和列名:通过查询information_schema数据库中的tables和columns表,获取当前数据库中的表名和列名。
7. 提取数据
联合查询提取数据:利用已知的表名和列名,构造SQL查询语句,通过union select语句提取目标数据。
8. 绕过安全限制
使用编码和绕过技术:当遇到空格过滤、特殊字符过滤等安全限制时,可以使用编码(如URL编码、十六进制编码)或绕过技术(如使用注释符、双写绕过等)来绕过这些限制。
4.使用sqlmap通过或验证第六关
1)查找数据库
sqlmap -u 'http://192.168.92.1/sqli-labs-master/sqli-labs-master/Less-6?id=1' --dbs
2)查找数据库的表
sqlmap -u 'http://192.168.92.1/sqli-labs-master/sqli-labs-master/Less-5?id=1' -D 'security' -tables
3)查寻字段
sqlmap -u 'http://192.168.92.1/sqli-labs-master/sqli-labs-master/Less-6?id=1' -D 'security' -T 'users' --columns
4)dump
sqlmap -u 'http://192.168.92.1/sqli-labs-master/sqli-labs-master/Less-6?id=1' -D 'security' -T 'users' --dump