【摘要】 SQL Injection
攻击者通过WEB表单或URL、HTTP文件头等与后端数据库产生交互的地方,将自己探测并构造的SQL语句通过传输数据的方式,传入后影响并修改了后端原有的SQL语句功能的一种攻击方式,可以从外部对数据库内容进行直接检索或修改
产生原因:
程序员在编写代码的时候,没有对用户输入数据的合法性进行严格的判断和过滤本质: 数据和代码未分离…
SQL Injection
攻击者通过WEB表单或URL、HTTP文件头等与后端数据库产生交互的地方,将自己探测并构造的SQL语句通过传输数据的方式,传入后影响并修改了后端原有的SQL语句功能的一种攻击方式,可以从外部对数据库内容进行直接检索或修改
产生原因:
程序员在编写代码的时候,没有对用户输入数据的合法性进行严格的判断和过滤
本质: 数据和代码未分离,把数据当作代码来执行
危害:
因为直接和数据库挂钩,所以危害较大,
把人当作一台计算机,那SQL注入的危害相当于直接影响大脑
一般用来获取用户数据(常说的脱库),获取管理员账号密码,
修改网站数据,挂马,提权
注入类型:
按大类可分为数字型、字符型或者回显型,盲注型
这里我按注入特点来分类,这里我们只阐述原理,利用方法会在我的sqlilabs通关秘籍里
详细讲解
payload: 漏洞验证或漏洞利用的代码
union 注入
特点: 构造payload,使页面注入点有数据回显
使用场景: 页面注入点有数据回显
报错注入
特点:构造payload让信息通过错误提示回显出来
使用场景: 查询不回显数据,会打印错误信息
布尔盲注
特点: 页面既不会回显数据,也不会打印错误信息
只返回right或wrong,(这里的Right和Wrong特指两种相对的提示信息)
时间盲注
特点: 页面不会回显数据,也不会回显错误信息,语句执行也不提示真假
我们不能通过页面内容来判断,只能构造语句,通过页面响应时长,来
判断信息的真假性
DnsLog盲注
特点: 页面既不会回显数据,也不会显示错误信息
我们可以通过布尔盲注或时间盲注可以获取到数据
但是整个过程效率低下,需要发送很多请求判断,很容易触发安全设备的防护
这时可以使用DNS注入,减少请求,直接回显数据
DNS在解析时会留下日志,通过读取多级域名的解析日志,获取请求信息
利用MySQL的 LOAD_FILE函数可以发起请求
将sql语句查询内容,作为请求的一部分发送至DnsLog只要
对这一部分的语句进行构造就能实现有回显的注入
(只有Windows上才可以使用DnsLog盲注)
宽字节注入
特点: GBK编码处理编码过程时存在的问题,可构造数据消除转义
当开发人员对一些特殊字符进行转义时,我们无法通过原来的方法进行注入
在MySQL中使用GBK编码时,会认为两个字符为一个汉字
我们可以构造两个字符编码的拼接使得编码转义后被转义的字符不在受限既可进行注入
二次编码注入
特点: urldecode()PHP本身处理编码时,两者配合失误,可构造数据消灭转义
简单的说就是用户构造一串本不可以注入的数据,但提交后经过php的处理转义,使其变成一条攻击语句
二阶注入
分为两个步骤
一、插入恶意数据
第一次对数据库插入数据的时候,仅仅对其中的特殊字符进行了转义
在写入数据库的时候还是保留了原来的数据,但是数据本身包含恶意内容
二、引用恶意数据
在将插入数据存入到了数据库中之后,开发者就认为数据是可信的。在下一次
需要进行查询的时候,直接从数据库中取出了恶意数据,没有进行进一步的检验
和处理,这样就会造成SQL的二阶注入
漏洞挖掘点:
URL参数、HTTP包头、搜索框、页码框等
MySQL长用函数 :
system_user() 系统用户名
user() 用户名
current_user() 当前用户名
session_user() 连接数据库的用户名
database() 数据库名
version() 数据库版本
@@datadir 数据库路径
@@basedir 数据库安装路径
@@version_compile_os 操作系统
count() 返回执行结果数量
concat() 没有分隔符的连接字符串
concat_ws() 含有分隔符的连接字符串
group_concat() 连接一个组的所有字符串,并以逗号分隔
load_file() 读取本地文件
into outfile() 写文件
ascii() 字符串的ascii码值
ord() 返回字符串第一个字符的ASCII值
substr() 返回字符串的一部分
length() 返回字符串的长度
mid() 返回字符串的一部分
MySQL内置库查询语句
SELECT schema_name FROM information_schema.schemata 查库名
SELECT table_name FROM information_schema.tables WHERE table_schema='库名' 查表名
SELECT column_name FROM information_schema.columns WHERE table_name ='列名' 查列名
SElECT 列名 FROM 库名.表名 查数据
注意:
1.所有类型的sql注入,都基于查库、表、列语句
2.如果数据太多,导致无法返回查询结果:
查询场景:可利用limit限定返回的数量及位置,依次查询
回显数据的场景: group_concat()链接多个数据成为一条返回结果
3.在一些场景,想要快速获取数据,需借助工具,如: BurpSuite
注入点的判断
字符型和数字型的区别在于字符型需要闭合,闭合的情况可能是单引号、双引号、括号
当然数字型有时也需要闭合括号
注入点的判断核心:
构造真假结果的语句,进行注入测试,在语法正确的前提下可以任意构造,如果执行结果相反说明语句都被执行了并影响了原语句,说明存在注入漏洞
文章来源: blog.csdn.net,作者::~$BlackHat,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/qq_41883052/article/details/116838105