MySQL注入天书学习之一

1、系统函数:
Version() --数据库版本
User()—当前用户
Database()—数据库名
@@datadir—数据库路径
@@version_compile_os—操作系统版本

2、字符串连接函数:
Concat(str,str,…) 无分隔符连接函数
Concat_ws(separator,str,str,…) 含分隔符连接函数
group_concat(str1,str2,…) 连接一个组的所有字符串,并以逗号分隔每一条数据

3、关于优先级:
在SQL语句中and的优先级高于or,举个例子:
User=’admin’ and password=’’ or 1=1
And操作之后条件为假,再进行或运算得到结果为真。

① Select * from users where id=1 and 1=1;
②Select * from users where id=1 && 1=1;
③Select * from users where id=1 & 1=1; 上述三者有什么区别?
①和②是一样的,表达的意思是 id=1 条件和 1=1 条件进行与运算。
③的意思是 id=1 条件与 1 进行&位操作, id=1 被当作 true,与 1 进行 & 运算 结果还是 1, 再进行=操作,1=1,还是 1(ps:&的优先级大于=) Ps:此处进行的位运算。我们可以将数转换为二进制再进行与、或、非、异或等运算。必要的时候可以利用该方法进行注入结果。例如将某一字符转换为 ascii 码后,可以分别与 1,2,4,8,16,32.。。。进行与运算,可以得到每一位的值,拼接起来就是 ascii 码值。再从 ascii 值反推回字符。(运用较少)
举个栗子:
select ASCII(‘a’) & 128 结果为0 表示a的第八位为0
select ASCII(‘a’) & 64 结果为64 表示a的第七位为1
select ASCII(‘a’) & 32 结果为32 表示a的第六位为1
select ASCII(‘a’) & 16 结果为0 表示a的第五位为0
.。。。。。。。

4、数据存储结构:
1、desc users 可以查看users表的结构,包括字段名,类型等等
MySQL注入天书学习之一
关于字符串截取函数:

此函数为截取字符串一部分。MID(column_name,start[,length])
MySQL注入天书学习之一
substr()函数
Substr()和substring()函数实现的功能是一样的,均为截取字符串。
string substring(string, start, length)
string substr(string, start, length)
参数描述同mid()函数,第一个参数为要处理的字符串,start为开始位置,length为截取的长度。

Left()函数
Left()得到字符串左部指定个数的字符
Left ( string, n )
MySQL注入天书学习之一
Sql用例:
(1) left(database(),1)>’a’,查看数据库名第一位,left(database(),2)>’ab’,查看数据库名前二位。
(2) 同样的string可以为自行构造的sql语句。
同时也要介绍ORD()函数,此函数为返回第一个字符的ASCII码,经常与上面的函数进行组合使用。
例如ORD(MID(DATABASE(),1,1))>114 意为检测database()的第一位ASCII码是否大于114,也即是‘r’

基于报错的SQL盲注
1、 payload:
select 1,count(*),concat(0x3a,0x3a,(select user()),0x3a,0x3a,floor(rand(0)*2)) a from information_shema.columns group by a;
2、 原理分析:
原理应该是利用动态数据分组计数产生错误来实现报错。
a、 首先理解group by a:select (rand(0)*2)a
MySQL注入天书学习之一
可以看到a当成了列名,这个就可以解释根据a进行group by了。
b、floor(rand(0)*2)用于尝试随机数,当对产生的这个随机数进行分组时就有可能报错:
SELECT floor(rand(-1)*2)a from information_schema.columns:用于产生大量随机数列
MySQL注入天书学习之一
SELECT (floor(rand(0)*2))a from information_schema.columns group by a:当不进行计数操作时不会报错,可以正常进行分组
当进行计数操作时,这个随机产生的值先分组,再计数,就会产生错误:
MySQL注入天书学习之一
MySQL注入天书学习之一
当使用0和-1进行随机数生成时就会产生错误,但是使用大于0的数就可以正常输出。
MySQL注入天书学习之一
报错呢就是利用这个group by的排序字段进行的,利用concat连接要查询的字段和这个随机数,当group by和count计数出错时就会一起报错显示了。
MySQL注入天书学习之一
实际的报错原因还是因为随机数排序与统计。
3、 基于xpath的报错函数:extractvalue mysql 对 xml 数据进 行查询和修改的 xpath 函数,xpath 语法错误
MySQL注入天书学习之一
Updatexml函数与上面函数同原理:
MySQL注入天书学习之一
mysql 重复特性,此处重复了 version,所以报错。

MySQL注入天书学习之一

基于UPDATE与的SQL注入:
MySQL注入天书学习之一
几个过滤函数:
Addslashes():函数返回在预定义字符之前添加反斜杠的字符串
stripslashes():函数删除由 addslashes() 函数添加的反斜杠
mysql_real_escape_string():函数转义 SQL 语句中使用的字符串中的特殊字符

基于INSERT与HTTP请求头的注入
基于INSERT此类的注入,最好采用基于报错的注入方式或者基于时间的盲注,要产生明显的差异,便于分别是否存在注入,以及注入是否成功。
MySQL注入天书学习之一
采用上述子查询的方式注入,整个语句完全正确,注入之后无法得到相关信息。
MySQL注入天书学习之一
上述采用基于时间的盲注。
MySQL注入天书学习之一
感觉xml函数存在长度限制,无法读取全部数据:
MySQL注入天书学习之一