HTTP請求頭引發的注入問題 (SQL注入)
關於請求頭中注入問題的演示,這裡我寫了一些測試案例,用來測試請求頭中存在的問題。
我們常見的會發生注入的點有 Referer、X-Forwarded-For、Cookie、X-Real-IP、Accept-Language、Authorization,User-Agent
(1) HTTP Referer:是header的一部分,當瀏覽器請求網頁時,會自動攜帶一個請求來源,如果後端存在互動,則會引發注入問題的產生。
(2) User-Agent 請求頭,該請求頭攜帶的是使用者瀏覽器的標識資訊,如果此時帶入資料庫查詢,則同樣會觸發注入問題的產生。
(3) X-Forwarded-For:簡稱XFF頭,它代表客戶端,用於記錄代理資訊的,每經過一級代理(匿名代理除外),代理伺服器都會把這次請求的來源IP追加在X-Forwarded-For中
(4) Cookie:指某些網站為了辨別使用者身份、進行 session 跟蹤而儲存在使用者本地終端上的資料(通常經過加密)
(5) X-Real-IP:只記錄真實發出請求的客戶端IP。
(6) Accept-Language:請求頭允許客戶端宣告它可以理解的自然語言,以及優先選擇的區域方言
(7) HTTP_CLIENT_IP:該屬性是PHP內建屬性,同樣取得的是客戶端的IP,同樣可控,如果帶入資料庫,則會產生注入問題。
Usage-Agent 注入問題: Usagen-Agent是客戶請求時攜帶的請求頭,該頭部是客戶端可控,如果有帶入資料庫的相關操作,則可能會產生SQL注入問題.
create table User_Agent(u_name varchar(20),u_addr varchar(20),u_agent varchar(256)); <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf8"> <title>SQL 注入測試程式碼</title> </head> <body> <form action="" method="post"> 賬號: <input style="width:1000px;height:20px;" type="text" name="uname" value=""/><br> 密碼: <input style="width:1000px;height:20px;" type="password" name="passwd" value=""/> <input type="submit" name="submit" value="Submit" /> </form> <?php header("Content-type: text/html;charset=utf8"); error_reporting(0); $connect = mysqli_connect("localhost","root","12345678","lyshark"); if($connect) { if(isset($_POST['uname']) && isset($_POST['passwd'])) { $uname=$_POST['uname']; $passwd=$_POST['passwd']; $passwd = md5($passwd); $sql="select username,password FROM local_user WHERE username='$uname' and password='$passwd' LIMIT 0,1"; $query = mysqli_query($connect,$sql); if($query) { $row = mysqli_fetch_array($query); if($row) { // 獲取到使用者的Agent客戶請求體 $Uagent = $_SERVER['HTTP_USER_AGENT']; // REMOTE_ADDR 是呼叫的底層的會話ip地址,理論上是不可以偽造的 $IP = $_SERVER['REMOTE_ADDR']; echo "<br>歡迎使用者: {$row['username']} 密碼: {$row['password']} <br><br>"; echo "您的IP地址是: {$IP} <br>"; $insert_sql = "insert into User_Agent(u_name,u_addr,u_agent) values('$uname','$IP','$Uagent')"; mysqli_query($connect,$insert_sql); echo "User_Agent請求頭: {$Uagent} <br>"; } } } } ?> </body> </html>
登入成功後,才可以顯示你的客戶端資料,也就是先要完成登入。
登入成功後,會自動獲取客戶端的user_agent資訊,HTTP_USER_AGENT 屬性對我們來說可控,且通過insert語句帶入到了資料庫,此時我們可以構建注入語句。首先我們通過burp提交登入請求。
然後再登陸成功後,我們繼續增加註入語句,將其寫道user-agent上完成報錯注入。
修改agent驗證,可被繞過,此處的語句帶入資料庫變為了insert into User_Agent values('1)','u_addr','u_agent')
有時,不存在回顯的地方即使存在注入也無法得到結果.,但卻是一個安全隱患,需要引起重視.
IP來路引發的注入問題:
Referer 引發的注入問題:
Cookie注入問題: