一天学会SQL注入

绪论

结构化查询语言(SQL):是一种特殊编程语言,用于数据库中的标准数据查询语言

SQL注入:是一种常见的WEB安全漏洞

SQL注入漏洞原理:
针对SQL注入的攻击行为可描述为通过用户可控参数中注入SQL语法,破坏原有SQL结构达到编写程序时意料之外结果的攻击行为。其成因可以归结外以下两个原因叠加造成的:(下面两点是漏洞产生的原因)
1、程序编写者在处理程序和数据库交互时,使用字符串拼接的方式构造SQL语句。
2、未对用户可控参数进行足够的过滤便将参数内容拼接进入到SQL语句中。注入点可能存在的位置

根据SQL注入漏洞的原理,在用户“可控参数”中注入SQL语法,也就是说Web应用在获取用户数据的地方,只要带入数据库查询,都有存在SQL注入的可能,这些地方通常包括:
GET数据
POST数据
HTTP 头部
Cookie数据

SQL注入的危害:
1.数据库信息泄漏:数据库中存放的用户的隐私信息的泄露。
2.网页篡改:通过操作数据库对特定网页进行篡改。
3.网站被挂马,传播恶意软件:修改数据库一些字段的值,嵌入网马链接,进行挂马攻击。
4.数据库被恶意操作:数据库服务器被攻击,数据库的系统管理员帐户被窜改。
5.服务器被远程控制,被安装后门。经由数据库服务器提供的操作系统支持,让黑客得以修改或控制操作系统。
6.破坏硬盘数据,瘫痪全系统。
7.一些类型的数据库系统能够让SQL指令操作文件系统,这使得SQL注入的危害被进一步放大。

分类

SQL注入漏洞根据不同的标准,有不同的分类。但是从数据类型分类来看,SOL注入分为数字型和字符型。
数字型注入就是说注入点的数据,拼接到SQL
语句中是以数字型出现的,即数据两边没有被单引号、双引号包括。
字符型注入正好相反。

根据注入手法分类,大致可分为以下几个类别。
@ UNION query SQL injection(可联合查询注入) 联合查询
@ Error-based SQL injection(报错型注入) 报错注入
@ Boolean-based blind SQL injection(布尔型注入) 布尔盲注
@ Time-based blind SQL injection(基于时间延迟注入) 延时注入
@ Stacked queries SQL injection(可多语句查询注入) 堆叠查询

MYSQL 相关

本课程内容主要使用*map环境,既然要探讨SQL
注入漏洞,需要对数据库有所了解,此处以mysql
为例,这里只是起到抛砖引玉的作用,其他数据库环境下的SQL
注入,读者可以按照本课程的思路去学习,唯一不同的只是数据库的特性。

mysql数据库的注释大概有以下几种。
#
– (杠杠空格)
/*… */
/*!.. */

mysql元数据库数据库information_schema(主要是存数据库名,表名,字段名等关系…)

information_schema
               |
               `-- tables
               |       |
               |       `-- table_name //表名
               |       |
               |       `-- table_schema  //表名所在的数据库名
               `-- columns
                       |
                       `-- column_name //字段名
                       |
                       `-- table_name //字段名所在表名
                       |
                       `--table_schema //字段名所在数据库名  

MYSQL 常用函数和参数

= | > | < >= | <= | <> 比较运算符
and | or 逻辑运算符
version() mysql数据库版本
user() 用户名
current_user() 当前用户名
system_user() 系统用户名
@@datadir 数据库路径
@@version_compile_os 操作系统版本

length() 返回字符串的长度
substring() | substr() | mid() 截取字符串
例如:substring(‘1234’,1,1)
1.截取的字符串
2.截取的起始位置,从一开始
3.截取长度

left() 从左侧开始取指定字符个数的字符串
concat() 没有分隔符的连接字符串
concat_ws() 含有分割符的连接字符串
group_conat() 连接一个组的字符串
ord() 返回ASCII码
ascii()
hex( ) 将字符串转换为十六进制
unhex() hex的反向操作
md5() 返回MD5值

floor(x) 返回不大于x的最大整数
round() 返回参数x接近的整数
rand() 返回0-1之间的随机浮点数
load_file() 读取文件,并返回文件内容作为一个字符串
sleep() 睡眠时间为指定的秒数
if(true,t,f) if 判断
find_in_set() 返回字符串在字符串列表中的位置
benchmark() 指定语句执行的次数
name_const() 返回表作为结果

SQL注入点判断

以下4个注入点难度是越来越难的,注入成本越高

?id=35--------------+1-1
//页面发生改变说明有SQL注入点

?id=35’-------------字符型还是数字型
//页面报错说明有SQL注入点

?id=35 and 1=1--------------是否有布尔类型状态
?id=35 and 1=2
页面显示是否不一样,不一样说明有布尔类型状态,也有SQL注入点

?id=35 and sleep(5)--------------是否有延迟
sleep(5) //意思是页面沉睡5秒,再相应,说明也有SQL注入点

四大基本手法

联合查询
报错注入
布尔盲注
延时注入

联合查询

由于数据库中的内容会回显到页面中来,所以我们可以采用联合查询进行注入。
联合查询就是SQL语法中的union select语句。该语句会同时执行两条select语句,生成两张虚拟表,然后把查询到的结果进行拼接。
select ~ union select~
由于虚拟表是二维结构,联合查询会"纵向”拼接,两张虚拟的表。

实现跨库跨表查询
*必要条件
1.两张虚拟的表具有相同的列数
2.虚拟表对应的列的数据类型相同

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值