前言
随着自己学习网络安全有段时间了,发现自己过于自信了,什么都学,什么都觉得自己懂了,掉过头来原理都记不住,无奈,只好从头开始整理,权当自己复习一遍了
一、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\是一个汉“運’”,这样的话,单引号前面的\就不起作用了ÿ