集中实习作业五

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中的字段名

查询字段下的数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值