SQL注入
目录
SQL注入 1
一、 “or” “and” 2
二、 order by 2
三、 Where 3
四、 Union 4
五、 MySql注入常用函数 5
六、 MySql注入 – 基础 – 编码或变形hex() 7
七、 MySql注入 – 基础 – 编码或变形ascii() 8
八、 MySql注入 – 基础 – length()函数 9
九、 MySql注入 – 基础 – substring()函数和mid()函数 9
十、 MySql注入 – 字符串 – elt()函数 10
十一、 MySql注入 – 基础 – 字符串连接concat() 10
十二、 MySql注入 – 基础 – 字符串连接concat_ws() 10
十三、 MySql注入 – 基础 – group_concat() 11
十四、 MySql注入 – 报错注入 – rand() 11
十五、 MySql注入 – 报错注入 – extractvalue() 12
十六、 MySql注入 – 报错注入 – updatexml() 13
十七、 常用函数 – xml解析函数 – extractvalue 14
十八、 布尔型注入 14
十九、 时间延迟盲注 14
一、 “or” “and”
and:用于结合select中where子句,可用来判断注入点的是否存在引号和其值的类型(且)
or: 用于结合select中where子句,尝试全查询是or 1=1,的绝对条件(非)
二、 order by
- order by:SQL中用于排序,用法主要是:
order by 字段 / order by 字段所在列数
order by email = order by 4
排序方式有:DESC降序 ASC升序(默认ASC)
当order by 后面接的字段的数字超过了表中最大字段数,就会出现错误(可以用来判断表中的字段数量)
三、 Where
- MySQL数据库中的条件子句,用于获取符合条件的记录
WHERE 条件
里面存在逻辑判定符:
= :返回两个值是否相等,相等返回“true”
<> !=:两个都为不等于判断,不相等返回“true”
:大于,(A>B)返回
<:小于,(A<B)返回
=:大于或等于,(A>=B)
<=:小于或等于,(A<=B)
WHERE子句中还可以嵌套查询,子查询等等
四、 Union
- Union:连接查询语句,连接多个select查询语句显示在一个数据集中,但是条件为查询的字段数量和类型需要相互对应,第一张表的字段的字段名称为所有连接查询组合后的字段名称
(a)默认模式
select 语句。。。。。。
union
select 语句。。。。。。;
(b)ALL模式
select 语句。。。。。。
union all
select 语句。。。。。。;
五、 MySql注入常用函数
系统函数:
-
MySQL版本:versionI()
-
数据库用户名:user()
-
数据库名:database()
-
数据库路径:@@datadir
-
操作系统:@@version_compile_os
数据库管理
-
show database:查看所有的数据库名
-
use_name:切换数据库
-
show tables
MySQL常用注入- 爆库:select schema_name from information_schema.schemata;
2.爆表:select table_name from information_schema.tables where table_schema=‘information’
3.爆列:select column_name from information_schema.columns where table_name=“user” and table_schema=‘information’;
六、 MySql注入 – 基础 – 编码或变形hex()
-
十进制数字转十六进制
-
字符串转十六进制
-
十六进制转字符串:select concat(0x系类十六进制)
七、 MySql注入 – 基础 – 编码或变形ascii()
-
字符串转ascii码select ascii(‘字符’);
-
ascii转字符串select char(码值);
八、 MySql注入 – 基础 – length()函数
- length():获取字符串的长度
九、 MySql注入 – 基础 – substring()函数和mid()函数
- substring()/mid():获取选择字符串指定的内容
十、 MySql注入 – 字符串 – elt()函数
- elt():返回对应位置的字符串
- 语法
ELT(N,str1,str2,……)
如果N = 1,则返回str1; N = 2,则返回str2;以此类推
十一、 MySql注入 – 基础 – 字符串连接concat()
- concat():拼接函数,可以拼接字符串,也可以拼接字段
十二、 MySql注入 – 基础 – 字符串连接concat_ws()
- concat_ws():拼接函数,可以拼接字符串,也可以拼接字段,但是回指定参数之间的分隔符
CONCAT_WS(separator,str1,str2,…)
十三、 MySql注入 – 基础 – group_concat()
- group_concat():返回一个字符串结果,该结果由分组中的值连接组合而成
十四、 MySql注入 – 报错注入 – rand()
- rand():产生并返回一个0-1之间的随机浮点数
- floor:取值小于数字(非正数)的最大整数,负数取仅小于它的负整数
组合使用,返回一个3-12之间的随机整数
十五、 MySql注入 – 报错注入 – extractvalue()
- extractvalue() :对XML文档进行查询的函数
语法:extractvalue(目标xml文档,xml路径)
第二个参数 xml中的位置是可操作的地方,xml文档中查找字符位置是用 /xxx/xxx/xxx/…这种格式,如果我们写入其他格式,就会报错,并且会返回我们写入的非法格式内容,而这个非法的内容就是我们想要查询的内容
正常查询 第二个参数的位置格式 为 /xxx/xx/xx/xx ,即使查询不到也不会报错
select username from user where id=1 and (extractvalue(‘anything’,’/x/xx’))
使用concat()拼接 ‘ / ‘ 效果相同
当我们使用错误的语句时
select username from user
where id=1 and (extractvalue(‘anything’,concat(’~’,(select database()))))
以~开头的内容不是xml格式的语法,报错但是会出现库名
extractvalue()能查询字符串的最大长度为32,就是说如果我们想要的结果超过32,就需要用substring()函数截取,一次查看32位
十六、 MySql注入 – 报错注入 – updatexml()
- updatexml():更新xml文档的函数
语法updatexml(目标xml文档,xml路径,更新的内容)
当我们使用正常的语句时,不会报错
select username from user where id=1 and (updatexml(‘anything’,’/xx/xx’,‘anything’))
使用错误的语句出现报错,并出现信息
select username from user where id=1 and (updatexml(‘anything’,concat(’~’,(select database())),‘anything’))
十七、 常用函数 – xml解析函数 – extractvalue
同十六
十八、 布尔型注入
- 布尔型:页面只返回True和False两种类型页面。利用页面返回不同,逐个猜解数据
可以尝试一下的函数
Length()函数 返回字符串的长度
Substr()截取字符串
Ascii()返回字符的ascii码
sleep(n):将程序挂起一段时间 n为n秒
if(expr1,expr2,expr3):判断语句 如果第一个语句正确就执行第二个语句如果错误执行第三个语句
如length(database())>10判断数据库名的长度(1=)true 0=》false)
Select 1,count(*),concat(0x3a,0x3a,(select user()),0x3a,0x3a,floor(rand(0)2))a from information_schema.columns group by a;
count()计数 concat()连接字符 floor()重复数据,返回0,1两个值 group by 进行分组 rand(0)避免数据重复造成的错误
时间型:通过页面沉睡时间判断
通过 sleep()函数测试,通过if()和sleep()联合逐个猜解数据
十九、 时间延迟盲注
- 0x00 延迟注入定义
i. 延迟注入,是一种盲注的手法, 提交对执行时间铭感的函数sql语句,通过执行时间的长短来判断是否执行成功,比如:正确的话会导致时间很长,错误的话会导致执行时间很短,这就是所谓的高级盲注.SQLMAP、穿山甲、胡萝卜等主流注入工具可能检测不出,只能手工检测,利用脚本程序跑出结果。 - 0x01 延迟注入的函数
i. sleep() //延迟函数
ii. if(condition,true,false) //条件语句
iii. ascii() //转换成ascii码
iv. substring(“string”,strart,length) //mid()也一样,取出字符串里的第几位开始,长度多少的字符
v. If表达式:IF(expr1,expr2,expr3)
vi. 如果 expr1 是TRUE (expr1 <> 0 and expr1 <> NULL),则 IF()的返回值为expr2; 否则返回值则为 expr3
vii. Mid函数:MID(column_name,start[,length])
viii. - 0x02 延迟注入实列
i. 含有时间延迟注入代码
ii. 手工检查延迟注入
?username=root’ and sleep(5)#
?username=root’ and sleep(5) and ‘xRsl’=‘xRsl#
?username=root’ and If(ascii(substr(database(),1,1))=114,1,sleep(5))#
如果以上存在注入,会出现延时的情况