百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

sql注入学习笔记2——基础知识(sql注入以及解决的办法)

toyiye 2024-07-08 00:33 10 浏览 0 评论

前记

之前小编给大家分享过Sql盲注学习笔记1

今天是sql注入学习笔记,基础知识篇,本文主要介绍sql注入当中的一些基础知识,包括一些重要的trick、文件操作、常用的函数(如字符串连接、截取、编码等函数)等,以及在中间会穿插很多细微的、比较少人留意到的一些tips知识点。

0x00 测试环境

先给出测试环境的数据库表

mysql> show variables like '%log_file%'; 查看日志文件存放位置,后续权限够的情况下,我们可能还会通过这个来拿webshell

0x01 一些重要的trick

0x011 查看日志文件存放位置

0x012 查看数据库编码情况

show variables like 'char%'; 查看编码情况

0x013 指定可外连的数据库用户和ip

这里的意思是允许root用户以这个密码,在任意ip上连,实际中肯定不能这样

mysql> grant all privileges on *.* to 'root'@'%' identified by 'admin' with grant option;

mysql> flush privileges;

0x014 关于mysql账号密码

mysql数据库的账号密码在mysql.user这个表中,MYSQL数据库的认证密码有两种方式,MYSQL 4.1版本之前是MYSQL323加密,MYSQL 4.1和之后的版本都是MYSQLSHA1加密,MYSQL数据库中自带Old_Password(str)和Password(str)函数,它们均可以在MYSQL数据库里进行查询,前者是MYSQL323加密,后者是MYSQLSHA1方式加密。

例如

mysql> select user,password from mysql.user ;

例如

| localhost | root |*81F5E21E35407D884A6CD4A731AEBFB6AF209E1B

查询出来的值只取*后面的内容拿去解密即

81F5E21E35407D884A6CD4A731AEBFB6AF209E1B

这个才是密文

要解密mysql中查出来的密码,可以在这个网站上解密

http://www.chamd5.org/

选择对应的mysql解密方法或者选择sha1解密都行

MYSQL 4.1版本之前的就选择mysql323这个解密方法

MYSQL 4.1和之后的版本就选择MySQL4.1/MySQL5+ (40 bytes)或者sha1都行

ps:

mysql> select user,authentication_string from user;

有些版本的数据库原有的密码字段名是这个

0x015 模糊匹配

rlike、regexp、like

其中rlike、regexp的用法都和php中正则的用法一模一样

like中使用%表示匹配任意个数的任意字符

匹配username中包含字母j的行

0x016 注释符

# 最普通的单行注释,实际渗透中最好用之前用url编码下,效果会更好,编码后的值为 %23

-- - 注意中间的空格哦

-- +

`` 在bypass一些比较老的waf可能还会有些用

/**/ 常规内联注释--可代替空格,绕过空格过滤

/*!*/

/*!50000 */ mysql 5通用,带版本内联注释

注意:多行注释符(在mysql下需要能闭合 才有效):/* */或` `(反引号)等

0x017 Mysql内置变量,搜集数据库信息时会用到

version() 当前数据库详细版本号,注意,针对mysql 4和5的注入方式是完全不一样的

database() 当前所在的数据库

user() 当前数据库用户权限

@@datadir 数据文件的存放目录

@@basedir 数据库的安装路径

@@version_compile_os 宿主系统平台是什么

@@hostname 当前机器的机器名,可不是域名哦

null 特殊工具,因为它可以匹配任意数据类型,在遍历字段个数时可能会用到

0x02文件操作(读写)

·文件写入--需要有写的权限,通常只有root有

一定要用绝对路径--限制了必须能使用引号

select * into outfile '绝对路径'

select * into dumpfile '绝对路径'

如果是dll,so,exe,必须二进制写,尝试导出udf时可能会用到

tips:

·可以使用16进制和char()来绕过对字符串关键字的过滤

至于使用char()函数来写入,我们可以使用python来辅助构造payload

将刚刚得到的hex放进python里面执行得到payload

关于绝对路径

linux和windows下都可以使用 /

windows下还可以使用 \\ 注意是两个反斜杠(即反斜杠要转义一下)

写入的文件必须是原来不存在的,若是原来已经存在了的文件,我们无法覆盖它写入,会产生一个错误

这里要注意我们使用char()和使用0x16进制的时候都不要加单引号,否则就当成一个字符串来写入了,而不会unhex处理,例如

文件读取--绝对路径

load_file(绝对路径)

0x03常用函数

字符串连接函数--3个

-----MySQL的concat和group_concat函数在连接字符串的时候,只要其中一个是NULL,那么将返回NULL(注意:group_concat也是这样,验证过了 5.x版本)

concat(str1,str2,str3...)中间只要字符串有一个为null,最后结果也为null,注意 ‘null’ 和 null 不一样(区别同 ‘1’ 和 1)

concat_ws(‘指定分隔符’,str1,str2,str3...)它会自动忽略中间的空值,只有分隔符为空,整体才返回空

group_concat(field_name1, field_name2, field_name3...)

把某个字段下的所有数据全部连接成一个字符串,注意有长度限制,默认1024,(默认使用逗号隔开)(不会受limit的限制)

实例测试如下

截取函数--5个

注意在mysql中的所有字符串截取操作[除了limit],默认都是从1开始的,并非像代码中的数组是从0开始的

substring(要截取的字符串,从什么地方开始截取,截取多长)

substr(要截取的字符串,从什么地方开始截取,截取多长)

mid(要截取的字符串,从什么地方开始截取,截取多长)

left(str,length)从左往右截取length个字符,左截取

right(str,length)从右往左截取length个字符,右截取

根据官方文档的描述substring和substr两者基本没有任何区别,所以一个被过滤了的时候可以使用另一个去替代。

而mid()是mysql 专有的字符串截取,也就是说只有在mysql中有,mssql和oracle以及pgsql中都没有。

Tips:

username第一行内容为mjc,长度为3,若截取第四个字符,则输出的ascii码值为0--对应的是null空字符--这个特点可以用于盲注的判断(这个以后讲)

select ascii(substring((select username from user limit 0,1),4,1));

字符串填充,跟代码中的字符串填充是一个意思,注意,如果被填充的位置原来有数据则会被直接覆盖,我们可利用这种方式来查数据

lpad(str,len,padstr)

rpad(str,len,padstr)

用字符串 padstr对 str进行左填充或者右边填充直至它的长度达到 len个字符长度,然后返回填充后的结果。

tips

如果 str的长度长于 len',那么它将被截除到 len个字符,所以可以用这个来代替字符串截断函数,绕过一些过滤了常规的字符串截断函数的waf

返回出现位置--可尝试配合上面的字符串截取函数在读取文件时用

ps:返回的位置从 1 开始

locate(substr,str)第一个语法返回字符串str第一次出现的子串substr的位置。

locate(substr,str,pos)第二个语法返回第一次出现在字符串str的子串substr的位置,从位置pos开始。 substr不在str中,则返回0。

字符串替换--在读取文件时,我们可能需要用到replace()替换一些特殊字符

replace(搜索字符串范围,替换前的子字符串,替换后的子字符串)

这是临时替换,返回替换后的内容,但并不改变原来的内容。

大小写转换,有时候为了减少我们的手工劳动量,可能就需要用到这种转换函数,尽可能的帮我们缩小范围

lower(字符串) upper(字符串)

返回对应的ascii码的函数--2个

ascii(单个字符)

ord(单个字符)

tips:

如果输入多个字符的话,返回第一个字符的ascii码

把指定的数字转换成对应的ASCII码字符,n久以前 bypasswaf的惯用招数,各类编码绕过waf也是最常见的一种方式

char(num)

进制转换函数--3个

16进制转换,导出udf的时候可能会用到

hex() unhex()

conv(num,from_base,to_base) 经常会用来绕过某些编码过滤

Conv(数字,进制1,进制2)返回 数字 从进制1 转为 进制2 的内容

mysql> select conv(11,10,16);

tips:hex()和unhex()都是从右到左读取字符的,如unhex(223)读取的是 23和2,而不是22和3 (0x23代表的是#)

case用法--相当于sql中的’switch’语句

case..when..then..when..then..else..end

语法:

CASE search_expression

WHEN expression1 THEN result1

WHEN expression2 THEN result2

...

WHEN expressionN THEN resultN

ELSE default_result

搜索CASE表达式,使用条件确定返回值.

语法:

CASE

WHEN condition1 THEN result1

WHEN condistion2 THEN result2

...

WHEN condistionN THEN resultN

ELSE default_result

END

tips

有一个类似php的弱比较的特性

0x04 统计(长度、记录)

统计字符串长度

length(字符串)

统计某个表下总共有多少条记录

count(*)

0x05 时间盲注常用函数+if

·时间盲注最常用的两个函数

benchmark(count,expr) 性能测试函数,意思就是执行expr count次

sleep(second) 定时休眠函数

if判断特性,常配合时间盲注一起使用

if(exp,a,b)--表达式exp为真则返回a,否则返回b

0x06 Information_schema数据库的结构+常规利用

(列schema_name跟其他两个表的table_schema是一样的,但名字不同,注意)

查询数据库名字的时候使用schemata表,查询table_name时使用tables表,查询column_name的时候使用columns表,这是有原因的!(重复性问题!在tips中详细说明)

查询所有的数据库名

查询test数据库中的表名

查询user2表的列名

tips

思考:information_schema.tables表中拥有table_schema字段,那为什么查询数据库名字的时候使用schemata表,而不使用tables表呢?

主要还是一个重复性的问题!看下面例子

例如我们使用tables表查询table_schema和使用schemata表查询schema_name

使用schemata表,结果很正常

使用tables表查,会看到很多重复的,这就是区别!

所以查询数据库名字的时候使用schemata表,查询table_name时使用tables表,查询column_name的时候使用columns表

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码