SQL注入原理
SQL注入是一种针对后台数据库的攻击手段,其原理在于攻击者通过精心构造的恶意SQL命令插入到Web表单的输入域或页面请求中,当服务器执行这些SQL命令时,可以实现对数据库的非法操作,如猜解、查询、删除、添加数据等。SQL注入的漏洞条件通常包括输入参数用户可控、参数被带入数据库查询且未经过滤或验证。
SQL注入常用函数及含义
concat():拼接字符串,直接拼接,字符之间没有符号。
concat_ws():指定符号进行字符串拼接。
group_concat():将多个列的值以逗号分隔的方式连接成一个字符串。
length():返回指定对象的长度,如数据库名的长度。
left()和right():分别从字符串的左端或右端开始,返回指定长度的字符。
substr()和substring():截取字符串的一部分。
ascii():返回字符串最左字符的ASCII值。
sleep():使数据库暂停执行指定的时间(秒),常用于盲注攻击中测试响应时间。
if():根据条件执行不同的SQL语句,常用于条件判断。
updatexml()和extractvalue():这两个函数常用于通过XML解析错误来报错注入,从而获取数据库信息。
load_file():读取服务器上的文件,需要相应的权限。
SQL注入防御手段
对用户进行分级管理:严格控制用户的权限,禁止普通用户执行敏感操作。
参数化查询:在编写SQL语句时,通过参数化查询来传递变量,避免直接将用户输入拼接到SQL语句中。
输入验证:对用户输入的数据进行严格验证和过滤,特别是过滤掉单引号、双引号等特殊字符。
使用安全参数:利用数据库提供的安全参数来确保输入的安全性。
定期扫描和检测:使用专业的扫描工具定期检测系统中的SQL注入漏洞。
多层验证:在客户端和服务器端都进行输入验证,确保输入数据的安全性。
数据库信息加密:对敏感数据库信息进行加密存储,防止数据泄露。
SQL注入常用绕过waf的方法
注释符号绕过:使用SQL注释符号(如–、/**/、#)来隐藏恶意SQL代码,使其不会被WAF识别或过滤。
编码绕过:通过URL编码、Unicode编码等方式来隐藏恶意SQL代码,绕过WAF的检测。
大小写绕过:利用数据库系统对大小写不敏感的特性,将SQL关键字写成不同的大小写形式来绕过基于大小写的过滤器。
特殊字符绕过:使用引号、逻辑运算符等特殊字符构造恶意SQL代码,绕过WAF的检测。
逻辑漏洞绕过:利用应用程序或数据库的逻辑漏洞,结合盲注技术来绕过WAF的检测。
sqli-labs前5关
第一关
提示输入变量id
令id=1
令id=2-1,结果与id=1不同,说明为字符型
判断表格有几列,如果报错就是超过列数,如果显示正常就是没有超出列数。
获取当前数据名和版本号
爆表
爆字段名
爆user列和password列
第二关
输入单引号可以看到报错,报错信息看不到数字,sql语句应该是数字型注入
测试到第 4 列无回显,说明表中一共有 3 列
用户、密码、内容
第三关
测试id=2-1的结果与id=2的结果一致,说明为字符型
输入的单引号成功闭合了原始查询语句中id变量前面的那个单引号;但单引号之后还有“)”
说明id变量被括号包裹。因此加个反括号闭合原始查询语句中的括号
使用和前面同样的union注入方式
第四关
输入id=1'未报错,字段为int型
列数为3
确定具体字段位置
确定数据库
爆出当前数据库user表所有username和password
第五关
测试id=1
加单引号,报错
利用updatexml()函数,在其第二个参数处执行SQL语句,这样就会在报错信息中显示出查询结果
爆表名
爆列名
爆出数据
总结SQLi的手工注入的步骤
1.判断有无注入点
目标:确定应用程序的输入点是否存在SQL注入漏洞。
方法:尝试在输入点插入单引号(')、双破折号(--)等特殊字符,并观察应用程序的响应。如果应用程序返回数据库错误消息或行为异常,则可能存在SQL注入漏洞。
使用and 1=1和and 1=2等逻辑判断语句,观察页面返回内容是否有变化。如果and 1=1导致页面正常显示,而and 1=2导致页面异常或返回不同的内容,则进一步确认存在SQL注入的可能性。
2.猜解列名数量
目标:确定数据库表中列的数量,以便后续构造正确的UNION SELECT语句。
方法:在注入点后面添加ORDER BY 数字语句,逐渐增加数字的值,直到出现错误消息(如“未知的列”或“索引超出范围”等)。出现错误时,前一个数字通常就是表中的列数。
3.判断回显点
目标:确定哪些位置可以回显查询结果,以便在后续步骤中显示数据库信息。
方法:使用UNION SELECT语句结合已知数量的列和自定义数据(如1,2,3,...),尝试在页面中不同位置显示这些数据。观察哪些位置能够显示自定义数据,这些位置就是可能的回显点。
使用CONCAT()等函数将多个查询结果合并为一个字符串,并尝试在回显点显示。
4.信息收集
目标:收集数据库的结构信息,包括数据库版本、当前数据库名、数据库中的表名及列名等。
使用sqlmap通过或验证第六关
测试一下是否存在SQL注入点
查看数据库
查看数据库中的表
获取users中的字段名
查询字段下的数据