superforming的sql-labs大通关
第一部分(第1~10关)
第二部分(第11~16关)
第三部分(特殊的17关)
持续更新…continue…
提前声明
本文中的sql语句不可以直接复制到靶场中注入,因为编辑的时候不一定是用英语符号,直接复制可能不会注入成功。我写这一系列的博客,主要是记录的自己的学习心路,以及给后来者一些引导,所以这一系列是教程系得博客。这也让我不会在前面的关卡说太多注入的东西,毕竟学东西讲究一个循序渐进,所以前面几关注入的更多方法留待聪明的你自己发现。
(1)第11~17关有别与前十关的地方
<1>理论上的不同
客户端向服务端传送数据的方式有两种(get方式和post方式),前十关是以get方式请求网页并实现注入,而这一部分是以post方式。
- get与post方式基础不同在于在http请求报文中的位置不同,直接在url中的是get方式,这种方式不安全,同时因为服务器资源问题一般不超2k(理论上在http中没有规定必须小于2k)。
<2>实操中的不同
实际操作时,主要的不同方式在于
【1】若之前使用的是hacjbar则需要辅助工具进行注入(因为hackbar不会自动导入http请求数据),比如burpsuite(可以在上面抓包改post数据再发送数据)、HTTP header live(火狐小插件,用于获取http请求报文)、hackbar(以post方式发送http请求报文的)
【2】注释符不同,在前十关中注释方式是–+,而这一部分是#。这是因为不同的请求方式编码不同,导致注释方法不同。
(2)post方式的联合查询(第11、12关)
- 和之前说过的一样,这里只说明这一种方法,更多sql注入的方式,由聪明的你自己发现。
<1>观察源码推敲思路
附图为证
第11关
第12关
观察源码会发现,以post方式传进去的参数的值赋值给了uname、passwd,最终整合成了一个sql语句,根据这个语句我们可以发现,既可以在uname处注入也可以在passwd处注入。同时注意11关与12关的差别
是对值的包裹方式不同。
第11关的包裹方式:‘uname’、‘passwd’
第12关的包裹方式:(uname)、(passwd)
<2>以第十一关为例(第十二关类似第十一关,只需要将以下所讲的每一条语句中的包裹方式换成上面所推测出的各关的包裹方式)
我会讲不用hackbar怎么用,中间穿插上要是使用hackbar的方法
-
1.第一步:尝试登陆以发现注入类型及取得post部分(如果不用hackbar这一步就可以跳过一半了,只需要判断注入类型)
可以通过burpsuit抓包,或者firefox浏览器的插件实现(HTTP header live)得到请求数据,这里简单说一下HTTP header live的使用方法。
【1】(为hackbar准备,获取poat)首先打开插件,下载好插件以后就可以在左上角处找到,如下图红方框标记处
因为事先不可能看到源码,所以不知道在脚本中的标识符是怎么样的,也就需要在网页上的username和password处分别输入’Dumb‘‘Dumb’,这一步的作用是向服务器发送http请求,从而截取到以post发送的数据。http请求是由请求行,请求头部,请求数据组成,请求头部中的host里面有请求服务器的ip,因为服务器就是本地计算机所以直接在插件中找到ip是127.0.0.1的http请求,最后在请求数据中就可以找到以post发送的数据,如下图
uname=Dumb&passwd=Dumb&submit=Submit就是我们要的请求数据
【2】同时发现数据直接回显到了网页上,所以只需像第一部分第一类型那样,利用联合查询,既可以调取数据。 -
2.第二步(查看是否存在注入)
【1】用hackbar的话,导入url,点开post data,如下图
如果不用hackbar直接就可以在password或者username任意一处输入下文的内容即可。用hackbar的情况也是在post处的uname或者passwd任意两处输入下文内容即可。
下面将不再分开讲解,本文将以不用hackbar的方式说明
【2】如下图输入
没有报错证明存在注入 -
3.第三步(判断查询语句查询结果的列数)
在username处输入admin,在password中输入admin’ order by 数字 #(数字要从1开始逐个尝试,直到报错。最后则说明表里面有报错的数前一个的数的列数)
由下面两副图你会发现查询语句的回复中中一共有2列
+ 4.第四步(查库名)
在username处输入:admin,在password处输入:-admin’ union select 1,databse() #或者输入-admin’ union select 1,schema_name from information_schema.schemata limit 1,1#(同时需要注意admin前面的-是不可少的主要作用是使第一句的查询结果不要显示) -
5.第五步(查表名)
在username处输入admin,在password处输入的是-admin’ union select 1,group_concat(table_name) from information_schema.tables where table_schema=‘security’# -
6.第六步(查列名)
输入:-admin’ union select 1,group_concat(column_name) from information_schema.columns where table_name=‘users’#
- 7.第七步提取数据)
输入:-admin’ union select 1,group_concat(username) from users#和-admin’ union select 1,group_concat(password) from users(‘concat_ws’函数在post方式中不能用,这牵扯到另一种注入方式报错注入)
【1】usernametu图
【2】password图
(2)post方式的布尔盲注(第13~16关)
<1>集成环境中的源码分析
废话不多说,上图
- 第13关
- 第14关
- 第15关
- 第16关
看源码可以分析出,网页不再返回结果而是显示输入正确与否,所以要用布尔盲注。注入的地方可以是uname处也可以是passwd处包裹方式为:
第13关的包裹方式:(‘passwd’)、(‘uname’)
第14关的包裹方式:“passwd”、“uname”
第15关的包裹方式:‘passwd’、‘uname’
第16关的包裹方式:(“passwd”)、(“uname”)
<2>以第十三关为例(第十四、十五、十六关类似第十三关,只需要将以下所讲的每一条语句中的包裹方式换成上面所推测出的各关的包裹方式)
- 1.第一步(判断注入方式及准备活动,若不用hackbar则不需准备活动)
【1】判断注入方式
输入‘admin’‘admin’,以及‘admin’‘ad’,会得到如下图的图片
输入‘admin’‘admin’时得到:
输入‘admin’'ad’时得到:
从页面的回显可以发现,查询结果不会回显到网页上,但是回显sql语句正确与否和输入正确与否。
【2】准备活动和前面讲的一样,找到http请求中的请求数据,因为和查找方法相同,所以不再赘述。 - 2.第二步(判断是否存在注入)
和之前一样选择在password处注入,读者可以尝试在另一处注入。在username处输入:admin。在passwd处输入admin’)#得到
没有报错证明存在注入。 - 3.第三步(基于and的布尔盲注,兑现第一部分的承诺)
在username处输入:admin,在password处输入:admin’) and left((select database()),1)=‘s’#会得到肯定的回答
- 4.根据惯例,我说到这一步,屏幕前的你一定已经会了,毕竟这么聪明。
superforming的sql-labs大通关
第一部分(第1~10关)
第二部分(第11~16关)
第三部分(特殊的17关)
持续更新…continue…