SQL注入使用


前言

随着自己学习网络安全有段时间了,发现自己过于自信了,什么都学,什么都觉得自己懂了,掉过头来原理都记不住,无奈,只好从头开始整理,权当自己复习一遍了

一、OWASP10

在这里插入图片描述

二、SQL注入的原理

本质上是把用户输入的数据当代码进行执行
两个关键条件即:
1.用户能控制输入
2.原本程序要执行的代码与用户的输入进行了拼接
如执行以下代码:

$id = $_GET['id'];
$query = "select * from information where id = "id" limit 0,1";

变量id的值由用户提交,在正常情况下,假如用户输入的是1,那么SQL语句会执行:
select * from information where id = 1 limit 0,1

但是假如用户输入一段有SQL语义的语句,比如:
1 or 1 =1 %23

那么,SQL语句在实际的执行时就会如下:
select * from information where id = 1 or 1 = 1 %23

满足了上述条件,用户可以控制变量id,原本要执行的代码,拼接了用户的输入。

1.SQL常出现场景

在这里插入图片描述
一切可以与数据库进行交互的地方都有可能出现

2.SQL注入的分类

根据数据传输方式分为:GET型、POST型、COOKIE型。
根据数据类型分为:数字型、字符型。
根据注入模式分为:
基于联合查询的注入模式
基于报错的注入模式
基于布尔的盲注
基于时间的盲注
堆叠查询的注入模式

3.SQL注入的一般步骤

1.求闭合字符
2.选择注入模式
3.爆数据库
4.爆表名
5.爆列名
6.爆字段

三、mysql的一些基本

1.mysql中的注释风格

单行注释,#后直接加内容:select user();#this is a cmmect
单行注释,–后面需加空格:select user();-- this is a commect
多行注释,/**/中见可以跨行:

select user();/*this is a cmmect*/

或:

select user();/*this is a
 cmmect*/ +1;

2.mysql中的内联注释

select /*!user()*/;
或者
/*!50001 select user()*/;

内联注释是MySQL数据库为了保持与其他数据库兼容,特意新添加的功能 。
为了避免从MySQL中导出的SQL语句被其他数据库使用,它把一些 MySQL特有的语句放在 /*! … */ 中,这些语句在不兼容的数据库中使用时便不会执行。而MySQL自身却能识别执行。
/*50001 */表示数据库版本>=5.00.01时中间的语句才会执行。
在SQL注入中,内联注释常用来绕过waf。

3.mysql中的union联合查询

union 操作符用于拼接两个或者多select查询语句union中的每个查询必须拥有相同的列数
如:select 1 union select 2 union select 3;可以执行成功
但是select 1,2 union select 3;执行会报错

4.mysql中的 order by 语句

order by 语句用于根据指定的列对结果集进行排序。
order by语句默认按照升序对记录进行排序.

select * from information;  --正常显示结果
select * from infoemation order by 3; --以第三列结果进行升序排序

5.information_schema结构

在这里插入图片描述
所以语句select schema_name from information_schema.schemata; --查询的是information_schema.schemata中的schema_name,也就是数据库名
构造语句select table_name from information_schema.tables where table_schema ='xxxx '; --查询的是information_schema中数据库名为xxxx所有的表名,即查询information_schema.tables中table_schema=xxxx时的table_name 的数据
语句select column_name from information_schema.columns where table_schema = ‘zzz’ and ‘table_name’ = ‘zzzz’; --查询的是information_shcema.columns中字段所属数据库名为table_schema=zzz并且字段所属表名为table_name=zzzz的值

6.注释的应用

select user from student where id = 1 limit 0,1;
select user from student where id = 1 and 1=2 union select user() # limit 0,1;

攻击者注入一段包含注释符的SQL语句,将原来的语句的一部分注释,注 释掉的部分语句不会被执行

7.mysql常用的语句及函数

在这里插入图片描述
字符串连接函数
concat(str1,str2…)函数 直接连接
group_concat(str1,str2…)函数 使用逗号做为分隔符
concat_ws(sep,str1,str2…)函数 使用第一个参数做为分隔符

8.宽字节注入

当我们测试的时候,输入“%df‘”,这个时候如果php函数是使用的addslashes()的时候,会在冒号的前面加上’\’。也就变成了%df\’ 。对应的编码是%df%5c’.这时候网站字符集是GBK,MYSQL使用的编码也是GBK的话,就会认为%df\是一个汉“運’”,这样的话,单引号前面的\就不起作用了ÿ

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值