SQL注入详细分析
sql注入
一、sql注入
1.什么是sql注入
官方定义:SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。
个人理解:我觉得,sql注入就是利用,数据库和后端交互的时候,没有严谨的思路产生的漏洞,可以利用这个漏洞找到数据库里面的数据(这是非常可怕的一件事情)
2.sql注入的原理
通过利用开发者没有过滤干净的交互过程,以sql语句来针对数据进行注入。(这是一个非常繁琐的过程,尤其是需要手工注入的时候,还有就是如果遇到盲注那么就更繁琐了,后期会讲到盲注)
3.sql注入的危害
1、攻击者未经授权可以访问数据库中的数据,盗取用户的隐私以及个人信息,造成用户的信息泄露。
2、通过操作数据库对某些网页进行篡改;
3、修改数据库一些字段的值,嵌入网马链接,进行挂马攻击;攻击者进而可以对网页进行篡改,发布一些违法信息等。
4、服务器被远程控制,被安装后门。可以对数据库的数据进行增加或删除操作,例如私自添加或删除管理员账号。
5、数据库被恶意操作:数据库服务器被攻击,数据库的系统管理员帐户被窜改。
6、破坏硬盘数据,导致全系统瘫痪;
二、类型检测
1.sql注入类型检测
sql注入检测方式有两种,一种是手工检测,另一种是自动检测。
手工检测很好理解,需要在url中写一些语句,形成新的命令,按照渗透者的命令找到想要的数据,这个过程是一个非常麻烦的过程,有时候还需要burp抓包进行配合,而且还需要猜测数据库名称是什么,依赖经验,而且耗时耗力,于是很多渗透者就像能不能写一款工具进行自动注入,可以节省时间和精力呢?
于是就出现了自动注入,自动注入也就是利用工具进行注入,sqlmap算是一个非常好用,并且用的人数最多的软件。
这里给大家个网址学习sql语句
网址链接
2.常见的类型有哪些
类型 | 介绍方式 |
---|---|
字符型 | 手动注入(自动注入后期介绍) |
数字型 | 手动注入(自动注入后期介绍) |
搜索型 | 手动注入(自动注入后期介绍) |
xx型 | 手动注入(自动注入后期介绍) |
2.1字符型检测
判断是否存在字符型注入
- 单引号判断
输入:http://url/?id=1'
如果页面回显错误进行注释符判断 - 注释符判断
输入:http://url/?id=1'#
这时如果页面回显正常进行 - and 1=1判断
输入:http://url/?id=1' and 1=1#
这时如果回显正常那么尝试更改数值 - and 1=2判断
输入:http://url/?id=1' and1=2#
如果页面回显错误进行,说明是存在字符型注入
2.1.1实战演示
-
'
检测,点击查询
回显:
说明报错了,而且是因为有几个分号报错。 -
注释
#
回显正确:
说明 大概率有一个字符型注入
2.2数字型检测
这里下拉框意思为id=
2.2.1实战演示
- 下拉框为
1
2. 下拉框为2
回显不一样,说明大概率有一个数字型注入
2.3搜索型检测
2.3.1实战演示
-
'
检测
回显错误:
-
输入
#
回显数据说明是输入框的注入
2.4.xx型检测
2.4.1实战演示
-
基础判断
'
这里显示闭合方式需要一个) -
输入
')#
回显正确
回显错误
')or 1=1#
检测到数据,说明这是一个xx注入
三、sql注入的重要参数
1.重要函数
函数 | 含义 |
---|---|
version() | 数据库版本 |
database() | 当前数据库名 |
user() | 用户名 |
sysem_user() | 系统用户名 |
current_user() | 当前用户名 |
@@datadir | 数据库路径 |
@@version_compile_os | 操作系统版本 |
length() | 返回字符串长度 |
substr() | 截取字符串 |
mid()left() | 从左侧开始取字符 |
cancat() | 没有分隔符链接字符串 |
concat_ws() | 含有分隔符连接字符串 |
group_concat() | 连接一个组的字符串 |
ord() | 返回ASCII编码样式 |
ascil() | 转换为ASCII样式 |
md5() | 返回MD5(不可逆的加密方式) |
floor(x) | 返回不大于x的最大整数 |
round(x) | 返回参数接近x的整数 |
rand() | 返回0-1之间的随机浮点数 |
sleep() | 睡眠时间为指定的秒数 |
if(true,t,f) | if判断语句 |
2.重要的数据库
最常用的库是
information_schema
包含sql中所有数据库的信息
3.重要的表
代码 | 含义 |
---|---|
schemata | mysql中所有数据库信息 |
schema_name | 所有数据库名 |
tables | 记录数据库表中所有信息 |
table_name | 记录数据表名 |
table_schema | 记录数据库名 |
columns | 列信息 |
column_name | 字段名 |
四、 union注入
1.什么是union注入
union注入为联合查询语句合并两个或者多个sql语句结合起来,得到联合查询的结果
union注入是需要order by来判断,order by是在sql语句后面进行排序的通常我们用order by来判断字段有几位。
2.union注入的方法
举例:
select*from users where id=2 order by 3;
意思为查询id等于2的3字段,这里有个前提就是,需要表里字段和order by 后面的数字需要一致,才可以回显成功,所以说一般我们都用order by来判断表中有多少个字段,再进行判断字段名称。
实战心得
- 在url后加上单引号
'
判断是否存在注入 - 在url后加上
'#
判断是否实现正常 - 在url后加上
' and 1=1#
判断是否实现正常 - 在url后加上
' and 1=2#
判断注入类型 - 在url后加上
' and 1=1 order by 4#
判断字段有几个,如果报错说明小于4,依次递减判断,找到数据库字段数 - 在url后加上
' union select 1,2,3#
判断联合查询语句是否正确 - 在url后加上
id=888888'union select1,2,3#
判断是否回显出显示位,如果可以显示,说明可以通过位数查找数据库数据 - 构造函数
id=888888'union select1,database(),user()#
查找数据库中当前数据库名和用户名
五、总结
sql注入学的过程是很难得很痛苦的,学会之后就会很简单,所以希望各位技术友加油,咱们高处见。