XFF头注入原理分析

目录

 

 

前言:

 

正文

0x01:xff头源码以及形成

0x02    xff注入方式

第一种 union注入

           1)爆出库名

第二种 报错注入(updatexml & exctractvalue)


 

前言:

关于SQL注入还有好多种,前面写的都是基于mysql环境下,接下来会更新其他数据库该如何注入

但是前面的得认真观看,以及源码,运行流程,与形成

写完后将会写代码审计

预计路线

黑盒测试 -> 白盒测试(代码审计)-> 内网渗透 -> 等等,有可能会更新python写工具,也可能往二进制或者近源渗透

这上面是路线,我将会不断的更新。这样以后查资料就不会到处百度了。(博客所写,仅记录每天学习)

 

正文

0x01:xff头源码以及形成

<?php
  $con=mysqli_connect("localhost","root","root","test");
  if (mysqli_connect_errno())
  {
  	echo "连接失败: " . mysqli_connect_error();
  }
 
  if(getenv('HTTP_CLIENT_IP')) {
    $ip = getenv('HTTP_CLIENT_IP');
  } elseif(getenv('HTTP_X_FORWARDED_FOR')) {
    $ip = getenv('HTTP_X_FORWARDED_FOR');
  } elseif(getenv('REMOTE_ADDR')) {
    $ip = getenv('REMOTE_ADDR');
  } else {
    $ip = $HTTP_SERVER_VARS['REMOTE_ADDR'];
  }
 
  $result = mysqli_query($con,"select * from user where `ip`='$ip'");
  if (!$result) {
    printf("Error: %s\n", mysqli_error($con));
    exit();
  }
  $row = mysqli_fetch_array($result);
  echo $row['username'] . " : " . $row['password'];
  echo "<br>";
?>
 

这里遇到了一些预定义变量了,很陌生。但是不慌~~

然而一段if语句,只是获取客户端ip,可以点击这里进行查看

getenv(' HTTP_CLIENT_IP ')是获取当前客户端的IP 

如果你用代理服务器接访问的,,它记录的就是代理服务器的IP,而不是真实的用户IP

也就是说,这个ip地址可以进行伪造的

HTTP_CLIENT_IP:                    获取当前客户端的IP 

HTTP_X_FORWARDED_FOR: 浏览当前页面的用户计算机的网关

REMOTE_ADDR:                      浏览当前页面的用户计算机的ip地址

getenv() :                                   获取当前系统的环境变量

$HTTP_SERVER_VARS['REMOTE_ADDR']:它是将 tcp/ip 数据包中的 ip 提取出来供参考的

获取真实ip的php代码 点击 这里

也就说,这些ip并不可以获取到真实ip

首先是if判断

如果HTTP_CLIENT_IP 存在,则赋值给 $ip

如果 HTTP_X_FORWARDED_FOR 存在,则赋值 $ip

如果  REMOTE_ADDR  存在,则赋值 $ip

否则 赋值 tcp/ip数据包(也就是握手包)中的ip,给$ip

 

0x02 xff注入方式

xff注入的步骤与前面的 联合查询注入一样,同意也可以使用head注入,head前面解释过了。使用的是报错函数

xff注入的两种手法

第一种 union注入

首先是使用union注入,这里需要闭合掉单引号,否则会报错

我们首先伪造个xff头,这时候我们对比2图。发现获取的ip都不一样。这时候就可以进行xff头注入

X-Forwarded-for: 127.0.0.1

 

1)爆出库名

首先进行and 1=1 & and 1=2判断。发现回显在意料之中,

然后再使用 order by 判断字段数即可

 

跟前面的一样,没啥区别,成功的爆出了库名,库名为test

这时候就是查询表名了。因为和前面的一样,所以我就不演示了,只是传参方式不一样

X-Forwarded-for: 127.0.0.1' and 1=2 union select 1,database(),3#

 

 

第二种 报错注入(updatexml & exctractvalue)

因为报错注入无需判断字段啥的,所以就直接的酱紫了

X-Forwarded-for: 127.0.0.1' and updatexml(1,concat(0x7e,(database()),0x7e),1)#

这里的话也可以使用另外一个函数 exctactvalue()

X-Forwarded-for: 127.0.0.1' and exctractvalue(1,concat(0x7e,(database()),0x7e))#

当然,这边的话报错注入有十个,记住一些常用的就好。记不住就百度

嘿嘿

 

文末:

似乎没啥好说的,xff和前面的一样。接下来更新数据库注入了

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章