HTTP 头部信息注入小分析
在开始正文之前,请允许我用我小学语文水平的语言组织能力来介绍一下何为HTTP头部信息 众所周知,在请求web服务器过程中,会发送一个HTTP包,为应用层的数据包,在数据包中,有web服务器的IP地址,还有你请求的网站路径、文件,其他的就是你(用户)的数据,具体有什么看WEB需要你给什么,一般来说有以下内容
- 请求类型 分为POST/GET两种
- User-Agent 用户浏览器标识
- X-Forwarded-For 来源地址
- Cookie 用于验证用户信息
具体数据包长什么样可以看下图
那么正题开始,解释了什么是HTTP包后,下面的内容应该不算是什么难以理解的内容,HTTP包有一个部分,叫做头部信息(heards),也就是上面提到的User-Agent这些,在有的环境中,php可能会将这部分的部分内容放到sql查询语句中配合使用,若是这部分没有加防范,那么就可以通过伪造headers头部信息来完成注入
HTTP头部注入我稍微的分了两个类 第一类为通过构造会记录下来验证身份的如X-FORWARDED-FOR这类来绕过/查询 第二类为构造用户使用的应用程序的信息和用户的IP地址这类来绕过/查询
举个第一类的简单的例子
--------分割线--------
下面是一条php中的sql查询语句
$useripaddr=$_SERVER['HTTP_X_FORWARDED_FOR']
$req=mysql_query("select user,password from users where user=’$username’ and password=’$password’ and get_ip=’$useripaddr’);
上面这个php代码,假如xff内容没有做防护的话,就会导致get_ip这一部分被恶意利用 只需要通过将x-forwarded-for内容更改、构造sql语句就好了 例如heards中,X_FORWARDED_FOR :127.0.0.1′ or 1=1# 这样一来,sql查询语句就变成了
select user,password from users where user=’$username’ and password=’$password’ and get_ip=’127.0.0.1' or 1=1#’
第二类的例子就比较麻烦了,因为能举例出来的环境太多,而我又太懒,所以下面给个环境,全靠脑补
第一个PHP名为login.php,用于验证登录信息后返回cookie值 第二个PHP名为value.php,用于输出什么无关紧要的内容
在login.php中,有这么一个操作,若是验证过了用户名密码后,生成一个cookie,然后发送给value.php用户身份验证
生成用户cookie值
setcookie('ant[uname]',$_POST['username'],time()+36000);
setcookie('ant[password]',sha1(md5($_POST['password'])),time()+36000);
Value.php中,有这么一串代码用于查看是否有用户登录的cookie存在
$user_cookie=connect(); #接收login.php发送过来的cookie
$exist_user=check_sqli_login($user_cookie); #验证内容
if(!$exist_user){ #若没有cookie存在,则跳转到上一个登录界面中
header("location: login.php");
}
这类环境在进行查询或者写入操作时,会先判断你这个用户是否存在于数据库中,若存在,那么才会执行后面查询、写入这些操作
这种方法构造起来就更简单了,你只需要抓取一个登录成功的包,然后将用户名修改为sql注入语句 如 uname=admin 改为 uname=admin’ or 1=1# 这样sql语句就会被恶意注入成
select uname,password from users where username='admin'or 1=1#' and password='xxxxx';
于是就可以绕过了(这里是不正确示范,若真想万能密码绕过得输入一个不存在的用户名使其查询结果到or 1=1那边后得到结果为true就好了)
"头部注入秀就秀在他乱七八糟的"
- Spring历史版本变迁和如今的生态帝国
- Android中Services之异步IntentService
- 使用GitHub搭建个人博客
- 这个用来玩儿游戏的算法,是谷歌收购DeepMind的最大原因
- asp.net安全检测工具 --Padding Oracle 检测
- Android中Services简析
- VUE 入门基础(2)
- VUE 入门基础(1)
- AndroidManifest.xml配置文件 android.theme大全权限设置Android Permission中英对照
- Reactive框架:简化异步及事件驱动编程
- 微信跳一跳小游戏外挂分析
- 承载WCF 数据服务
- 常用正则表达式
- StreamInsight 基本概念
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 使用keras内置的模型进行图片预测实例
- PHP convert_cyr_string()函数讲解
- 在keras中model.fit_generator()和model.fit()的区别说明
- 浅谈matplotlib 绘制梯度下降求解过程
- Ajax+PHP实现的分类列表框功能示例
- keras实现图像预处理并生成一个generator的案例
- Django+RestFramework API接口及接口文档并返回json数据操作
- Yii2框架实现利用mpdf创建pdf文件功能示例
- PHP超低内存遍历目录文件和读取超大文件的方法
- PHP bin2hex()函数基础实例讲解
- Kears 使用:通过回调函数保存最佳准确率下的模型操作
- django form和field具体方法和属性说明
- 总结PHP中初始化空数组的最佳方法
- tensorflow使用CNN分析mnist手写体数字数据集
- PHP7 mongoDB扩展使用的方法分享