2023年8月1日发(作者:)

SQL注⼊详细讲解概括-GET注⼊、POST注⼊、HEAD注⼊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 = 1ok,look look 现在数据库收到的数据是这样的,,SELECT first_name, last_name FROM users WHERE user_id = 1AND,输⼊什么能够让数据库执⾏⼀些别的操作思考ing time(3min)当然是数据库语⾔了,,,试⼀试 or 怎么样

ok,, >>> 1 or 1=1 >>> $id=1 or 1=1SELECT 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语句的闭合类型:整型闭合、单引号闭合、双引号闭合、单引号加括号、双引号加括号  · 整形闭合 1SELECT

* FROM

admin WHERE

id=1; //整形闭合  模拟注⼊  ?id=1' => 报错  ?id=1'' => 报错  判断为整形闭合  · 单引号闭合 1SELECT

* FROM

admin WHERE

id=‘1’; //单引号闭合  模拟注⼊  ?id=1' => 报错  ?id=1'' => 正常返回id=1的值  判断为单引号或者单引号括号闭合  任何闭合⽅式都这样在没有遇到相对应的闭合时,都会把这个符号当作⼀个整体,注释符也不例外  再次模拟注⼊  ?id=1'-+ => ⽆报错 => 单引号闭合  ?id=1'-+ => 报错 => 单引号括号闭合  · 双引号闭合 1SELECT

* 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.1,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_ta >>> 这个表保存了所有数据库⾥的库的信息    information_ >>> 这个表保存了数据库⾥所有表的信息  

  information_s >>> 这个表保存了数据库⾥所有的字段信息    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_ where table_schema=database() #  >>>  

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

   SO,我们来看⼀下users表⾥有什么东西,来,上恶意代码1.2333' union select 1,column_name from information_s where table_schema=database() and table_name='users' #   >>> 

  OK,字段名已经获取了,是不是有两个⾮常重要的数据>>>user password  SO,获取user and password 两个字段的数据 ,,,>>> 恶意代码,,,上1.647' union select user,password from #  >>>  

  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,今天的就先到这⾥,断更了好久,今天多写点,最后感恩  

  

2023年8月1日发(作者:)

SQL注⼊详细讲解概括-GET注⼊、POST注⼊、HEAD注⼊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 = 1ok,look look 现在数据库收到的数据是这样的,,SELECT first_name, last_name FROM users WHERE user_id = 1AND,输⼊什么能够让数据库执⾏⼀些别的操作思考ing time(3min)当然是数据库语⾔了,,,试⼀试 or 怎么样

ok,, >>> 1 or 1=1 >>> $id=1 or 1=1SELECT 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语句的闭合类型:整型闭合、单引号闭合、双引号闭合、单引号加括号、双引号加括号  · 整形闭合 1SELECT

* FROM

admin WHERE

id=1; //整形闭合  模拟注⼊  ?id=1' => 报错  ?id=1'' => 报错  判断为整形闭合  · 单引号闭合 1SELECT

* FROM

admin WHERE

id=‘1’; //单引号闭合  模拟注⼊  ?id=1' => 报错  ?id=1'' => 正常返回id=1的值  判断为单引号或者单引号括号闭合  任何闭合⽅式都这样在没有遇到相对应的闭合时,都会把这个符号当作⼀个整体,注释符也不例外  再次模拟注⼊  ?id=1'-+ => ⽆报错 => 单引号闭合  ?id=1'-+ => 报错 => 单引号括号闭合  · 双引号闭合 1SELECT

* 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.1,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_ta >>> 这个表保存了所有数据库⾥的库的信息    information_ >>> 这个表保存了数据库⾥所有表的信息  

  information_s >>> 这个表保存了数据库⾥所有的字段信息    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_ where table_schema=database() #  >>>  

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

   SO,我们来看⼀下users表⾥有什么东西,来,上恶意代码1.2333' union select 1,column_name from information_s where table_schema=database() and table_name='users' #   >>> 

  OK,字段名已经获取了,是不是有两个⾮常重要的数据>>>user password  SO,获取user and password 两个字段的数据 ,,,>>> 恶意代码,,,上1.647' union select user,password from #  >>>  

  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,今天的就先到这⾥,断更了好久,今天多写点,最后感恩