SQL注入详细讲解概括-GET注入、POST注入、HEAD注入

1、SQL注入流程

2、GET注入

3、POST注入

4、HEAD注入


一、SQL注入流程

  1、SQL注入流程

  · 寻找注入点—与数据库交互的地方,比如登录框,搜索框、URL地址栏、登陆界面、留言板等等

  · 判断是否存在注入点,判断数据库类型,确定注入方法

  · 构造特殊语句,查询数据库数据

二、GET注入

  1、What is GET注入

  要搞懂GET注入之前,先搞懂什么是GET传参。

  GET传参:用户输入的内容参数会被传到地址栏(URL栏),是通过GET的方式进行传参

  · 特点:传参内容可见,传参长度有限,标识“?”,输入的内容会可能被url编码

  GET注入:通过GET传参的方式,传输恶意语句,进行SQL注入

  

  2、如何进行GET注入

  一般情况判断为传参方式为GET传参方式,首先进行GET注入测试,判断是否存在GET注入

  如何判断是否存在GET注入:要想知道是否存在,首先搞原理,弄清楚是如何发生的

  简单说,原本程序要执行的代码拼接了用户输入的数据然后执行,就是本来用户输入的数据是要被查询的,但是被数据库当作代码执行

  OK,AND,只需知道输入的数据有没有被数据库当作代码,可以判断存不存在注入点

  AND,用户输入的数据一定不是输入everying都行的,如果用户随便输入的数据都被当做代码执行,那么这个网站就失去了它的功能,这是网站开发者不允许的

  SO,要输入什么数据才能被判断是否存在注入点呢

  先来看一段代码 

$query  = "SELECT first_name, last_name FROM users WHERE user_id = $id

用户输入参数传入$id  

来输入1  >>>>  $id=1    >>> sql语句就变成了下面这样
$query = "SELECT first_name, last_name FROM users WHERE user_id = 1 ok,look look 现在数据库收到的数据是这样的,,
SELECT first_name, last_name FROM users WHERE user_id = 1 AND,输入什么能够让数据库执行一些别的操作
思考ing time(3min) 当然是数据库语言了,,,试一试 or 怎么样
ok,, >>> 1 or 1=1 >>> $id=1 or 1=1 SELECT first_name, last_name FROM users WHERE user_id = 1 or 1=1 输入的内容当作代码执行了 //这个叫做整形闭合

    在来看一段,这次 把变量用引号引起来,用单引号or用双引号,是不一样的破解方法

$query  = "SELECT first_name, last_name FROM users WHERE user_id = '$id';"
上面双引号里的是要被传入数据库执行的 first,输入的数据被传入$id这个变量 ok,那么输入一个 1 ,$id=1 and 此语句就变成了: SELECT first_name, last_name FROM users WHERE user_id = '1' 那么要怎么做才能变成输入的数据变成代码执行呢?
思考ing time(5min) ok,无论输入什么数据他都在引号里,那输入的数据就没有任何意义对吧,
那就来突破引号,如何突破 ,,look here 》》 1' or 1=1 ' 》》 $id=1' or 1=1 ' 拼接试一试 SELECT first_name, last_name FROM users WHERE user_id = '1' or 1=1 ''
FUCK,,有问题了,,不一样了 //这个叫做单引号闭合

那么再来思考一个问题,当变量用双引号引起来怎么办,不是没用引号,也不是单引号
思考ing time(2min)

ok,easy 那就用双引号破解呗

SELECT first_name, last_name FROM users WHERE user_id = "$id"

look here 》》》 1" or 1=1 " 》》》 $id=1" or 1=1 "

SELECT first_name, last_name FROM users WHERE user_id = "1" or 1=1 ""

success,easy //这个叫做双引号闭合

  OK,上面是能看到后端代码的,哪个网站愿意让你看到他的后端代码,It won't

  AND,看不到源码,怎么进行注入呢

  so easy , 通过传入的恶意代码,观察页面情况 ,是否正常等,来判断是否存在注入点,确定注入方法

  首先我们找到传参点,进行注入 尝试 ,首先判断闭合类型

  SQL语句的闭合类型:整型闭合、单引号闭合、双引号闭合、单引号加括号、双引号加括号

  · 整形闭合 

1
SELECT FROM admin WHERE id=1;   //整形闭合

  模拟注入

  ?id=1'   =>  报错

  ?id=1''  =>  报错

  判断为整形闭合

  · 单引号闭合 

1
SELECT FROM admin WHERE id=‘1’;  //单引号闭合

  模拟注入

  ?id=1'  =>  报错

  ?id=1'' =>  正常返回id=1的值

  判断为单引号或者单引号括号闭合

  任何闭合方式都这样在没有遇到相对应的闭合时,都会把这个符号当作一个整体,注释符也不例外

  再次模拟注入

  ?id=1'-+  =>  无报错 => 单引号闭合

  ?id=1'-+  =>  报错  =>  单引号括号闭合

  · 双引号闭合 

1
SELECT FROM admin WHERE id="1";  //双引号闭合

  ?id=1'  => 正常返回id=1的值

  ?id=1" => 报错

  判断为双引号闭合或者双引号括号闭合

  再次模拟注入

  ?id=1"-+  => 无报错 => 双引号闭合

  ?id=1"-+ => 报错  =>  双引号括号闭合

  · 总结

  判断闭合类型

  首先尝试:?id=1'

       ?id=1"

  不报错 =>  整形闭合

  报错   =>  单引号报错 ,双引号不报错 => 尝试 ?id=1'-+  =>  无报错单引号闭合,报错单引号加括号闭合

  报错  =>  单引号不报错,双引号报错  =>  尝试 ?id=1"-+  =>  无报错双引号闭合,报错双引号加括号闭合

  

  注入点找到,确定闭合方式开始进行注入攻击,以DVWA靶场为例

  First,观察url栏 判断为GET传参,先进行正常内容输入,输入1 ,看返回结果

  

  第二步,测试是否存在注入,进行恶意语句测试,不知道闭合类型,先从整形闭合开始判断 1 and 1=1

  

  页面正常,与id=1 时返回的内容一样  不确定是否注入成功,因为and 1=1 恒成立 所以还得进行第二次判断,1 and 1=2

  

  页面正常,与id=1 时返回的内容一样,and 1=2 是恒不成立的,如果数据库执行了代码那么应该是没有数据返回的,现在返回了数据,so,不是整形闭合

  ok,既然不是整形闭合,那么去尝试是不是单引号闭合,输入   1',,,把错误显示出来了,说明是单引号闭合,既存在注入,又确定是单引号闭合,那么可以进行注入了。AND,我输入的是1'  为什么url的传参是1%27,这是因为get传参会被url编码,这个引号被url编码了,HTTP请求GET请求一般要进行URL编码,为什么呢,这是为了防止URL中的参数和HTTP中的一些参数冲突,导致奇异。

  

  OK,下面开始SQL注入

  First,已经找到注入点,判断出闭合类型,开始 通过恶意语句来获取数据库信息

  第一步,猜解字段数,用到语法:order by  X   当X大于字段数就会显错,小于或等于正常返回页面

  通过order by语句查出当前表有两个字段,为什么要先查字段数? 思考ing time(1min)

  answer >>>>  因为下面要想查数据库其他的内容,不可能再用当前表吧,得通过联合查询吧,那么联合查询的必要条件>>>多个表的字段数必须相同

  

  第二步,判断显位,why? 

  answer >>>一个表可能有多个字段,但是我们页面上看到的可能并不是表的字段的全部,开发者可能页面内容只输出指定的那几个字段,那是不是我们就看不到其他的字段呢,so,页面显示并不一定是全部字段。那我们就要判断出字段显位,同时也输出另一个表同样的显位,这样查询的信息才可能通过 显位 输出到页面。

  HOW?

  answer>>>有的网站,会规定这个显位,输出的数据指定是多少,如果开发者指定只能输出一条数据,那么联合查询好像也没什么作用了,因为联合查询是先输出前面表的数据,我们需要的是后面的表的数据,有遇到难题了。。。思考ing time(2min)

  ok,用联合查询,当一个表里没有查询到数据,那么不输出这个表的数据,,,,可不可以,前面的表不输出数据呢。。of course

  1.111111111111,1,998787,6.37176,90000.88877,,,,这些数据数据库里可以说是百年不会见吧,那我们去查他,是不是空?? of course

  ok,构建恶意语句>>>> 1.11114434' union select 1,2 #

  

  如上图,从第一步得知有两个字段,用来判显位,两个字段内容全部显示,当然这种情况的概率是非常小的

  ok,显位判断完毕

  第三步,查询当前数据库

  HOW?思考ing time(1min)

  database()函数

1.7274972' union select 1,database() #

  

  ok,显位已经判断完毕,下面才是刚刚开始

  第三步,对数据库里的库,表,字段,数据进行查询

  HOW?

  First,需要了解数据库,此靶场的数据库是MySQL,后续会写怎么识别数据库,常见数据库太多了,Oracle Database甲骨文公司、SQL Server微软公司、DB2IBM公司、PostgreSQL开源、MySQL开源、Access微软等等

  mysql在5.0以上版本加入了information_schema这个系统自带库,其中保存着关于mysql服务器所维护的其他数据信息,如数据库名,数据库的表,表栏的数据类型与访问权限,,这个库非常牛,,数据库所有的 库,表,字段的位置在这张表里都能找到

  information_scheam这个库下面有几个非常重要的表,必须知道的:

  information_schema.schemata  >>> 这个表保存了所有数据库里的库的信息

  

  information_schema.tables  >>>  这个表保存了数据库里所有表的信息

  

  information_schema.columns  >>> 这个表保存了数据库里所有的字段信息

  

  AND,,

  column_name 字段名

  table_name 表名

  schema_name 库名

  OK,基础知识已简单了解,怎么取通过这些知识注入呢,

  思考ing  time(5min)

  OK,Time out,,,

  Look here  >>>  上一步知道了联合查询,对不对,要查询数据库信息需要知道表名呀,现在已经知道了系统自带库、自带表,而且通过这几张表我们可以得到数据库任何数据

  OK,那下面就easy了,,,构建恶意语句,先看看,当前库存在哪些表

1.2223' union select 1,table_name from information_schema.tables where table_schema=database()  #

  >>>

  

  OK,当前数据库下的表's name有已经拿到,,定睛一看,,users,,这个表有点可疑呀,,user什么意思>>用户   

   SO,我们来看一下users表里有什么东西,来,上恶意代码

1.2333' union select 1,column_name from information_schema.columns where table_schema=database() and table_name='users'  #

  >>> 

  OK,字段名已经获取了,是不是有两个非常重要的数据>>>user  \   password

  SO,获取user and password 两个字段的数据   ,,,>>>  恶意代码,,,上

1.647' union select user,password from dvwa.users #

  >>>

  

  WC,NB,信息都出来,蓝框时用户名,绿框时密码,但仔细一看有点不对,,哪里不对

  password被加密了,MD5加密,,百度搜MD5解密,,把密码解出来,,so  easy

三、POST注入

  1、What is POST注入

  要搞懂POST注入,先搞懂POST传参

  POST传参:用户输入的内容被隐藏了起来,地址栏看不到

  特点:传参内容不可见,传参长度无限制

  POST注入:通过POST传参的方式,传输恶意语句,进行SQL注入,本质和GET注入是一样的

  

  如上图,所示,没有输入地方,只有选项框,最重要的一点是,地址栏不可见传参内容

  WC,这怎么搞,这怎么进行传参,TMD不按套路来

  那好吧,来搬个救兵吧  >>>>>  BURP  

  BURP来抓个包吧,既然地址栏不能显示传参内容,抓包总可以吧

  

  

  OK,,来来来,,传参内容出现了吧,,

  那就在burp里测试吧

  剩下的步骤就和GET注入一模一样了,修改传参内容

  OK,还是判断闭合类型,这里判断是整形闭合 >> 判断字段数 >> 判断显位 >> 查询数据库数据      so easy

  直接给出结果

  OK,很简单吧,再来一个全自动好不好,用工具Sqlmap来做,不懂原理用工具叫做Very low-end script boy 当我们懂了原理用工具那么我们就是 increase of efficiency

   OK,GET注入 AND  POST注入 到这就差不多了,是不是很简单,这是最基础的,一般网站可不会这么容易,讲这个只是一个入门,告诉大家SQL注入是如何发生的,从而更好 理解高级的SQL注入,一般网站会做很多防护和过滤,,比如过滤敏感字,像and/or/#/'/"  等等这些敏感字符很容易被网站过滤和拦截,,当然了,防护还有很多高级的防护,破解也有很多高级的破解

四、HEAD注入

  1、HEAD注入原理

  在传参的时候,将我们的数据构建在http头部

  利用了php的全局变量$_server获取用户的相关信息且将数据存入数据库,利用updatexml函数输入sql语句,返回信息

  通常HTTP消息包括客户机向服务器的请求消息和服务器向客户机的响应消息。这两种类型的消息由一个起始行,一个或者多个头域,一个只是头域结束的空行和可选的消息体组成。HTTP的头域包括通用头,请求头,响应头和实体头四个部分。每个头域由一个域名,冒号(:)和域值三部分组成。域名是大小写无关的,域值前可以添加任何数量的空格符,头域可以被扩展为多行,在每行开始处,使用至少一个空格或制表符。

  2、PHP超全局变量

  超全局变量

  php中许多预定义变量都是超全局变量,这意味着它们在一个脚本的全部作用域中都可用  

  $_REQUEST(获取GET/POST/COOKIE)COOKIE在新版本已经无法获取了
  $_POST(获取POST传参)
  $_GET(获取GET传参)
  $_COOKIE(获取COOKIE传参)
  $_SERVER(包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组)
  $_SERVER['HTTP_REFERER']获取referer请求头数据
  $_SERVER["HTTP_USER_AGENT"]获取用户相关信息,包括用户浏览器、操作系统等信息
  $_SERVER["REMOTE_ADDR"]浏览网页的用户ip

  User-Agent:服务器获取客户的操作系统,浏览器版本等,有些网站中会将获取的信息存入数据库中

  Cookie:身份信息、进行 session 跟踪而储存在用户本地终端上的数据,一般会加密.

  X-Forwarded-For:XFF头,代表客户端,HTTP的请求端真实的IP,有些网站的防注入功能会记录请求端真实IP地址并写入数据库,修改XXF头可虚假IP

  Rerferer:浏览器告诉WEB 服务器是从哪个页面链接过来的.

  Host:客户端指定访问的WEB服务器的域名/IP 地址和端口号

  

  3、updatexml()函数

  updatexml() 更新xml文档的函数

  语法:updatexml(目标xml内容,xml文档路径,更新xml内容)

  OK,这里看上去是去更新了xml文档,实际上在xml文档路径的位置写了子查询语句,然后输入特殊字符,之后因为不符合输入规则报错了,其实在报错的时候已经执行l子查询语句

  【xml文档路径 填写 :0x7e】

  concat()是拼接字符串函数

updatexml(1,concat(0x7e,(select database()),0x7e),1)

  why? 0x7e是16进制,MySQL字符串是支持十六进制的,有个前提:开头须写0x ,这就是告诉MySQL下面要开始十六进制了。而7e才是十六进制的内容,7e是个特殊符号,一定不符合路径规则

  OK,今天的就先到这里,断更了好久,今天多写点,最后感恩  

  

SQL注入详细讲解概括-GET注入、POST注入、HEAD注入的更多相关文章

  1. SQL注入原理讲解,很不错!

    SQL注入原理讲解,很不错! 原文地址:http://www.cnblogs.com/rush/archive/2011/12/31/2309203.html 1.1.1 摘要 日前,国内最大的程序员 ...

  2. 30 道 Vue 面试题,内含详细讲解(涵盖入门到精通,自测 Vue 掌握程度)

    前言 本文以前端面试官的角度出发,对 Vue 框架中一些重要的特性.框架的原理以问题的形式进行整理汇总,意在帮助作者及读者自测下 Vue 掌握的程度.本文章节结构以从易到难进行组织,建议读者按章节顺序 ...

  3. vue-cli 目录结构详细讲解

    https://juejin.im/post/5c3599386fb9a049db7351a8 vue-cli 目录结构详细讲解 目录 结构预览 ├─build // 保存一些webpack的初始化配 ...

  4. Android webservice的用法详细讲解

    Android webservice的用法详细讲解 看到有很多朋友对WebService还不是很了解,在此就详细的讲讲WebService,争取说得明白吧.此文章采用的项目是我毕业设计的webserv ...

  5. [iOS]数据库第三方框架FMDB详细讲解

    [iOS]数据库第三方框架FMDB详细讲解 初识FMDB iOS中原生的SQLite API在进行数据存储的时候,需要使用C语言中的函数,操作比较麻烦.于是,就出现了一系列将SQLite API进行封 ...

  6. auth权限认证详细讲解

    auth权限认证详细讲解 一.总结 一句话总结:四表两组关系,一个多对多(权限和用户组之间)(多对多需要3个表),一个一对多(用户和用户组之间) 1.实际上使用Auth是需要4张表的(1.会员表 2. ...

  7. spring的IOC和AOP详细讲解

    1.解释spring的ioc? 几种注入依赖的方式?spring的优点? IOC你就认为他是一个生产和管理bean的容器就行了,原来需要在调用类中new的东西,现在都是有这个IOC容器进行产生,同时, ...

  8. MySQL锁详细讲解

    本文章向大家介绍MySQL锁详细讲解,包括数据库锁基本知识.表锁.表读锁.表写锁.行锁.MVCC.事务的隔离级别.悲观锁.乐观锁.间隙锁GAP.死锁等等,需要的朋友可以参考一下   锁的相关知识又跟存 ...

  9. head标签详细讲解

    head标签详细讲解 head位于html网页的头部,后前的标签,并以开始以结束的一html标签. Head标签位置如图: head标签示意图 head包含标签 meta,title,link,bas ...

  10. 详细讲解nodejs中使用socket的私聊的方式

    详细讲解nodejs中使用socket的私聊的方式 在上一次我使用nodejs+express+socketio+mysql搭建聊天室,这基本上就是从socket.io的官网上的一份教程式复制学习,然 ...

随机推荐

  1. 【C语言进阶】atoi函数的模拟实现【C的深度解剖】超详细的解释和注释

    [C语言进阶]atoi函数的模拟实现[C的深度解剖]超详细的解释和注释 那么这里博主先安利一下一些干货满满的专栏啦! 作者: #西城s 这是我的主页:#西城s 在食用这篇博客之前,博主在这里介绍一下其 ...

  2. 云计算 - 负载均衡SLB方案全解与实战

    云计算 - 负载均衡SLB方案全解与实战,介绍SLB的核心技术.用户最佳实践.阿里云 SLB产品举例.应用场景. 关注[TechLeadCloud],分享互联网架构.云服务技术的全维度知识.作者拥有1 ...

  3. python实现百度贴吧页面爬取

    import requests class TiebaSpider: """百度贴吧爬虫类""" def __init__(self, ti ...

  4. Power BI 9 DAY

    图形决策树

  5. webgl 系列

    webgl 背景 工作所需... 目录 初识 WebGL 绘制一个点 三角形 变换矩阵和动画 渐变三角形 绘制猫 着色器语言

  6. Vue实现简单图书管理例子

    以下内容整理自网络. 说明 本例主要涵盖以下知识点: 数据绑定 条件与循环 计算属性 监听器 过滤器 常见数组和对象操作 vue生命周期 示例演示 代码 <!DOCTYPE html> & ...

  7. Android里使用AspectJ实现双击自定义注解

    创建注解 首先创建一个双击注解. import java.lang.annotation.ElementType; import java.lang.annotation.Retention; imp ...

  8. c2工具sliver的python客户端无法修改grpc超时时间的解决办法

    业务需要,调用了很多implants来执行对应系统上的命令, 但是无论怎么指定interactive.py中execute方法参数, 命令执行超时时间总是30. 后面通过扩展execute方法增加一个 ...

  9. Unity学习笔记--数据持久化XML文件(1)

    XML相关 Xml是可拓展标记语言,一种文件格式.我们使用xml来完成对数据持久化的存储.等待我们有一程序运行结束之后,将内存中的数据进行保存,(保存在硬盘/服务器)实现对数据的持久化存储. xml文 ...

  10. APScheduler可能遇到的问题

    uWsgi使用多进程模式启动Django项目,因此我们会有多个进程去执行这个定时任务,导致定时任务被重复执行.解决这个问题的方法,我们直接就会想到采用加锁的方式.第一个拿到锁的进程,执行定时任务,其余 ...